[/
    Copyright 2010 Neil Groves
    Distributed under the Boost Software License, Version 1.0.
    (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
/]
[section:indexed indexed]

[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)`]]
]

[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` 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]
[indexed_example]
[endsect]

This would produce the output:
``
Element = 10 Index = 0
Element = 20 Index = 1
Element = 30 Index = 2
Element = 40 Index = 3
Element = 50 Index = 4
Element = 60 Index = 5
Element = 70 Index = 6
Element = 80 Index = 7
Element = 90 Index = 8
``
[endsect]


