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 views/vector_set_view.hpp 10 /// \brief View of a side of a bimap that is signature compatible with std::vector. 11 12 #ifndef BOOST_BIMAP_VIEWS_VECTOR_SET_VIEW_HPP 13 #define BOOST_BIMAP_VIEWS_VECTOR_SET_VIEW_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/vector_adaptor.hpp> 22 #include <boost/bimap/container_adaptor/detail/comparison_adaptor.hpp> 23 #include <boost/bimap/detail/set_view_base.hpp> 24 #include <boost/bimap/detail/map_view_base.hpp> 25 26 namespace boost { 27 namespace bimaps { 28 namespace views { 29 30 /// \brief View of a bimap that is signature compatible with std::vector. 31 /** 32 33 This class uses container_adaptor and iterator_adaptor to wrapped a index of the 34 multi_index bimap core so it can be used as a std::vector. 35 36 See also const_set_view. 37 **/ 38 39 template< class CoreIndex > 40 class vector_set_view 41 : 42 public BOOST_BIMAP_SEQUENCED_SET_VIEW_CONTAINER_ADAPTOR( 43 vector_adaptor, 44 CoreIndex, 45 reverse_iterator, const_reverse_iterator 46 ), 47 48 public ::boost::bimaps::detail:: 49 set_view_base< vector_set_view< CoreIndex >, CoreIndex > 50 { 51 BOOST_BIMAP_SET_VIEW_BASE_FRIEND(vector_set_view,CoreIndex) 52 53 typedef BOOST_BIMAP_SEQUENCED_SET_VIEW_CONTAINER_ADAPTOR( 54 vector_adaptor, 55 CoreIndex, 56 reverse_iterator, const_reverse_iterator 57 58 ) base_; 59 60 public: 61 vector_set_view(BOOST_DEDUCED_TYPENAME base_::base_type & c)62 vector_set_view(BOOST_DEDUCED_TYPENAME base_::base_type & c) : 63 base_(c) {} 64 operator =(const vector_set_view & v)65 vector_set_view & operator=(const vector_set_view & v) 66 { 67 this->base() = v.base(); 68 return *this; 69 } 70 71 BOOST_DEDUCED_TYPENAME base_::const_reference operator [](BOOST_DEDUCED_TYPENAME base_::size_type n) const72 operator[](BOOST_DEDUCED_TYPENAME base_::size_type n) const 73 { 74 return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()( 75 this->base().operator[](n) 76 ); 77 } 78 79 BOOST_DEDUCED_TYPENAME base_::const_reference at(BOOST_DEDUCED_TYPENAME base_::size_type n) const80 at(BOOST_DEDUCED_TYPENAME base_::size_type n) const 81 { 82 return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()( 83 this->base().at(n) 84 ); 85 } 86 87 BOOST_DEDUCED_TYPENAME base_::reference operator [](BOOST_DEDUCED_TYPENAME base_::size_type n)88 operator[](BOOST_DEDUCED_TYPENAME base_::size_type n) 89 { 90 return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()( 91 const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type &>( 92 this->base().operator[](n) 93 )); 94 } 95 96 BOOST_DEDUCED_TYPENAME base_::reference at(BOOST_DEDUCED_TYPENAME base_::size_type n)97 at(BOOST_DEDUCED_TYPENAME base_::size_type n) 98 { 99 return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()( 100 const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type &>( 101 this->base().at(n) 102 )); 103 } 104 105 BOOST_BIMAP_VIEW_ASSIGN_IMPLEMENTATION(base_) 106 BOOST_BIMAP_VIEW_FRONT_BACK_IMPLEMENTATION(base_)107 BOOST_BIMAP_VIEW_FRONT_BACK_IMPLEMENTATION(base_) 108 109 // List operations 110 111 void splice(BOOST_DEDUCED_TYPENAME base_::iterator position, 112 vector_set_view & x) 113 { 114 this->base().splice( 115 this->template functor< 116 BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position), 117 x.base() 118 ); 119 } 120 splice(BOOST_DEDUCED_TYPENAME base_::iterator position,vector_set_view & x,BOOST_DEDUCED_TYPENAME base_::iterator i)121 void splice(BOOST_DEDUCED_TYPENAME base_::iterator position, 122 vector_set_view & x, 123 BOOST_DEDUCED_TYPENAME base_::iterator i) 124 { 125 this->base().splice( 126 this->template functor< 127 BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position), 128 x.base(), 129 this->template functor< 130 BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(i) 131 ); 132 } 133 splice(BOOST_DEDUCED_TYPENAME base_::iterator position,vector_set_view & x,BOOST_DEDUCED_TYPENAME base_::iterator first,BOOST_DEDUCED_TYPENAME base_::iterator last)134 void splice(BOOST_DEDUCED_TYPENAME base_::iterator position, 135 vector_set_view & x, 136 BOOST_DEDUCED_TYPENAME base_::iterator first, 137 BOOST_DEDUCED_TYPENAME base_::iterator last) 138 { 139 this->base().splice( 140 this->template functor< 141 BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position), 142 x.base(), 143 this->template functor< 144 BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(first), 145 this->template functor< 146 BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(last) 147 ); 148 } 149 remove(BOOST_DEDUCED_TYPENAME::boost::call_traits<BOOST_DEDUCED_TYPENAME base_::value_type>::param_type value)150 void remove(BOOST_DEDUCED_TYPENAME ::boost::call_traits< 151 BOOST_DEDUCED_TYPENAME base_::value_type >::param_type value) 152 { 153 this->base().remove( 154 this->template functor< 155 BOOST_DEDUCED_TYPENAME base_::value_to_base>()(value) 156 ); 157 } 158 159 template<typename Predicate> remove_if(Predicate pred)160 void remove_if(Predicate pred) 161 { 162 this->base().remove_if( 163 ::boost::bimaps::container_adaptor::detail::unary_check_adaptor 164 < 165 Predicate, 166 BOOST_DEDUCED_TYPENAME base_::base_type::value_type, 167 BOOST_DEDUCED_TYPENAME base_::value_from_base 168 169 >( pred, this->template functor< 170 BOOST_DEDUCED_TYPENAME base_::value_from_base>() ) 171 ); 172 } 173 unique()174 void unique() 175 { 176 this->base().unique( 177 ::boost::bimaps::container_adaptor::detail::comparison_adaptor 178 < 179 std::equal_to<BOOST_DEDUCED_TYPENAME base_::value_type>, 180 BOOST_DEDUCED_TYPENAME base_::base_type::value_type, 181 BOOST_DEDUCED_TYPENAME base_::value_from_base 182 183 >( 184 std::equal_to<BOOST_DEDUCED_TYPENAME base_::value_type>(), 185 this->template functor< 186 BOOST_DEDUCED_TYPENAME base_::value_from_base>() 187 ) 188 ); 189 } 190 191 template< class BinaryPredicate > unique(BinaryPredicate binary_pred)192 void unique(BinaryPredicate binary_pred) 193 { 194 this->base().unique( 195 ::boost::bimaps::container_adaptor::detail::comparison_adaptor 196 < 197 BinaryPredicate, 198 BOOST_DEDUCED_TYPENAME base_::base_type::value_type, 199 BOOST_DEDUCED_TYPENAME base_::value_from_base 200 201 >( binary_pred, 202 this->template functor< 203 BOOST_DEDUCED_TYPENAME base_::value_from_base>() 204 ) 205 ); 206 } 207 merge(vector_set_view & x)208 void merge(vector_set_view & x) 209 { 210 this->base().merge(x.base(), 211 ::boost::bimaps::container_adaptor::detail::comparison_adaptor 212 < 213 std::less<BOOST_DEDUCED_TYPENAME base_::value_type>, 214 BOOST_DEDUCED_TYPENAME base_::base_type::value_type, 215 BOOST_DEDUCED_TYPENAME base_::value_from_base 216 217 >( 218 std::less<BOOST_DEDUCED_TYPENAME base_::value_type>(), 219 this->template functor< 220 BOOST_DEDUCED_TYPENAME base_::value_from_base>() 221 ) 222 ); 223 } 224 225 template< class Compare > merge(vector_set_view & x,Compare comp)226 void merge(vector_set_view & x, Compare comp) 227 { 228 this->base().merge(x.base(), 229 ::boost::bimaps::container_adaptor::detail::comparison_adaptor 230 < 231 Compare, 232 BOOST_DEDUCED_TYPENAME base_::base_type::value_type, 233 BOOST_DEDUCED_TYPENAME base_::value_from_base 234 235 >( comp, this->template functor< 236 BOOST_DEDUCED_TYPENAME base_::value_from_base>() ) 237 ); 238 } 239 sort()240 void sort() 241 { 242 this->base().sort( 243 ::boost::bimaps::container_adaptor::detail::comparison_adaptor 244 < 245 std::less<BOOST_DEDUCED_TYPENAME base_::value_type>, 246 BOOST_DEDUCED_TYPENAME base_::base_type::value_type, 247 BOOST_DEDUCED_TYPENAME base_::value_from_base 248 249 >( 250 std::less<BOOST_DEDUCED_TYPENAME base_::value_type>(), 251 this->template functor< 252 BOOST_DEDUCED_TYPENAME base_::value_from_base>() 253 ) 254 ); 255 } 256 257 template< class Compare > sort(Compare comp)258 void sort(Compare comp) 259 { 260 this->base().sort( 261 ::boost::bimaps::container_adaptor::detail::comparison_adaptor 262 < 263 Compare, 264 BOOST_DEDUCED_TYPENAME base_::base_type::value_type, 265 BOOST_DEDUCED_TYPENAME base_::value_from_base 266 267 >( comp, this->template functor< 268 BOOST_DEDUCED_TYPENAME base_::value_from_base>() ) 269 ); 270 } 271 reverse()272 void reverse() 273 { 274 this->base().reverse(); 275 } 276 277 // Rearrange Operations 278 relocate(BOOST_DEDUCED_TYPENAME base_::iterator position,BOOST_DEDUCED_TYPENAME base_::iterator i)279 void relocate(BOOST_DEDUCED_TYPENAME base_::iterator position, 280 BOOST_DEDUCED_TYPENAME base_::iterator i) 281 { 282 this->base().relocate( 283 this->template functor< 284 BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position), 285 this->template functor< 286 BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(i) 287 ); 288 } 289 relocate(BOOST_DEDUCED_TYPENAME base_::iterator position,BOOST_DEDUCED_TYPENAME base_::iterator first,BOOST_DEDUCED_TYPENAME base_::iterator last)290 void relocate(BOOST_DEDUCED_TYPENAME base_::iterator position, 291 BOOST_DEDUCED_TYPENAME base_::iterator first, 292 BOOST_DEDUCED_TYPENAME base_::iterator last) 293 { 294 this->base().relocate( 295 this->template functor< 296 BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position), 297 this->template functor< 298 BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(first), 299 this->template functor< 300 BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(last) 301 ); 302 } 303 304 }; 305 306 307 } // namespace views 308 } // namespace bimaps 309 } // namespace boost 310 311 312 #endif // BOOST_BIMAP_VIEWS_VECTOR_SET_VIEW_HPP 313 314