| [section Semantics] |
| |
| [heading notation] |
| |
| [table |
| [[Type ] [Object] [Describes ]] |
| [[`X` ] [`x` ] [any type ]] |
| [[`T` ] [`t` ] [denotes behavior of the primary templates]] |
| [[`P` ] [`p` ] [denotes `std::pair<iterator,iterator>` ]] |
| [[`A[sz]`] [`a` ] [denotes an array of type `A` of size `sz`]] |
| [[`Char*`] [`s` ] [denotes either `char*` or `wchar_t*` ]] |
| ] |
| |
| [section Metafunctions] |
| |
| [table |
| [[Expression] [Return type] [Complexity]] |
| [ |
| [`range_iterator<X>::type`] |
| [`` |
| T::iterator |
| P::first_type |
| A* |
| ``] |
| [compile time] |
| ] |
| [ |
| [`range_iterator<const X>::type`] |
| [`` |
| T::const_iterator |
| P::first_type |
| const A* |
| ``] |
| [compile time] |
| ] |
| [ |
| [`range_value<X>::type`] |
| [`boost::iterator_value<range_iterator<X>::type>::type`] |
| [compile time] |
| ] |
| [ |
| [`range_reference<X>::type`] |
| [`boost::iterator_reference<range_iterator<X>::type>::type`] |
| [compile time] |
| ] |
| [ |
| [`range_pointer<X>::type`] |
| [`boost::iterator_pointer<range_iterator<X>::type>::type`] |
| [compile time] |
| ] |
| [ |
| [`range_category<X>::type`] |
| [`boost::iterator_category<range_iterator<X>::type>::type`] |
| [compile time] |
| ] |
| [ |
| [`range_difference<X>::type`] |
| [`boost::iterator_category<range_iterator<X>::type>::type`] |
| [compile time] |
| ] |
| [ |
| [`range_reverse_iterator<X>::type`] |
| [`boost::reverse_iterator<range_iterator<X>::type>`] |
| [compile time] |
| ] |
| [ |
| [`range_reverse_iterator<const X>::type`] |
| [`boost::reverse_iterator<range_iterator<const X>::type`] |
| [compile time] |
| ] |
| ] |
| |
| [endsect] |
| |
| [section Functions] |
| |
| [table |
| [[Expression] [Return type] [Returns] [Complexity]] |
| |
| [ |
| [`begin(x)`] |
| [`range_iterator<X>::type`] |
| [ |
| `p.first` if `p` is of type `std::pair<T>` |
| `a` if `a` is an array |
| `range_begin(x)` if that expression would invoke a function found by ADL |
| `t.begin()` otherwise |
| ] |
| [constant time] |
| ] |
| [ |
| [`end(x)`] |
| [`range_iterator<X>::type`] |
| [ |
| `p.second` if `p` is of type `std::pair<T>` |
| `a + sz` if `a` is an array of size `sz` |
| `range_end(x)` if that expression would invoke a function found by ADL |
| `t.end()` otherwise |
| ] |
| [constant time] |
| ] |
| [ |
| [`empty(x)`] |
| [`bool`] |
| [`boost::begin(x) == boost::end(x)`] |
| [constant time] |
| ] |
| [ |
| [`distance(x)`] |
| [`range_difference<X>::type`] |
| [`std::distance(boost::begin(x),boost::end(x))`] |
| [-] |
| ] |
| [ |
| [`size(x)`] |
| [`range_difference<X>::type`] |
| [`boost::end(x) - boost::begin(x)`] |
| [constant time] |
| ] |
| [ |
| [`rbegin(x)`] |
| [`range_reverse_iterator<X>::type`] |
| [`range_reverse_iterator<X>::type(boost::end(x))`] |
| [constant time] |
| ] |
| [ |
| [`rend(x)`] |
| [`range_reverse_iterator<X>::type`] |
| [`range_reverse_iterator<X>::type(boost::begin(x))`] |
| [constant time] |
| ] |
| [ |
| [`const_begin(x)`] |
| [`range_iterator<const X>::type`] |
| [`range_iterator<const X>::type(boost::begin(x))`] |
| [constant time] |
| ] |
| [ |
| [`const_end(x)`] |
| [`range_iterator<const X>::type`] |
| [`range_iterator<const X>::type(boost::end(x))`] |
| [constant time] |
| ] |
| [ |
| [`const_rbegin(x)`] |
| [`range_reverse_iterator<const X>::type`] |
| [`range_reverse_iterator<const X>::type(boost::rbegin(x))`] |
| [constant time] |
| ] |
| [ |
| [`const_rend(x)`] |
| [`range_reverse_iterator<const X>::type`] |
| [`range_reverse_iterator<const X>::type(boost::rend(x))`] |
| [constant time] |
| ] |
| [ |
| [`as_literal(x)`] |
| [`iterator_range<U>` where `U` is `Char*` if `x` is a pointer to a string and `U` is `range_iterator<X>::type` otherwise] |
| [ |
| `[s,s + std::char_traits<X>::length(s))` if `s` is a `Char*` or an array of `Char` `[boost::begin(x),boost::end(x))` otherwise |
| ] |
| [ |
| linear time for pointers to a string or arrays of `Char`, constant time otherwise |
| ] |
| ] |
| [ |
| [`as_array(x)`] |
| [`iterator_range<X>`] |
| [`[boost::begin(x),boost::end(x))`] |
| ] |
| ] |
| |
| The special `const_`-named functions are useful when you want to document clearly that your code is read-only. |
| |
| `as_literal()` can be used ['*internally*] in string algorithm libraries such that arrays of characters are handled correctly. |
| |
| `as_array()` can be used with string algorithm libraries to make it clear that arrays of characters are handled like an array and not like a string. |
| |
| Notice that the above functions should always be called with qualification (`boost::`) to prevent ['*unintended*] Argument Dependent Lookup (ADL). |
| |
| [endsect] |
| |
| [endsect] |
| |
| |