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