| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
C++ iterators basically model pointers. Hence a const pointer can still be dereferenced to a mutable object (`T * const` *not* `const T*`). This is not true for many iterators in itertools since they only have non-`const` versions of `operator*`. This also violates C++ iterator concepts, see [the github issue](ryanhaining#91). This change basically replaces all non-`const` dereference operators with `const` ones. This was straight forward in most cases: - Some iterators own the data they return (note: that probably violates [`LegacyForwardIterator`](https://en.cppreference.com/w/cpp/named_req/ForwardIterator)). So those data fields were changed to `mutable`. - `GroupBy` advances the group while dereferencing. This does not work when the iterator is constant. Moved the advancing to the constructor and increment operators. This is the only real behavior change, please review carefully.
Just specializing on `T*` misses cv-qualified pointer types like `int *const`. This change uses `std::is_pointer_v` instead to determine whether a type is a pointer.
There was a problem hiding this comment.
thanks for working on this
I'm not sure how you formatted but clang-format -i --style=file $filename will match the existing style.
As-written I can't merge this without breaking existing uses because if anyone's sub_iter_ only has a non-const operator* then it breaks. I know that's arguably the fault of the caller, but we can't break them, and those uses do exist.
I believe the combinatoric ones can be changed to return const references rather than holding a mutable member.
groupby is the most complex tool and I will need more time to convince myself everything is okay with this change
Sorry, something went wrong.
| Back | FazBrowse Home | New Git URL |
C++ iterators basically model pointers. Hence a const pointer can still be dereferenced to a mutable object (T * const not const T*). This is not true for many iterators in itertools since they only have non-const versions of operator*. This also violates C++ iterator concepts, see the github issue.
This change basically replaces all non-const dereference operators with const ones. This was straight forward in most cases:
Fixes #91 .