1 // Copyright Neil Groves 2009. Use, modification and
2 // distribution is subject to the Boost Software License, Version
3 // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
4 // http://www.boost.org/LICENSE_1_0.txt)
7 // For more information, see http://www.boost.org/libs/range/
9 #ifndef BOOST_RANGE_DETAIL_RANGE_RETURN_HPP_INCLUDED
10 #define BOOST_RANGE_DETAIL_RANGE_RETURN_HPP_INCLUDED
12 #include <boost/range/begin.hpp>
13 #include <boost/range/end.hpp>
14 #include <boost/range/iterator_range.hpp>
18 enum range_return_value
20 // (*) indicates the most common values
21 return_found, // only the found resulting iterator (*)
22 return_next, // next(found) iterator
23 return_prior, // prior(found) iterator
24 return_begin_found, // [begin, found) range (*)
25 return_begin_next, // [begin, next(found)) range
26 return_begin_prior, // [begin, prior(found)) range
27 return_found_end, // [found, end) range (*)
28 return_next_end, // [next(found), end) range
29 return_prior_end, // [prior(found), end) range
30 return_begin_end // [begin, end) range
33 template< class SinglePassRange, range_return_value >
36 typedef boost::iterator_range<
37 BOOST_DEDUCED_TYPENAME range_iterator<SinglePassRange>::type > type;
39 static type pack(BOOST_DEDUCED_TYPENAME range_iterator<SinglePassRange>::type found,
42 return type(found, boost::end(rng));
46 template< class SinglePassRange >
47 struct range_return< SinglePassRange, return_found >
49 typedef BOOST_DEDUCED_TYPENAME range_iterator<SinglePassRange>::type type;
51 static type pack(type found, SinglePassRange&)
57 template< class SinglePassRange >
58 struct range_return< SinglePassRange, return_next >
60 typedef BOOST_DEDUCED_TYPENAME range_iterator<SinglePassRange>::type type;
62 static type pack(type found, SinglePassRange& rng)
64 return found == boost::end(rng)
70 template< class BidirectionalRange >
71 struct range_return< BidirectionalRange, return_prior >
73 typedef BOOST_DEDUCED_TYPENAME range_iterator<BidirectionalRange>::type type;
75 static type pack(type found, BidirectionalRange& rng)
77 return found == boost::begin(rng)
79 : boost::prior(found);
83 template< class SinglePassRange >
84 struct range_return< SinglePassRange, return_begin_found >
86 typedef boost::iterator_range<
87 BOOST_DEDUCED_TYPENAME range_iterator<SinglePassRange>::type > type;
89 static type pack(BOOST_DEDUCED_TYPENAME range_iterator<SinglePassRange>::type found,
92 return type(boost::begin(rng), found);
96 template< class SinglePassRange >
97 struct range_return< SinglePassRange, return_begin_next >
99 typedef boost::iterator_range<
100 BOOST_DEDUCED_TYPENAME range_iterator<SinglePassRange>::type > type;
102 static type pack(BOOST_DEDUCED_TYPENAME range_iterator<SinglePassRange>::type found,
103 SinglePassRange& rng)
105 return type( boost::begin(rng),
106 found == boost::end(rng) ? found : boost::next(found) );
110 template< class BidirectionalRange >
111 struct range_return< BidirectionalRange, return_begin_prior >
113 typedef boost::iterator_range<
114 BOOST_DEDUCED_TYPENAME range_iterator<BidirectionalRange>::type > type;
116 static type pack(BOOST_DEDUCED_TYPENAME range_iterator<BidirectionalRange>::type found,
117 BidirectionalRange& rng)
119 return type( boost::begin(rng),
120 found == boost::begin(rng) ? found : boost::prior(found) );
124 template< class SinglePassRange >
125 struct range_return< SinglePassRange, return_found_end >
127 typedef boost::iterator_range<
128 BOOST_DEDUCED_TYPENAME range_iterator<SinglePassRange>::type > type;
130 static type pack(BOOST_DEDUCED_TYPENAME range_iterator<SinglePassRange>::type found,
131 SinglePassRange& rng)
133 return type(found, boost::end(rng));
137 template< class SinglePassRange >
138 struct range_return< SinglePassRange, return_next_end >
140 typedef boost::iterator_range<
141 BOOST_DEDUCED_TYPENAME range_iterator<SinglePassRange>::type > type;
143 static type pack(BOOST_DEDUCED_TYPENAME range_iterator<SinglePassRange>::type found,
144 SinglePassRange& rng)
146 return type( found == boost::end(rng) ? found : boost::next(found),
151 template< class BidirectionalRange >
152 struct range_return< BidirectionalRange, return_prior_end >
154 typedef boost::iterator_range<
155 BOOST_DEDUCED_TYPENAME range_iterator<BidirectionalRange>::type > type;
157 static type pack(BOOST_DEDUCED_TYPENAME range_iterator<BidirectionalRange>::type found,
158 BidirectionalRange& rng)
160 return type( found == boost::begin(rng) ? found : boost::prior(found),
165 template< class SinglePassRange >
166 struct range_return< SinglePassRange, return_begin_end >
168 typedef boost::iterator_range<
169 BOOST_DEDUCED_TYPENAME range_iterator<SinglePassRange>::type > type;
171 static type pack(BOOST_DEDUCED_TYPENAME range_iterator<SinglePassRange>::type,
172 SinglePassRange& rng)
174 return type(boost::begin(rng), boost::end(rng));
180 #endif // include guard