Assembla home | Assembla project page
 

root/trunk/cbear.berlios.de/range/iterator_range.hpp

Revision 2, 3.1 kB (checked in by sergey_shandar, 1 year ago)

restoring...

Line 
1 #ifndef CBEAR_BERLIOS_DE_RANGE_ITERATOR_RANGE_HPP_INCLUDED
2 #define CBEAR_BERLIOS_DE_RANGE_ITERATOR_RANGE_HPP_INCLUDED
3
4 #include <cbear.berlios.de/base/initialized.hpp>
5 #include <cbear.berlios.de/policy/main.hpp>
6 #include <cbear.berlios.de/range/traits.hpp>
7 #include <cbear.berlios.de/range/helper.hpp>
8 #include <cbear.berlios.de/range/begin.hpp>
9 #include <cbear.berlios.de/range/end.hpp>
10
11 namespace cbear_berlios_de
12 {
13 namespace range
14 {
15
16 namespace detail
17 {
18
19 template<class Iterator>
20 class iterator_range_base_t
21 {
22 public:
23
24         typedef Iterator iterator;
25         typedef Iterator const_iterator;
26
27 private:
28         typedef base::initialized<iterator> initialized_iterator;
29         initialized_iterator B, E;
30 };
31
32 }
33
34 template<class Iterator>
35 class iterator_range:
36         // public helper<iterator_range<Iterator>, Iterator, Iterator>
37         public helper_t<
38                 iterator_range<Iterator>, detail::iterator_range_base_t<Iterator> >
39 {
40 private:
41         typedef helper_t<
42                 iterator_range<Iterator>, detail::iterator_range_base_t<Iterator> >
43                 helper_t;
44 public:
45         // typedef helper<iterator_range, Iterator, Iterator> helper_type;
46         typedef typename helper_t::size_type size_type;
47         typedef typename helper_t::value_type value_type;
48        
49         iterator_range() {}
50        
51         typedef Iterator iterator;
52         typedef Iterator const_iterator;
53        
54         iterator_range(const iterator &B, const iterator &E):
55                 B(B),
56                 E(E)
57         {
58         }
59
60         iterator_range(const iterator &B, const size_type &Size):
61                 B(B),
62                 E(B + Size)
63         {
64         }
65
66         iterator &begin() throw() { return *this->B; }
67         iterator &end() throw() { return *this->E; }
68
69         const iterator &begin() const throw() { return *this->B; }
70         const iterator &end() const throw() { return *this->E; }
71
72         template<class Range>
73         explicit iterator_range(Range &R):
74                 B(range::begin(R)),
75                 E(range::end(R))
76         {
77         }
78        
79         template<class Range>
80         explicit iterator_range(const Range &R):
81                 B(range::begin(R)),
82                 E(range::end(R))
83         {
84         }
85
86         template<class T>
87         void swap(T &x)
88         {
89                 BOOST_STATIC_ASSERT((::boost::is_same<T, iterator_range>::value));
90                 base::swap(this->B, x.B);
91                 base::swap(this->E, x.E);
92         }
93
94 private:
95
96         typedef base::initialized<iterator> initialized_iterator;
97        
98         initialized_iterator B, E;
99 };
100
101 template<class Iterator>
102 iterator_range<Iterator> make_iterator_range(
103         const Iterator &B, const Iterator &E)
104 {
105         return iterator_range<Iterator>(B, E);
106 }
107
108 template<class Iterator, class SizeType>
109 iterator_range<Iterator> make_iterator_range(
110         const Iterator &B, const SizeType &Size)
111 {
112         return iterator_range<Iterator>(B, Size);
113 }
114
115 template<class Iterator>
116 iterator_range<Iterator> make_iterator_range(
117         const std::pair<Iterator, Iterator> &P)
118 {
119         return iterator_range<Iterator>(P);
120 }
121
122 template<class Range>
123 iterator_range<typename iterator<Range>::type> make_iterator_range(
124         Range &R)
125 {
126         return iterator_range<typename iterator<Range>::type>(R);
127 }
128
129 template<class Range>
130 iterator_range<typename iterator<const Range>::type> make_iterator_range(
131         const Range &R)
132 {
133         return iterator_range<typename iterator<const Range>::type>(R);
134 }
135
136 }
137 }
138
139 #endif
140
Note: See TracBrowser for help on using the browser.