Ticket #4621: any_range.h

File any_range.h, 1.6 KB (added by Ilya Murav'jov <muravev@…>, 12 years ago)
Line 
1#ifndef __MLIB_RANGE_ANY_RANGE_H__
2#define __MLIB_RANGE_ANY_RANGE_H__
3
4#include <mlib/any_iterator/any_iterator.hpp>
5
6#include <boost/range/iterator_range.hpp>
7#include <boost/range/reference.hpp>
8
9namespace fe
10{
11
12using namespace IteratorTypeErasure;
13using boost::range_reference;
14
15template <class Reference>
16struct traits
17{
18 typedef typename boost::remove_reference<Reference>::type Value;
19 // in practice, only bidirectional one is needed
20 typedef any_iterator<Value, boost::bidirectional_traversal_tag, Reference> iterator;
21
22 typedef boost::iterator_range<iterator> range_base;
23};
24
25template <class Reference>
26class range: public traits<Reference>::range_base
27{
28 typedef typename traits<Reference>::range_base super_t;
29 public:
30
31 range() {}
32
33 template< class Iterator >
34 range(const Iterator& Begin, const Iterator& End): super_t(Begin, End) {}
35
36 // only identical type ranges are allowed (to restrict more than one wrapping with any_iterator!)
37 range(const range& r): super_t(r) {}
38};
39
40//
41// make_any
42//
43
44template <class Range>
45struct range_range
46{
47 typedef range<typename range_reference<Range>::type> type;
48};
49
50template <class Range>
51typename range_range<Range>::type
52_make_any(Range& r)
53{
54 typedef typename range_reference<Range>::type reference;
55 return range<reference>(boost::begin(r), boost::end(r));
56}
57
58template <class Range>
59typename range_range<Range>::type
60make_any(Range& r)
61{
62 return _make_any(r);
63}
64
65template <class Range>
66typename range_range<const Range>::type
67make_any(const Range& r)
68{
69 return _make_any(r);
70}
71
72} // namespace fe
73
74
75#endif // #ifndef __MLIB_RANGE_ANY_RANGE_H__
76