3 // Copyright (c) 2006-2007 Matias Capeletto
5 // Distributed under the Boost Software License, Version 1.0.
6 // (See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
9 /// \file container_adaptor/sequence_container_adaptor.hpp
10 /// \brief Container adaptor to build a type that is compliant to the concept of a weak associative container.
12 #ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_SEQUENCE_CONTAINER_ADAPTOR_HPP
13 #define BOOST_BIMAP_CONTAINER_ADAPTOR_SEQUENCE_CONTAINER_ADAPTOR_HPP
19 #include <boost/config.hpp>
23 #include <boost/mpl/if.hpp>
24 #include <boost/mpl/vector.hpp>
25 #include <boost/mpl/aux_/na.hpp>
26 #include <boost/bimap/container_adaptor/detail/identity_converters.hpp>
27 #include <boost/bimap/container_adaptor/container_adaptor.hpp>
28 #include <boost/call_traits.hpp>
29 #include <boost/operators.hpp>
33 namespace container_adaptor {
35 #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
39 class Base, class Iterator, class ConstIterator,
40 class ReverseIterator, class ConstReverseIterator,
41 class IteratorToBaseConverter, class IteratorFromBaseConverter,
42 class ReverseIteratorFromBaseConverter,
43 class ValueToBaseConverter, class ValueFromBaseConverter,
44 class FunctorsFromDerivedClasses
46 struct sequence_container_adaptor_base
48 typedef container_adaptor
50 Base, Iterator, ConstIterator,
51 IteratorToBaseConverter, IteratorFromBaseConverter,
52 ValueToBaseConverter, ValueFromBaseConverter,
54 BOOST_DEDUCED_TYPENAME mpl::push_front<
56 FunctorsFromDerivedClasses,
58 BOOST_DEDUCED_TYPENAME mpl::if_<
59 ::boost::mpl::is_na<ReverseIteratorFromBaseConverter>,
61 detail::iterator_from_base_identity
63 BOOST_DEDUCED_TYPENAME Base::reverse_iterator,
65 BOOST_DEDUCED_TYPENAME Base::const_reverse_iterator,
71 ReverseIteratorFromBaseConverter
81 #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
83 /// \brief Container adaptor to build a type that is compliant to the concept of a sequence container.
92 class ReverseIterator,
93 class ConstReverseIterator,
95 class IteratorToBaseConverter = ::boost::mpl::na,
96 class IteratorFromBaseConverter = ::boost::mpl::na,
97 class ReverseIteratorFromBaseConverter = ::boost::mpl::na,
98 class ValueToBaseConverter = ::boost::mpl::na,
99 class ValueFromBaseConverter = ::boost::mpl::na,
101 class FunctorsFromDerivedClasses = mpl::vector<>
103 class sequence_container_adaptor :
105 public sequence_container_adaptor_base
107 Base, Iterator, ConstIterator,
108 ReverseIterator, ConstReverseIterator,
109 IteratorToBaseConverter, IteratorFromBaseConverter,
110 ReverseIteratorFromBaseConverter,
111 ValueToBaseConverter, ValueFromBaseConverter,
112 FunctorsFromDerivedClasses
116 ::boost::totally_ordered
118 sequence_container_adaptor
120 Base, Iterator, ConstIterator,
121 ReverseIterator, ConstReverseIterator,
122 IteratorToBaseConverter, IteratorFromBaseConverter,
123 ReverseIteratorFromBaseConverter,
124 ValueToBaseConverter, ValueFromBaseConverter,
125 FunctorsFromDerivedClasses
129 typedef BOOST_DEDUCED_TYPENAME sequence_container_adaptor_base
131 Base, Iterator, ConstIterator,
132 ReverseIterator, ConstReverseIterator,
133 IteratorToBaseConverter, IteratorFromBaseConverter,
134 ReverseIteratorFromBaseConverter,
135 ValueToBaseConverter, ValueFromBaseConverter,
136 FunctorsFromDerivedClasses
140 // MetaData -------------------------------------------------------------
144 typedef ReverseIterator reverse_iterator;
145 typedef ConstReverseIterator const_reverse_iterator;
149 typedef BOOST_DEDUCED_TYPENAME mpl::if_<
150 ::boost::mpl::is_na<ReverseIteratorFromBaseConverter>,
152 detail::iterator_from_base_identity
154 BOOST_DEDUCED_TYPENAME Base::reverse_iterator,
156 BOOST_DEDUCED_TYPENAME Base::const_reverse_iterator,
157 const_reverse_iterator
162 ReverseIteratorFromBaseConverter
165 >::type reverse_iterator_from_base;
168 // Access -----------------------------------------------------------------
172 explicit sequence_container_adaptor(Base & c)
178 typedef sequence_container_adaptor sequence_container_adaptor_;
180 // Interface --------------------------------------------------------------
184 reverse_iterator rbegin()
186 return this->template functor<
187 reverse_iterator_from_base
188 >() ( this->base().rbegin() );
192 reverse_iterator rend()
194 return this->template functor<
195 reverse_iterator_from_base
196 >() ( this->base().rend() );
199 const_reverse_iterator rbegin() const
201 return this->template functor<
202 reverse_iterator_from_base
203 >() ( this->base().rbegin() );
206 const_reverse_iterator rend() const
208 return this->template functor<
209 reverse_iterator_from_base
210 >() ( this->base().rend() );
213 void resize(BOOST_DEDUCED_TYPENAME base_::size_type n,
214 BOOST_DEDUCED_TYPENAME ::boost::call_traits<
215 BOOST_DEDUCED_TYPENAME base_::value_type >::param_type x =
216 BOOST_DEDUCED_TYPENAME base_::value_type())
218 this->base().resize(n,
219 this->template functor<BOOST_DEDUCED_TYPENAME base_::value_to_base>()(x)
223 BOOST_DEDUCED_TYPENAME base_::reference front()
225 return this->template functor<
226 BOOST_DEDUCED_TYPENAME base_::value_from_base>()
232 BOOST_DEDUCED_TYPENAME base_::reference back()
234 return this->template functor<
235 BOOST_DEDUCED_TYPENAME base_::value_from_base>()
241 BOOST_DEDUCED_TYPENAME base_::const_reference front() const
243 return this->template functor<
244 BOOST_DEDUCED_TYPENAME base_::value_from_base>()
250 BOOST_DEDUCED_TYPENAME base_::const_reference back() const
252 return this->template functor<
253 BOOST_DEDUCED_TYPENAME base_::value_from_base>()
260 BOOST_DEDUCED_TYPENAME ::boost::call_traits<
261 BOOST_DEDUCED_TYPENAME base_::value_type >::param_type x)
263 this->base().push_front(
264 this->template functor<BOOST_DEDUCED_TYPENAME base_::value_to_base>()(x));
269 this->base().pop_front();
273 BOOST_DEDUCED_TYPENAME ::boost::call_traits<
274 BOOST_DEDUCED_TYPENAME base_::value_type >::param_type x)
276 this->base().push_back(
277 this->template functor<BOOST_DEDUCED_TYPENAME base_::value_to_base>()(x));
282 this->base().pop_back();
285 std::pair<BOOST_DEDUCED_TYPENAME base_::iterator,bool>
286 insert(BOOST_DEDUCED_TYPENAME base_::iterator position,
287 BOOST_DEDUCED_TYPENAME ::boost::call_traits<
288 BOOST_DEDUCED_TYPENAME base_::value_type >::param_type x)
290 std::pair< BOOST_DEDUCED_TYPENAME Base::iterator, bool > r(
292 this->template functor<
293 BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position),
294 this->template functor<
295 BOOST_DEDUCED_TYPENAME base_::value_to_base >()(x)
299 return std::pair<BOOST_DEDUCED_TYPENAME base_::iterator, bool>(
300 this->template functor<
301 BOOST_DEDUCED_TYPENAME base_::iterator_from_base>()(r.first),
306 void insert(BOOST_DEDUCED_TYPENAME base_::iterator position,
307 BOOST_DEDUCED_TYPENAME base_::size_type m,
308 BOOST_DEDUCED_TYPENAME ::boost::call_traits<
309 BOOST_DEDUCED_TYPENAME base_::value_type >::param_type x)
312 this->template functor<
313 BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position),
315 this->template functor<BOOST_DEDUCED_TYPENAME base_::value_to_base >()(x)
319 template< class InputIterator >
320 void insert(BOOST_DEDUCED_TYPENAME base_::iterator position,
321 InputIterator first, InputIterator last)
323 // This is the same problem found in the insert function
324 // of container_adaptor
325 // For now, do the simple thing. This can be optimized
327 for( ; first != last ; ++first )
330 this->template functor<
331 BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()( position ),
332 this->template functor<
333 BOOST_DEDUCED_TYPENAME base_::value_to_base >()( *first )
338 // Totally ordered implementation
340 bool operator==(const sequence_container_adaptor & c) const
342 return ( this->base() == c.base() );
345 bool operator<(const sequence_container_adaptor & c) const
347 return ( this->base() < c.base() );
351 } // namespace container_adaptor
352 } // namespace bimaps
356 #endif // BOOST_BIMAP_CONTAINER_ADAPTOR_SEQUENCE_CONTAINER_ADAPTOR_HPP