any_iterator Class Reference
Detailed Description
The adobe::any_iterator template is an experiment in concept based polymorphism. We would expect that in most cases it would be more efficient to copy a sequence into a connonical form, perform the operation, and then copy it back. However, there may be uses cases where the copy is not desired or would be less efficient (such as lower bounds on a random access sequence). Constructing an any_iterator does require a free store allocation and could throw an exception.
ExampleThis example illustrates how an any_iterator can be used to deal with runtime polymorphic sequences. We have a single concrete function, reverse_and_print(), which can be used with a list, vector, deque, or any other bidirectional sequence. // start_of_example
#include <iostream>
#include <list>
#include <vector>
#include <deque>
#include <boost/range/functions.hpp>
#include <adobe/iterator.hpp>
typedef adobe::any_iterator<int, std::bidirectional_iterator_tag> any_iterator_to_int;
// Concrete (non-template) function
void reverse_and_print(any_iterator_to_int first, any_iterator_to_int last)
{
std::reverse(first, last);
while (first != last)
{
std::cout << *first << " ";
++first;
}
std::cout << std::endl;
}
int main()
{
const int a[] = { 0, 1, 2, 3, 4, 5 };
std::list<int> l(boost::begin(a), boost::end(a));
reverse_and_print(any_iterator_to_int(boost::begin(l)), any_iterator_to_int(boost::end(l)));
std::vector<int> v(boost::begin(a), boost::end(a));
reverse_and_print(any_iterator_to_int(boost::begin(v)), any_iterator_to_int(boost::end(v)));
std::deque<int> d(boost::begin(a), boost::end(a));
reverse_and_print(any_iterator_to_int(boost::begin(d)), any_iterator_to_int(boost::end(d)));
return 0;
}
// end_of_example
|