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
15 #if defined(_MSC_VER) && (_MSC_VER>=1200)
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>
32 namespace container_adaptor {
34 #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
38 class Base, class Iterator, class ConstIterator,
39 class ReverseIterator, class ConstReverseIterator,
40 class IteratorToBaseConverter, class IteratorFromBaseConverter,
41 class ReverseIteratorFromBaseConverter,
42 class ValueToBaseConverter, class ValueFromBaseConverter,
43 class FunctorsFromDerivedClasses
45 struct sequence_container_adaptor_base
47 typedef container_adaptor
49 Base, Iterator, ConstIterator,
50 IteratorToBaseConverter, IteratorFromBaseConverter,
51 ValueToBaseConverter, ValueFromBaseConverter,
53 BOOST_DEDUCED_TYPENAME mpl::push_front<
55 FunctorsFromDerivedClasses,
57 BOOST_DEDUCED_TYPENAME mpl::if_<
58 ::boost::mpl::is_na<ReverseIteratorFromBaseConverter>,
60 detail::iterator_from_base_identity
62 BOOST_DEDUCED_TYPENAME Base::reverse_iterator,
64 BOOST_DEDUCED_TYPENAME Base::const_reverse_iterator,
70 ReverseIteratorFromBaseConverter
80 #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
82 /// \brief Container adaptor to build a type that is compliant to the concept of a sequence container.
91 class ReverseIterator,
92 class ConstReverseIterator,
94 class IteratorToBaseConverter = ::boost::mpl::na,
95 class IteratorFromBaseConverter = ::boost::mpl::na,
96 class ReverseIteratorFromBaseConverter = ::boost::mpl::na,
97 class ValueToBaseConverter = ::boost::mpl::na,
98 class ValueFromBaseConverter = ::boost::mpl::na,
100 class FunctorsFromDerivedClasses = mpl::vector<>
102 class sequence_container_adaptor :
104 public sequence_container_adaptor_base
106 Base, Iterator, ConstIterator,
107 ReverseIterator, ConstReverseIterator,
108 IteratorToBaseConverter, IteratorFromBaseConverter,
109 ReverseIteratorFromBaseConverter,
110 ValueToBaseConverter, ValueFromBaseConverter,
111 FunctorsFromDerivedClasses
115 ::boost::totally_ordered
117 sequence_container_adaptor
119 Base, Iterator, ConstIterator,
120 ReverseIterator, ConstReverseIterator,
121 IteratorToBaseConverter, IteratorFromBaseConverter,
122 ReverseIteratorFromBaseConverter,
123 ValueToBaseConverter, ValueFromBaseConverter,
124 FunctorsFromDerivedClasses
128 typedef BOOST_DEDUCED_TYPENAME sequence_container_adaptor_base
130 Base, Iterator, ConstIterator,
131 ReverseIterator, ConstReverseIterator,
132 IteratorToBaseConverter, IteratorFromBaseConverter,
133 ReverseIteratorFromBaseConverter,
134 ValueToBaseConverter, ValueFromBaseConverter,
135 FunctorsFromDerivedClasses
139 // MetaData -------------------------------------------------------------
143 typedef ReverseIterator reverse_iterator;
144 typedef ConstReverseIterator const_reverse_iterator;
148 typedef BOOST_DEDUCED_TYPENAME mpl::if_<
149 ::boost::mpl::is_na<ReverseIteratorFromBaseConverter>,
151 detail::iterator_from_base_identity
153 BOOST_DEDUCED_TYPENAME Base::reverse_iterator,
155 BOOST_DEDUCED_TYPENAME Base::const_reverse_iterator,
156 const_reverse_iterator
161 ReverseIteratorFromBaseConverter
164 >::type reverse_iterator_from_base;
167 // Access -----------------------------------------------------------------
171 explicit sequence_container_adaptor(Base & c)
177 typedef sequence_container_adaptor sequence_container_adaptor_;
179 // Interface --------------------------------------------------------------
183 reverse_iterator rbegin()
185 return this->template functor<
186 reverse_iterator_from_base
187 >() ( this->base().rbegin() );
191 reverse_iterator rend()
193 return this->template functor<
194 reverse_iterator_from_base
195 >() ( this->base().rend() );
198 const_reverse_iterator rbegin() const
200 return this->template functor<
201 reverse_iterator_from_base
202 >() ( this->base().rbegin() );
205 const_reverse_iterator rend() const
207 return this->template functor<
208 reverse_iterator_from_base
209 >() ( this->base().rend() );
212 void resize(BOOST_DEDUCED_TYPENAME base_::size_type n,
213 BOOST_DEDUCED_TYPENAME ::boost::call_traits<
214 BOOST_DEDUCED_TYPENAME base_::value_type >::param_type x =
215 BOOST_DEDUCED_TYPENAME base_::value_type())
217 this->base().resize(n,
218 this->template functor<BOOST_DEDUCED_TYPENAME base_::value_to_base>()(x)
222 BOOST_DEDUCED_TYPENAME base_::reference front()
224 return this->template functor<
225 BOOST_DEDUCED_TYPENAME base_::value_from_base>()
231 BOOST_DEDUCED_TYPENAME base_::reference back()
233 return this->template functor<
234 BOOST_DEDUCED_TYPENAME base_::value_from_base>()
240 BOOST_DEDUCED_TYPENAME base_::const_reference front() const
242 return this->template functor<
243 BOOST_DEDUCED_TYPENAME base_::value_from_base>()
249 BOOST_DEDUCED_TYPENAME base_::const_reference back() const
251 return this->template functor<
252 BOOST_DEDUCED_TYPENAME base_::value_from_base>()
259 BOOST_DEDUCED_TYPENAME ::boost::call_traits<
260 BOOST_DEDUCED_TYPENAME base_::value_type >::param_type x)
262 this->base().push_front(
263 this->template functor<BOOST_DEDUCED_TYPENAME base_::value_to_base>()(x));
268 this->base().pop_front();
272 BOOST_DEDUCED_TYPENAME ::boost::call_traits<
273 BOOST_DEDUCED_TYPENAME base_::value_type >::param_type x)
275 this->base().push_back(
276 this->template functor<BOOST_DEDUCED_TYPENAME base_::value_to_base>()(x));
281 this->base().pop_back();
284 std::pair<BOOST_DEDUCED_TYPENAME base_::iterator,bool>
285 insert(BOOST_DEDUCED_TYPENAME base_::iterator position,
286 BOOST_DEDUCED_TYPENAME ::boost::call_traits<
287 BOOST_DEDUCED_TYPENAME base_::value_type >::param_type x)
289 std::pair< BOOST_DEDUCED_TYPENAME Base::iterator, bool > r(
291 this->template functor<
292 BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position),
293 this->template functor<
294 BOOST_DEDUCED_TYPENAME base_::value_to_base >()(x)
298 return std::pair<BOOST_DEDUCED_TYPENAME base_::iterator, bool>(
299 this->template functor<
300 BOOST_DEDUCED_TYPENAME base_::iterator_from_base>()(r.first),
305 void insert(BOOST_DEDUCED_TYPENAME base_::iterator position,
306 BOOST_DEDUCED_TYPENAME base_::size_type m,
307 BOOST_DEDUCED_TYPENAME ::boost::call_traits<
308 BOOST_DEDUCED_TYPENAME base_::value_type >::param_type x)
311 this->template functor<
312 BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position),
314 this->template functor<BOOST_DEDUCED_TYPENAME base_::value_to_base >()(x)
318 template< class InputIterator >
319 void insert(BOOST_DEDUCED_TYPENAME base_::iterator position,
320 InputIterator first, InputIterator last)
322 // This is the same problem found in the insert function
323 // of container_adaptor
324 // For now, do the simple thing. This can be optimized
326 for( ; first != last ; ++first )
329 this->template functor<
330 BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()( position ),
331 this->template functor<
332 BOOST_DEDUCED_TYPENAME base_::value_to_base >()( *first )
337 // Totally ordered implementation
339 bool operator==(const sequence_container_adaptor & c) const
341 return ( this->base() == c.base() );
344 bool operator<(const sequence_container_adaptor & c) const
346 return ( this->base() < c.base() );
350 } // namespace container_adaptor
351 } // namespace bimaps
355 #endif // BOOST_BIMAP_CONTAINER_ADAPTOR_SEQUENCE_CONTAINER_ADAPTOR_HPP