annotate DEPENDENCIES/generic/include/boost/bimap/detail/set_view_base.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 // Boost.Bimap
Chris@16 2 //
Chris@16 3 // Copyright (c) 2006-2007 Matias Capeletto
Chris@16 4 //
Chris@16 5 // Distributed under the Boost Software License, Version 1.0.
Chris@16 6 // (See accompanying file LICENSE_1_0.txt or copy at
Chris@16 7 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 8
Chris@16 9 /// \file detail/set_view_base.hpp
Chris@16 10 /// \brief Helper base for the construction of the bimap views types.
Chris@16 11
Chris@16 12 #ifndef BOOST_BIMAP_DETAIL_SET_VIEW_BASE_HPP
Chris@16 13 #define BOOST_BIMAP_DETAIL_SET_VIEW_BASE_HPP
Chris@16 14
Chris@101 15 #if defined(_MSC_VER)
Chris@16 16 #pragma once
Chris@16 17 #endif
Chris@16 18
Chris@16 19 #include <boost/config.hpp>
Chris@16 20
Chris@16 21 #include <boost/bimap/relation/member_at.hpp>
Chris@16 22 #include <boost/bimap/relation/support/data_extractor.hpp>
Chris@16 23 #include <boost/bimap/detail/modifier_adaptor.hpp>
Chris@16 24 #include <boost/bimap/detail/set_view_iterator.hpp>
Chris@16 25 #include <boost/bimap/relation/support/get_pair_functor.hpp>
Chris@16 26 #include <boost/bimap/relation/detail/to_mutable_relation_functor.hpp>
Chris@16 27 #include <boost/bimap/relation/mutant_relation.hpp>
Chris@16 28 #include <boost/bimap/container_adaptor/support/iterator_facade_converters.hpp>
Chris@16 29
Chris@16 30 namespace boost {
Chris@16 31 namespace bimaps {
Chris@16 32 namespace detail {
Chris@16 33
Chris@16 34 template< class Key, class Value, class KeyToBase >
Chris@16 35 class set_view_key_to_base
Chris@16 36 {
Chris@16 37 public:
Chris@16 38 const Key operator()( const Value & v ) const
Chris@16 39 {
Chris@16 40 return keyToBase( v );
Chris@16 41 }
Chris@16 42 private:
Chris@16 43 KeyToBase keyToBase;
Chris@16 44 };
Chris@16 45
Chris@16 46 template< class MutantRelationStorage, class KeyToBase >
Chris@16 47 class set_view_key_to_base<MutantRelationStorage,MutantRelationStorage,KeyToBase>
Chris@16 48 {
Chris@16 49 typedef BOOST_DEDUCED_TYPENAME MutantRelationStorage::non_mutable_storage non_mutable_storage;
Chris@16 50 public:
Chris@16 51 const MutantRelationStorage & operator()( const non_mutable_storage & k ) const
Chris@16 52 {
Chris@16 53 return ::boost::bimaps::relation::detail::mutate<MutantRelationStorage>(k);
Chris@16 54 }
Chris@16 55 const MutantRelationStorage & operator()( const MutantRelationStorage & k ) const
Chris@16 56 {
Chris@16 57 return k;
Chris@16 58 }
Chris@16 59 };
Chris@16 60
Chris@16 61
Chris@16 62 // The next macro can be converted in a metafunctor to gain code robustness.
Chris@16 63 /*===========================================================================*/
Chris@16 64 #define BOOST_BIMAP_SET_VIEW_CONTAINER_ADAPTOR( \
Chris@16 65 CONTAINER_ADAPTOR, CORE_INDEX, OTHER_ITER, CONST_OTHER_ITER \
Chris@16 66 ) \
Chris@16 67 ::boost::bimaps::container_adaptor::CONTAINER_ADAPTOR \
Chris@16 68 < \
Chris@16 69 CORE_INDEX, \
Chris@16 70 ::boost::bimaps::detail:: \
Chris@16 71 set_view_iterator< \
Chris@16 72 BOOST_DEDUCED_TYPENAME CORE_INDEX::iterator >, \
Chris@16 73 ::boost::bimaps::detail:: \
Chris@16 74 const_set_view_iterator< \
Chris@16 75 BOOST_DEDUCED_TYPENAME CORE_INDEX::const_iterator >, \
Chris@16 76 ::boost::bimaps::detail:: \
Chris@16 77 set_view_iterator< \
Chris@16 78 BOOST_DEDUCED_TYPENAME CORE_INDEX::OTHER_ITER >, \
Chris@16 79 ::boost::bimaps::detail:: \
Chris@16 80 const_set_view_iterator< \
Chris@16 81 BOOST_DEDUCED_TYPENAME CORE_INDEX::CONST_OTHER_ITER >, \
Chris@16 82 ::boost::bimaps::container_adaptor::support::iterator_facade_to_base \
Chris@16 83 < \
Chris@16 84 ::boost::bimaps::detail:: set_view_iterator< \
Chris@16 85 BOOST_DEDUCED_TYPENAME CORE_INDEX::iterator>, \
Chris@16 86 ::boost::bimaps::detail::const_set_view_iterator< \
Chris@16 87 BOOST_DEDUCED_TYPENAME CORE_INDEX::const_iterator> \
Chris@16 88 \
Chris@16 89 >, \
Chris@16 90 ::boost::mpl::na, \
Chris@16 91 ::boost::mpl::na, \
Chris@16 92 ::boost::bimaps::relation::detail:: \
Chris@16 93 get_mutable_relation_functor< \
Chris@16 94 BOOST_DEDUCED_TYPENAME CORE_INDEX::value_type >, \
Chris@16 95 ::boost::bimaps::relation::support:: \
Chris@16 96 get_above_view_functor< \
Chris@16 97 BOOST_DEDUCED_TYPENAME CORE_INDEX::value_type >, \
Chris@16 98 ::boost::bimaps::detail::set_view_key_to_base< \
Chris@16 99 BOOST_DEDUCED_TYPENAME CORE_INDEX::key_type, \
Chris@16 100 BOOST_DEDUCED_TYPENAME CORE_INDEX::value_type, \
Chris@16 101 BOOST_DEDUCED_TYPENAME CORE_INDEX::key_from_value \
Chris@16 102 > \
Chris@16 103 >
Chris@16 104 /*===========================================================================*/
Chris@16 105
Chris@16 106
Chris@16 107 /*===========================================================================*/
Chris@16 108 #define BOOST_BIMAP_SEQUENCED_SET_VIEW_CONTAINER_ADAPTOR( \
Chris@16 109 CONTAINER_ADAPTOR, CORE_INDEX, OTHER_ITER, CONST_OTHER_ITER \
Chris@16 110 ) \
Chris@16 111 ::boost::bimaps::container_adaptor::CONTAINER_ADAPTOR \
Chris@16 112 < \
Chris@16 113 CORE_INDEX, \
Chris@16 114 ::boost::bimaps::detail:: \
Chris@16 115 set_view_iterator< \
Chris@16 116 BOOST_DEDUCED_TYPENAME CORE_INDEX::iterator >, \
Chris@16 117 ::boost::bimaps::detail:: \
Chris@16 118 const_set_view_iterator< \
Chris@16 119 BOOST_DEDUCED_TYPENAME CORE_INDEX::const_iterator >, \
Chris@16 120 ::boost::bimaps::detail:: \
Chris@16 121 set_view_iterator< \
Chris@16 122 BOOST_DEDUCED_TYPENAME CORE_INDEX::OTHER_ITER >, \
Chris@16 123 ::boost::bimaps::detail:: \
Chris@16 124 const_set_view_iterator< \
Chris@16 125 BOOST_DEDUCED_TYPENAME CORE_INDEX::CONST_OTHER_ITER >, \
Chris@16 126 ::boost::bimaps::container_adaptor::support::iterator_facade_to_base \
Chris@16 127 < \
Chris@16 128 ::boost::bimaps::detail:: set_view_iterator< \
Chris@16 129 BOOST_DEDUCED_TYPENAME CORE_INDEX::iterator>, \
Chris@16 130 ::boost::bimaps::detail::const_set_view_iterator< \
Chris@16 131 BOOST_DEDUCED_TYPENAME CORE_INDEX::const_iterator> \
Chris@16 132 \
Chris@16 133 >, \
Chris@16 134 ::boost::mpl::na, \
Chris@16 135 ::boost::mpl::na, \
Chris@16 136 ::boost::bimaps::relation::detail:: \
Chris@16 137 get_mutable_relation_functor< \
Chris@16 138 BOOST_DEDUCED_TYPENAME CORE_INDEX::value_type >, \
Chris@16 139 ::boost::bimaps::relation::support:: \
Chris@16 140 get_above_view_functor< \
Chris@16 141 BOOST_DEDUCED_TYPENAME CORE_INDEX::value_type > \
Chris@16 142 >
Chris@16 143 /*===========================================================================*/
Chris@16 144
Chris@16 145
Chris@16 146 #if defined(BOOST_MSVC)
Chris@16 147 /*===========================================================================*/
Chris@16 148 #define BOOST_BIMAP_SET_VIEW_BASE_FRIEND(TYPE,INDEX_TYPE) \
Chris@16 149 typedef ::boost::bimaps::detail::set_view_base< \
Chris@16 150 TYPE< INDEX_TYPE >, INDEX_TYPE > template_class_friend; \
Chris@16 151 friend class template_class_friend;
Chris@16 152 /*===========================================================================*/
Chris@16 153 #else
Chris@16 154 /*===========================================================================*/
Chris@16 155 #define BOOST_BIMAP_SET_VIEW_BASE_FRIEND(TYPE,INDEX_TYPE) \
Chris@16 156 friend class ::boost::bimaps::detail::set_view_base< \
Chris@16 157 TYPE< INDEX_TYPE >, INDEX_TYPE >;
Chris@16 158 /*===========================================================================*/
Chris@16 159 #endif
Chris@16 160
Chris@16 161
Chris@16 162 /// \brief Common base for set views.
Chris@16 163
Chris@16 164 template< class Derived, class Index >
Chris@16 165 class set_view_base
Chris@16 166 {
Chris@16 167 typedef ::boost::bimaps::container_adaptor::support::
Chris@16 168 iterator_facade_to_base
Chris@16 169 <
Chris@16 170 ::boost::bimaps::detail::
Chris@16 171 set_view_iterator<BOOST_DEDUCED_TYPENAME Index:: iterator>,
Chris@16 172 ::boost::bimaps::detail::
Chris@16 173 const_set_view_iterator<BOOST_DEDUCED_TYPENAME Index::const_iterator>
Chris@16 174
Chris@16 175 > iterator_to_base_;
Chris@16 176
Chris@16 177 typedef BOOST_DEDUCED_TYPENAME Index::value_type::left_value_type left_type_;
Chris@16 178
Chris@16 179 typedef BOOST_DEDUCED_TYPENAME Index::value_type::right_value_type right_type_;
Chris@16 180
Chris@16 181 typedef BOOST_DEDUCED_TYPENAME Index::value_type value_type_;
Chris@16 182
Chris@16 183 typedef ::boost::bimaps::detail::
Chris@16 184 set_view_iterator<BOOST_DEDUCED_TYPENAME Index::iterator> iterator_;
Chris@16 185
Chris@16 186 public:
Chris@16 187
Chris@16 188 bool replace(iterator_ position,
Chris@16 189 const value_type_ & x)
Chris@16 190 {
Chris@16 191 return derived().base().replace(
Chris@16 192 derived().template functor<iterator_to_base_>()(position),x
Chris@16 193 );
Chris@16 194 }
Chris@16 195
Chris@16 196 template< class CompatibleLeftType >
Chris@16 197 bool replace_left(iterator_ position,
Chris@16 198 const CompatibleLeftType & l)
Chris@16 199 {
Chris@16 200 return derived().base().replace(
Chris@16 201 derived().template functor<iterator_to_base_>()(position),
Chris@16 202 ::boost::bimaps::relation::detail::copy_with_left_replaced(*position,l)
Chris@16 203 );
Chris@16 204 }
Chris@16 205
Chris@16 206 template< class CompatibleRightType >
Chris@16 207 bool replace_right(iterator_ position,
Chris@16 208 const CompatibleRightType & r)
Chris@16 209 {
Chris@16 210 return derived().base().replace(
Chris@16 211 derived().template functor<iterator_to_base_>()(position),
Chris@16 212 ::boost::bimaps::relation::detail::copy_with_right_replaced(*position,r)
Chris@16 213 );
Chris@16 214 }
Chris@16 215
Chris@16 216 /* This function may be provided in the future
Chris@16 217
Chris@16 218 template< class Modifier >
Chris@16 219 bool modify(iterator_ position,
Chris@16 220 Modifier mod)
Chris@16 221 {
Chris@16 222 return derived().base().modify(
Chris@16 223
Chris@16 224 derived().template functor<iterator_to_base_>()(position),
Chris@16 225
Chris@16 226 ::boost::bimaps::detail::relation_modifier_adaptor
Chris@16 227 <
Chris@16 228 Modifier,
Chris@16 229 BOOST_DEDUCED_TYPENAME Index::value_type,
Chris@16 230 BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support::
Chris@16 231 data_extractor
Chris@16 232 <
Chris@16 233 ::boost::bimaps::relation::member_at::left,
Chris@16 234 BOOST_DEDUCED_TYPENAME Index::value_type
Chris@16 235
Chris@16 236 >::type,
Chris@16 237 BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support::
Chris@16 238 data_extractor
Chris@16 239 <
Chris@16 240 ::boost::bimaps::relation::member_at::right,
Chris@16 241 BOOST_DEDUCED_TYPENAME Index::value_type
Chris@16 242
Chris@16 243 >::type
Chris@16 244
Chris@16 245 >(mod)
Chris@16 246 );
Chris@16 247 }
Chris@16 248 */
Chris@16 249 /*
Chris@16 250 template< class Modifier >
Chris@16 251 bool modify_left(iterator_ position, Modifier mod)
Chris@16 252 {
Chris@16 253 typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support::
Chris@16 254 data_extractor
Chris@16 255 <
Chris@16 256 BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::member_at::right,
Chris@16 257 BOOST_DEDUCED_TYPENAME Index::value_type
Chris@16 258
Chris@16 259 >::type left_data_extractor_;
Chris@16 260
Chris@16 261 return derived().base().modify(
Chris@16 262
Chris@16 263 derived().template functor<iterator_to_base_>()(position),
Chris@16 264
Chris@16 265 // this may be replaced later by
Chris@16 266 // ::boost::bind( mod, ::boost::bind(data_extractor_(),_1) )
Chris@16 267
Chris@16 268 ::boost::bimaps::detail::unary_modifier_adaptor
Chris@16 269 <
Chris@16 270 Modifier,
Chris@16 271 BOOST_DEDUCED_TYPENAME Index::value_type,
Chris@16 272 left_data_extractor_
Chris@16 273
Chris@16 274 >(mod)
Chris@16 275 );
Chris@16 276 }
Chris@16 277
Chris@16 278 template< class Modifier >
Chris@16 279 bool modify_right(iterator_ position, Modifier mod)
Chris@16 280 {
Chris@16 281 typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support::
Chris@16 282 data_extractor
Chris@16 283 <
Chris@16 284 BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::member_at::right,
Chris@16 285 BOOST_DEDUCED_TYPENAME Index::value_type
Chris@16 286
Chris@16 287 >::type right_data_extractor_;
Chris@16 288
Chris@16 289 return derived().base().modify(
Chris@16 290
Chris@16 291 derived().template functor<iterator_to_base_>()(position),
Chris@16 292
Chris@16 293 // this may be replaced later by
Chris@16 294 // ::boost::bind( mod, ::boost::bind(data_extractor_(),_1) )
Chris@16 295
Chris@16 296 ::boost::bimaps::detail::unary_modifier_adaptor
Chris@16 297 <
Chris@16 298 Modifier,
Chris@16 299 BOOST_DEDUCED_TYPENAME Index::value_type,
Chris@16 300 right_data_extractor_
Chris@16 301
Chris@16 302 >(mod)
Chris@16 303 );
Chris@16 304 }
Chris@16 305 */
Chris@16 306 protected:
Chris@16 307
Chris@16 308 typedef set_view_base set_view_base_;
Chris@16 309
Chris@16 310 private:
Chris@16 311
Chris@16 312 // Curiously Recurring Template interface.
Chris@16 313
Chris@16 314 Derived& derived()
Chris@16 315 {
Chris@16 316 return *static_cast<Derived*>(this);
Chris@16 317 }
Chris@16 318
Chris@16 319 Derived const& derived() const
Chris@16 320 {
Chris@16 321 return *static_cast<Derived const*>(this);
Chris@16 322 }
Chris@16 323 };
Chris@16 324
Chris@16 325
Chris@16 326
Chris@16 327 } // namespace detail
Chris@16 328 } // namespace bimaps
Chris@16 329 } // namespace boost
Chris@16 330
Chris@16 331 #endif // BOOST_BIMAP_DETAIL_SET_VIEW_BASE_HPP