1 // Boost.Bimap 2 // 3 // Copyright (c) 2006-2007 Matias Capeletto 4 // 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) 8 9 /// \file container_adaptor/vector_adaptor.hpp 10 /// \brief Container adaptor to easily build a std::vector signature compatible container. 11 12 #ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_VECTOR_ADAPTOR_HPP 13 #define BOOST_BIMAP_CONTAINER_ADAPTOR_VECTOR_ADAPTOR_HPP 14 15 #if defined(_MSC_VER) 16 #pragma once 17 #endif 18 19 #include <boost/config.hpp> 20 21 #include <boost/bimap/container_adaptor/sequence_container_adaptor.hpp> 22 #include <boost/mpl/aux_/na.hpp> 23 #include <boost/mpl/vector.hpp> 24 25 namespace boost { 26 namespace bimaps { 27 namespace container_adaptor { 28 29 /// \brief Container adaptor to easily build a std::vector signature compatible container. 30 31 template 32 < 33 class Base, 34 35 class Iterator, 36 class ConstIterator, 37 class ReverseIterator, 38 class ConstReverseIterator, 39 40 class IteratorToBaseConverter = ::boost::mpl::na, 41 class IteratorFromBaseConverter = ::boost::mpl::na, 42 class ReverseIteratorFromBaseConverter = ::boost::mpl::na, 43 class ValueToBaseConverter = ::boost::mpl::na, 44 class ValueFromBaseConverter = ::boost::mpl::na, 45 46 class FunctorsFromDerivedClasses = mpl::vector<> 47 > 48 class vector_adaptor : 49 50 public ::boost::bimaps::container_adaptor::sequence_container_adaptor 51 < 52 Base, 53 Iterator, ConstIterator, ReverseIterator, ConstReverseIterator, 54 IteratorToBaseConverter, IteratorFromBaseConverter, 55 ReverseIteratorFromBaseConverter, 56 ValueToBaseConverter, ValueFromBaseConverter, 57 FunctorsFromDerivedClasses 58 > 59 { 60 61 typedef ::boost::bimaps::container_adaptor::sequence_container_adaptor 62 < 63 Base, 64 Iterator, ConstIterator, ReverseIterator, ConstReverseIterator, 65 IteratorToBaseConverter, IteratorFromBaseConverter, 66 ReverseIteratorFromBaseConverter, 67 ValueToBaseConverter, ValueFromBaseConverter, 68 FunctorsFromDerivedClasses 69 70 > base_; 71 72 // Access ----------------------------------------------------------------- 73 74 public: 75 vector_adaptor()76 vector_adaptor() {} 77 vector_adaptor(Base & c)78 explicit vector_adaptor(Base & c) : 79 base_(c) {} 80 81 protected: 82 83 typedef vector_adaptor vector_adaptor_; 84 85 // Interface -------------------------------------------------------------- 86 87 public: 88 capacity() const89 BOOST_DEDUCED_TYPENAME base_::size_type capacity() const 90 { 91 return this->base().capacity(); 92 } 93 reserve(BOOST_DEDUCED_TYPENAME base_::size_type m)94 void reserve(BOOST_DEDUCED_TYPENAME base_::size_type m) 95 { 96 this->base().resize(m); 97 } 98 resize(BOOST_DEDUCED_TYPENAME base_::size_type n,BOOST_DEDUCED_TYPENAME::boost::call_traits<BOOST_DEDUCED_TYPENAME base_::value_type>::param_type x=BOOST_DEDUCED_TYPENAME base_::value_type ())99 void resize(BOOST_DEDUCED_TYPENAME base_::size_type n, 100 BOOST_DEDUCED_TYPENAME ::boost::call_traits< 101 BOOST_DEDUCED_TYPENAME base_::value_type >::param_type x = 102 BOOST_DEDUCED_TYPENAME base_::value_type()) 103 { 104 this->base().resize(n, 105 this->template functor<BOOST_DEDUCED_TYPENAME base_::value_to_base>()(x) 106 ); 107 } 108 109 BOOST_DEDUCED_TYPENAME base_::const_reference operator [](BOOST_DEDUCED_TYPENAME base_::size_type n) const110 operator[](BOOST_DEDUCED_TYPENAME base_::size_type n) const 111 { 112 return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()( 113 this->base().operator[](n) 114 ); 115 } 116 117 BOOST_DEDUCED_TYPENAME base_::const_reference at(BOOST_DEDUCED_TYPENAME base_::size_type n) const118 at(BOOST_DEDUCED_TYPENAME base_::size_type n) const 119 { 120 return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()( 121 this->base().at(n) 122 ); 123 } 124 125 BOOST_DEDUCED_TYPENAME base_::reference operator [](BOOST_DEDUCED_TYPENAME base_::size_type n)126 operator[](BOOST_DEDUCED_TYPENAME base_::size_type n) 127 { 128 return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()( 129 this->base().operator[](n) 130 ); 131 } 132 133 BOOST_DEDUCED_TYPENAME base_::reference at(BOOST_DEDUCED_TYPENAME base_::size_type n)134 at(BOOST_DEDUCED_TYPENAME base_::size_type n) 135 { 136 return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()( 137 this->base().at(n) 138 ); 139 } 140 }; 141 142 143 } // namespace container_adaptor 144 } // namespace bimaps 145 } // namespace boost 146 147 148 #endif // BOOST_BIMAP_CONTAINER_ADAPTOR_VECTOR_ADAPTOR_HPP 149 150 151