[libcxx-commits] [PATCH] D127049: [libc++] Unwrap reverse_iterator<reverse_iterator<Iter>> in __unwrap_iter

Louis Dionne via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Thu Jun 9 08:22:19 PDT 2022


ldionne requested changes to this revision.
ldionne added inline comments.
This revision now requires changes to proceed.


================
Comment at: libcxx/include/__algorithm/unwrap_iter.h:14
 #include <__memory/pointer_traits.h>
 #include <iterator>
 #include <type_traits>
----------------
We should include `__iterator/iterator_traits.h` here instead, and then specialize `__unwrap_iter_impl` for `reverse_iterator<reverse_iterator<T>>` from `reverse_iterator.h`. That way, we don't need to pull the whole world into `unwrap_iter.h`, and we don't need to overload `__unwrap_iter(...)`, which wasn't meant for that (we used to overload it but then we moved to specializing `__unwrap_iter_impl` as a customization point instead).


================
Comment at: libcxx/include/__algorithm/unwrap_iter.h:104-108
+_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR
+_OrigIter __rewrap_iter(_ReverseWrapper<_OrigIter> __iter1, _UnwrappedIter __iter2) {
+  return std::__rewrap_iter<_OrigIter, _ReverseWrapper<_UnwrappedIter>, _RewrapCount - 1>(
+    __iter1, _ReverseWrapper<_UnwrappedIter>(reverse_iterator<_UnwrappedIter>(__iter2)));
 }
----------------
I think it would be cleaner not to reuse the same `__rewrap_iter` overload set for this. We could have one "top level" entry point for `reverse_iterator<reverse_iterator<...>>` and then use a helper function to do the actual rewrapping.

One motivation for this is that I'd like to move to a specialization based customization point for this as well in the future.


================
Comment at: libcxx/test/libcxx/algorithms/alg.modifying.operations/copy.pass.cpp:220
+  test_reverse_reverse_output<NotIncrementableIt<S>>();
 
   return true;
----------------
Since we handle more than 2 layers of `reverse_iterator`, we should test it.


================
Comment at: libcxx/test/libcxx/algorithms/unwrap_iter.pass.cpp:1
+//===----------------------------------------------------------------------===//
+//
----------------
`libcxx/test/libcxx/iterators/<something>.pass.cpp`?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D127049/new/

https://reviews.llvm.org/D127049



More information about the libcxx-commits mailing list