Mercurial > hg > vamp-build-and-test
comparison DEPENDENCIES/generic/include/boost/range/adaptor/replaced.hpp @ 101:c530137014c0
Update Boost headers (1.58.0)
author | Chris Cannam |
---|---|
date | Mon, 07 Sep 2015 11:12:49 +0100 |
parents | 2665513ce2d3 |
children |
comparison
equal
deleted
inserted
replaced
100:793467b5e61c | 101:c530137014c0 |
---|---|
15 #include <boost/range/adaptor/argument_fwd.hpp> | 15 #include <boost/range/adaptor/argument_fwd.hpp> |
16 #include <boost/range/iterator_range.hpp> | 16 #include <boost/range/iterator_range.hpp> |
17 #include <boost/range/begin.hpp> | 17 #include <boost/range/begin.hpp> |
18 #include <boost/range/end.hpp> | 18 #include <boost/range/end.hpp> |
19 #include <boost/range/value_type.hpp> | 19 #include <boost/range/value_type.hpp> |
20 #include <boost/range/concepts.hpp> | |
20 #include <boost/iterator/iterator_adaptor.hpp> | 21 #include <boost/iterator/iterator_adaptor.hpp> |
21 #include <boost/iterator/transform_iterator.hpp> | 22 #include <boost/iterator/transform_iterator.hpp> |
23 #include <boost/optional/optional.hpp> | |
22 | 24 |
23 namespace boost | 25 namespace boost |
24 { | 26 { |
25 namespace range_detail | 27 namespace range_detail |
26 { | 28 { |
29 { | 31 { |
30 public: | 32 public: |
31 typedef const Value& result_type; | 33 typedef const Value& result_type; |
32 typedef const Value& first_argument_type; | 34 typedef const Value& first_argument_type; |
33 | 35 |
36 // Rationale: | |
37 // The default constructor is required to allow the transform | |
38 // iterator to properly model the iterator concept. | |
39 replace_value() | |
40 { | |
41 } | |
42 | |
34 replace_value(const Value& from, const Value& to) | 43 replace_value(const Value& from, const Value& to) |
35 : m_from(from), m_to(to) | 44 : m_impl(data(from, to)) |
36 { | 45 { |
37 } | 46 } |
38 | 47 |
39 const Value& operator()(const Value& x) const | 48 const Value& operator()(const Value& x) const |
40 { | 49 { |
41 return (x == m_from) ? m_to : x; | 50 return (x == m_impl->m_from) ? m_impl->m_to : x; |
42 } | 51 } |
43 | 52 |
44 private: | 53 private: |
45 Value m_from; | 54 struct data |
46 Value m_to; | 55 { |
56 data(const Value& from, const Value& to) | |
57 : m_from(from) | |
58 , m_to(to) | |
59 { | |
60 } | |
61 | |
62 Value m_from; | |
63 Value m_to; | |
64 }; | |
65 boost::optional<data> m_impl; | |
47 }; | 66 }; |
48 | 67 |
49 template< class R > | 68 template< class R > |
50 class replaced_range : | 69 class replaced_range : |
51 public boost::iterator_range< | 70 public boost::iterator_range< |
80 private: | 99 private: |
81 // not assignable | 100 // not assignable |
82 void operator=(const replace_holder&); | 101 void operator=(const replace_holder&); |
83 }; | 102 }; |
84 | 103 |
85 template< class InputRng > | 104 template< class SinglePassRange > |
86 inline replaced_range<InputRng> | 105 inline replaced_range<SinglePassRange> |
87 operator|( InputRng& r, | 106 operator|( |
88 const replace_holder<BOOST_DEDUCED_TYPENAME range_value<InputRng>::type>& f ) | 107 SinglePassRange& r, |
108 const replace_holder< | |
109 BOOST_DEDUCED_TYPENAME range_value<SinglePassRange>::type>& f ) | |
89 { | 110 { |
90 return replaced_range<InputRng>(r, f.val1, f.val2); | 111 BOOST_RANGE_CONCEPT_ASSERT(( |
112 SinglePassRangeConcept<SinglePassRange>)); | |
113 | |
114 return replaced_range<SinglePassRange>(r, f.val1, f.val2); | |
91 } | 115 } |
92 | 116 |
93 template< class InputRng > | 117 template< class SinglePassRange > |
94 inline replaced_range<const InputRng> | 118 inline replaced_range<const SinglePassRange> |
95 operator|( const InputRng& r, | 119 operator|( |
96 const replace_holder<BOOST_DEDUCED_TYPENAME range_value<InputRng>::type>& f ) | 120 const SinglePassRange& r, |
121 const replace_holder< | |
122 BOOST_DEDUCED_TYPENAME range_value<SinglePassRange>::type>& f) | |
97 { | 123 { |
98 return replaced_range<const InputRng>(r, f.val1, f.val2); | 124 BOOST_RANGE_CONCEPT_ASSERT(( |
125 SinglePassRangeConcept<const SinglePassRange>)); | |
126 | |
127 return replaced_range<const SinglePassRange>(r, f.val1, f.val2); | |
99 } | 128 } |
100 } // 'range_detail' | 129 } // 'range_detail' |
101 | 130 |
102 using range_detail::replaced_range; | 131 using range_detail::replaced_range; |
103 | 132 |
108 const range_detail::forwarder2<range_detail::replace_holder> | 137 const range_detail::forwarder2<range_detail::replace_holder> |
109 replaced = | 138 replaced = |
110 range_detail::forwarder2<range_detail::replace_holder>(); | 139 range_detail::forwarder2<range_detail::replace_holder>(); |
111 } | 140 } |
112 | 141 |
113 template<class InputRange> | 142 template<class SinglePassRange> |
114 inline replaced_range<InputRange> | 143 inline replaced_range<SinglePassRange> |
115 replace(InputRange& rng, | 144 replace(SinglePassRange& rng, |
116 BOOST_DEDUCED_TYPENAME range_value<InputRange>::type from, | 145 BOOST_DEDUCED_TYPENAME range_value<SinglePassRange>::type from, |
117 BOOST_DEDUCED_TYPENAME range_value<InputRange>::type to) | 146 BOOST_DEDUCED_TYPENAME range_value<SinglePassRange>::type to) |
118 { | 147 { |
119 return replaced_range<InputRange>(rng, from, to); | 148 BOOST_RANGE_CONCEPT_ASSERT(( |
149 SinglePassRangeConcept<SinglePassRange>)); | |
150 | |
151 return replaced_range<SinglePassRange>(rng, from, to); | |
120 } | 152 } |
121 | 153 |
122 template<class InputRange> | 154 template<class SinglePassRange> |
123 inline replaced_range<const InputRange> | 155 inline replaced_range<const SinglePassRange> |
124 replace(const InputRange& rng, | 156 replace(const SinglePassRange& rng, |
125 BOOST_DEDUCED_TYPENAME range_value<const InputRange>::type from, | 157 BOOST_DEDUCED_TYPENAME range_value<SinglePassRange>::type from, |
126 BOOST_DEDUCED_TYPENAME range_value<const InputRange>::type to) | 158 BOOST_DEDUCED_TYPENAME range_value<SinglePassRange>::type to) |
127 { | 159 { |
128 return replaced_range<const InputRange>(rng, from ,to); | 160 BOOST_RANGE_CONCEPT_ASSERT(( |
161 SinglePassRangeConcept<const SinglePassRange>)); | |
162 | |
163 return replaced_range<const SinglePassRange>(rng, from ,to); | |
129 } | 164 } |
130 | 165 |
131 } // 'adaptors' | 166 } // 'adaptors' |
132 } // 'boost' | 167 } // 'boost' |
133 | 168 |