This is an automated email from the ASF dual-hosted git repository.
tqchen pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tvm-ffi.git
The following commit(s) were added to refs/heads/main by this push:
new 14f3c82 [Fix] fix iterator behavior (#218)
14f3c82 is described below
commit 14f3c82e00019a87ec1e58fd92ac172a5c9bc69f
Author: DarkSharpness <[email protected]>
AuthorDate: Tue Nov 4 10:03:32 2025 +0800
[Fix] fix iterator behavior (#218)
According to
[cppreference](https://en.cppreference.com/w/cpp/named_req/InputIterator.html),
the return type of the dereferenced iterator must be equivalent to the
`reference_type`.
Before this PR, the IterAdapter does not adhere to legacy iterator,
which may potentially leads to undefined behavior when used with STL
components(in my case, `std::make_move_iterator`) . We just fix this in
this PR.
---
include/tvm/ffi/container/container_details.h | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/include/tvm/ffi/container/container_details.h
b/include/tvm/ffi/container/container_details.h
index 3e3d267..397209f 100644
--- a/include/tvm/ffi/container/container_details.h
+++ b/include/tvm/ffi/container/container_details.h
@@ -176,8 +176,8 @@ class IterAdapter {
public:
using difference_type = typename
std::iterator_traits<TIter>::difference_type;
using value_type = typename Converter::ResultType;
- using pointer = typename Converter::ResultType*;
- using reference = typename Converter::ResultType&;
+ using pointer = const typename Converter::ResultType*;
+ using reference = const typename Converter::ResultType;
using iterator_category = typename
std::iterator_traits<TIter>::iterator_category;
explicit IterAdapter(TIter iter) : iter_(iter) {}
@@ -223,7 +223,7 @@ class IterAdapter {
bool operator==(IterAdapter other) const { return iter_ == other.iter_; }
bool operator!=(IterAdapter other) const { return !(*this == other); }
- const value_type operator*() const { return Converter::convert(*iter_); }
+ reference operator*() const { return Converter::convert(*iter_); }
private:
TIter iter_;
@@ -239,8 +239,8 @@ class ReverseIterAdapter {
public:
using difference_type = typename
std::iterator_traits<TIter>::difference_type;
using value_type = typename Converter::ResultType;
- using pointer = typename Converter::ResultType*;
- using reference = typename Converter::ResultType&; // NOLINT(*)
+ using pointer = const typename Converter::ResultType*;
+ using reference = const typename Converter::ResultType;
using iterator_category = typename
std::iterator_traits<TIter>::iterator_category;
explicit ReverseIterAdapter(TIter iter) : iter_(iter) {}
@@ -275,7 +275,7 @@ class ReverseIterAdapter {
bool operator==(ReverseIterAdapter other) const { return iter_ ==
other.iter_; }
bool operator!=(ReverseIterAdapter other) const { return !(*this == other); }
- const value_type operator*() const { return Converter::convert(*iter_); }
+ reference operator*() const { return Converter::convert(*iter_); }
private:
TIter iter_;