[libcxx-commits] [PATCH] D101948: [libc++] Future-proof std::copy for ranges

Louis Dionne via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Wed May 5 15:08:18 PDT 2021


ldionne added a subscriber: rarutyun.
ldionne added a comment.

I am putting this up as a strawman because we will need to go through all of the algorithms and do something similar at some point (before we implement the `ranges::` algorithms).

Basically, we could apply a similar change to all algorithms that require it so that we're ready to implement the `ranges::` version when the time comes. Here's how we would implement `ranges::copy`:

  template<std::input_iterator I, std::sentinel_for<I> S, std::weakly_incrementable O>
    requires std::indirectly_copyable<I, O>
  constexpr ranges::copy_result<I, O> copy( I first, S last, O result ) {
    auto [r1, r2] = _VSTD::__copy(first, last, result);
    return {r1, r2};
  }
  
  template< ranges::input_range R, std::weakly_incrementable O >
    requires std::indirectly_copyable<ranges::iterator_t<R>, O>
  constexpr ranges::copy_result<ranges::borrowed_iterator_t<R>, O> copy(R&& r, O result) {
    return ranges::copy(ranges::begin(r), ranges::end(r), result);
  }

This avoid duplicating any of the actual code in the copy algorithm. That doesn't represent *that much* for `std::copy`, but for other algorithms it'll be more significant, so we want to have a mechanical way of doing it. For algorithms that take a projection, we can implement the internal algorithm taking a projection and simply pass an identity function to implement the regular `std::` algorithm. There are still some issues to think about with this approach, notably that we're copying/moving iterators around a lot more than we used to, which may or may not be a problem depending on whether iterators are cheap to copy.



================
Comment at: libcxx/include/__algorithm/unwrap_iter.h:88
+std::pair<_OrigIter1, _OrigIter2>
+__rewrap_iters(std::pair<_OrigIter1, _OrigIter2> __its,
+               std::pair<_UnwrappedIter1, _UnwrappedIter2> __results)
----------------
This is pretty terrible, and we'll need to introduce one for algorithms that return triples.

I think we should probably write our own little `in_out_result` and `in_in_out_result` pre-C++20 to avoid depending on `pair` here.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D101948



More information about the libcxx-commits mailing list