change the return type from the indexed adaptor so that the index is available from the range element.

This commit is contained in:
Neil Groves
2014-06-09 02:12:00 +01:00
parent 344f578934
commit 5ce6dc7814
5 changed files with 545 additions and 223 deletions

View File

@ -7,14 +7,60 @@
[table
[[Syntax] [Code]]
[[Pipe] [`rng | boost::adaptors::indexed()`]]
[[Pipe] [`rng | boost::adaptors::indexed(start_index)`]]
[[Function] [`boost::adaptors::index(rng)`]]
[[Function] [`boost::adaptors::index(rng, start_index)`]]
]
* [*Returns:] A range adapted to return both the element and the associated index. The returned range consists of iterators that have in addition to the usual iterator member functions an `index()` member function that returns the appropriate index for the element in the sequence corresponding with the iterator.
[heading Description]
The index within each returned `boost::range::index_value` is equal to
`start_index` + the offset of the element from the beginning of the range. In
the versions of the functions that omit `start_index` the starting index is
taken to be `0`.
* [*Purpose:] Adapt `rng` to return elements that have the corresponding value
from `rng` and a numeric index.
* [*Returns:] A range adapted to return both the element and the associated
index. The returned range has elements of type:
``
boost::range::index_value<
typename boost::range_reference<decltype(rng)>::type,
typename boost::range_difference<decltype(rng)>::type
>
``
The synopsis of index_value is as follows:
``
template<class T, class Indexable=std::ptrdiff_t>
class index_value : public boost::tuple<Indexable, T>
{
public:
typedef ...unspecified... index_type;
typedef ...unspecified... const_index_type;
typedef ...unspecified... value_type;
typedef ...unspecified... const_value_type;
// ...unspecified... constructors
index_type index();
const_index_type index() const;
value_type value();
const_value_type value() const;
};
``
* [*Range Category:] __single_pass_range__
* [*Range Return Type:] `boost::indexed_range<decltype(rng)>`
* [*Returned Range Category:] The range category of `rng`
* [*Returned Range Category:] The range category of `rng` if and only if `rng`
is not a __bidirectional_range__. If `rng` is a __bidirectional_range__ then the
returned range category is __forward_range__. The rationale for the demotion of
__bidirectional_range__ inputs to __forward_range__ is to avoid slow calculation
of indices for `boost::end(rng)`.
[section:indexed_example indexed example]
[import ../../../test/adaptor_test/indexed_example.cpp]