[LLVMdev] [cfe-dev] C++11 reverse iterators (was C++11 is here)

Duncan P. N. Exon Smith dexonsmith at apple.com
Tue Mar 4 21:26:18 PST 2014


On 2014 Mar 4, at 20:23, Chandler Carruth <chandlerc at google.com> wrote:

> On Tue, Mar 4, 2014 at 8:07 PM, Duncan P. N. Exon Smith <dexonsmith at apple.com> wrote:
> There’s a decent selection of range adaptors in Boost.Range [1].  I’m not sure the license [2] allows copying the source (IANAL), but any reason not use the same names?  I don’t see any reason to reinvent the wheel here.
> 
> Because I think that algorithms (and functions more generally) should be verbs. The names will be very similar all the same.

I agree.  Algorithms should be verbs.

However, I disagree that range adaptors are algorithms.

“reverse” sounds like an algorithm.  Consider, from the STL:

    template <class Iterator> void reverse(Iterator F, Iterator L);

I’d expect a range version of the algorithm to look like this:

    template <class Range> void reverse(Range &R) {
      reverse(std::begin(R), std::end(R));
    }

On the other hand, “reversed” sounds like an accessor, and I’d expect it to look something like this:

    template <class Range> reversed_range<Range::iterator>
        reversed(Range &R) {
      return make_range(make_reverse_iterator(std::end(R)),
                        make_reverse_iterator(std::begin(R)));
    }
    template <class Range> reversed_range<Range::const_iterator>
        reversed(const Range &R) {
      return make_range(make_reverse_iterator(std::end(R)),
                        make_reverse_iterator(std::begin(R)));
    }
    template <class Iterator> iterator_range<Iterator>
        reversed(const reversed_range<Iterator> &R) {
      return make_range(R.end().base(), R.begin().base());
    }

IMO, Adaptors are more akin to accessors than they are to algorithms.  If it has to be a verb, then I think getReversed() is better than reverse().



More information about the llvm-dev mailing list