annotate DEPENDENCIES/generic/include/boost/bimap/container_adaptor/list_map_adaptor.hpp @ 44:0036098a5edb

Add further environmental tests; factor out logfile_for
author Chris Cannam
date Thu, 07 Aug 2014 13:37:13 +0100
parents 2665513ce2d3
children c530137014c0
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 container_adaptor/list_map_adaptor.hpp
Chris@16 10 /// \brief Container adaptor.
Chris@16 11
Chris@16 12 #ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_LIST_MAP_ADAPTOR_HPP
Chris@16 13 #define BOOST_BIMAP_CONTAINER_ADAPTOR_LIST_MAP_ADAPTOR_HPP
Chris@16 14
Chris@16 15 #if defined(_MSC_VER) && (_MSC_VER>=1200)
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/mpl/list.hpp>
Chris@16 22 #include <boost/mpl/push_front.hpp>
Chris@16 23
Chris@16 24 #include <boost/bimap/container_adaptor/list_adaptor.hpp>
Chris@16 25 #include <boost/bimap/container_adaptor/detail/identity_converters.hpp>
Chris@16 26 #include <boost/bimap/container_adaptor/detail/key_extractor.hpp>
Chris@16 27 #include <boost/bimap/container_adaptor/detail/comparison_adaptor.hpp>
Chris@16 28 #include <boost/mpl/vector.hpp>
Chris@16 29 #include <boost/mpl/aux_/na.hpp>
Chris@16 30 #include <boost/mpl/if.hpp>
Chris@16 31
Chris@16 32 namespace boost {
Chris@16 33 namespace bimaps {
Chris@16 34 namespace container_adaptor {
Chris@16 35
Chris@16 36 #ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
Chris@16 37
Chris@16 38 template
Chris@16 39 <
Chris@16 40 class Base, class Iterator, class ConstIterator,
Chris@16 41 class ReverseIterator, class ConstReverseIterator,
Chris@16 42 class IteratorToBaseConverter, class IteratorFromBaseConverter,
Chris@16 43 class ReverseIteratorFromBaseConverter,
Chris@16 44 class ValueToBaseConverter, class ValueFromBaseConverter,
Chris@16 45 class KeyFromBaseValueConverter,
Chris@16 46 class FunctorsFromDerivedClasses
Chris@16 47 >
Chris@16 48 struct list_map_adaptor_base
Chris@16 49 {
Chris@16 50 typedef list_adaptor
Chris@16 51 <
Chris@16 52 Base,
Chris@16 53
Chris@16 54 Iterator, ConstIterator, ReverseIterator, ConstReverseIterator,
Chris@16 55
Chris@16 56 IteratorToBaseConverter, IteratorFromBaseConverter,
Chris@16 57
Chris@16 58 ReverseIteratorFromBaseConverter,
Chris@16 59
Chris@16 60 ValueToBaseConverter, ValueFromBaseConverter,
Chris@16 61
Chris@16 62 BOOST_DEDUCED_TYPENAME mpl::push_front<
Chris@16 63
Chris@16 64 FunctorsFromDerivedClasses,
Chris@16 65
Chris@16 66 BOOST_DEDUCED_TYPENAME mpl::if_< ::boost::mpl::is_na<KeyFromBaseValueConverter>,
Chris@16 67 // {
Chris@16 68 detail::key_from_pair_extractor
Chris@16 69 <
Chris@16 70 BOOST_DEDUCED_TYPENAME Iterator::value_type
Chris@16 71 >,
Chris@16 72 // }
Chris@16 73 // else
Chris@16 74 // {
Chris@16 75 KeyFromBaseValueConverter
Chris@16 76 // }
Chris@16 77
Chris@16 78 >::type
Chris@16 79
Chris@16 80 >::type
Chris@16 81
Chris@16 82 > type;
Chris@16 83 };
Chris@16 84
Chris@16 85 #endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES
Chris@16 86
Chris@16 87 /// \brief Container adaptor to easily build a list map container
Chris@16 88
Chris@16 89 template
Chris@16 90 <
Chris@16 91 class Base,
Chris@16 92
Chris@16 93 class Iterator,
Chris@16 94 class ConstIterator,
Chris@16 95 class ReverseIterator,
Chris@16 96 class ConstReverseIterator,
Chris@16 97
Chris@16 98 class IteratorToBaseConverter = ::boost::mpl::na,
Chris@16 99 class IteratorFromBaseConverter = ::boost::mpl::na,
Chris@16 100 class ReverseIteratorFromBaseConverter = ::boost::mpl::na,
Chris@16 101 class ValueToBaseConverter = ::boost::mpl::na,
Chris@16 102 class ValueFromBaseConverter = ::boost::mpl::na,
Chris@16 103 class KeyFromBaseValueConverter = ::boost::mpl::na,
Chris@16 104
Chris@16 105 class FunctorsFromDerivedClasses = mpl::vector<>
Chris@16 106 >
Chris@16 107 class list_map_adaptor :
Chris@16 108
Chris@16 109 public list_map_adaptor_base
Chris@16 110 <
Chris@16 111 Base, Iterator, ConstIterator, ReverseIterator, ConstReverseIterator,
Chris@16 112 IteratorToBaseConverter, IteratorFromBaseConverter,
Chris@16 113 ReverseIteratorFromBaseConverter,
Chris@16 114 ValueToBaseConverter, ValueFromBaseConverter,
Chris@16 115 KeyFromBaseValueConverter,
Chris@16 116 FunctorsFromDerivedClasses
Chris@16 117
Chris@16 118 >::type
Chris@16 119 {
Chris@16 120 typedef BOOST_DEDUCED_TYPENAME list_map_adaptor_base
Chris@16 121 <
Chris@16 122 Base, Iterator, ConstIterator, ReverseIterator, ConstReverseIterator,
Chris@16 123 IteratorToBaseConverter, IteratorFromBaseConverter,
Chris@16 124 ReverseIteratorFromBaseConverter,
Chris@16 125 ValueToBaseConverter, ValueFromBaseConverter,
Chris@16 126 KeyFromBaseValueConverter,
Chris@16 127 FunctorsFromDerivedClasses
Chris@16 128
Chris@16 129 >::type base_;
Chris@16 130
Chris@16 131 // MetaData -------------------------------------------------------------
Chris@16 132
Chris@16 133 public:
Chris@16 134
Chris@16 135 typedef BOOST_DEDUCED_TYPENAME Iterator::value_type::first_type key_type;
Chris@16 136 typedef BOOST_DEDUCED_TYPENAME Iterator::value_type::second_type data_type;
Chris@16 137 typedef data_type mapped_type;
Chris@16 138
Chris@16 139 protected:
Chris@16 140
Chris@16 141 typedef BOOST_DEDUCED_TYPENAME mpl::if_< ::boost::mpl::is_na<KeyFromBaseValueConverter>,
Chris@16 142 // {
Chris@16 143 detail::key_from_pair_extractor< BOOST_DEDUCED_TYPENAME Iterator::value_type >,
Chris@16 144 // }
Chris@16 145 // else
Chris@16 146 // {
Chris@16 147 KeyFromBaseValueConverter
Chris@16 148 // }
Chris@16 149
Chris@16 150 >::type key_from_base_value;
Chris@16 151
Chris@16 152 // Access -----------------------------------------------------------------
Chris@16 153
Chris@16 154 public:
Chris@16 155
Chris@16 156 explicit list_map_adaptor(Base & c) :
Chris@16 157 base_(c) {}
Chris@16 158
Chris@16 159 protected:
Chris@16 160
Chris@16 161 typedef list_map_adaptor list_map_adaptor_;
Chris@16 162
Chris@16 163 // Functions -------------------------------------------------------------
Chris@16 164
Chris@16 165 public:
Chris@16 166
Chris@16 167 // The following functions are overwritten in order to work
Chris@16 168 // with key_type instead of value_type
Chris@16 169
Chris@16 170 template< class Predicate >
Chris@16 171 void remove_if(Predicate pred)
Chris@16 172 {
Chris@16 173 this->base().remove_if(
Chris@16 174 ::boost::bimaps::container_adaptor::detail::unary_check_adaptor
Chris@16 175 <
Chris@16 176 Predicate,
Chris@16 177 BOOST_DEDUCED_TYPENAME Base::value_type,
Chris@16 178 key_from_base_value
Chris@16 179
Chris@16 180 >( pred, this->template functor<key_from_base_value>() )
Chris@16 181 );
Chris@16 182 }
Chris@16 183
Chris@16 184 void unique()
Chris@16 185 {
Chris@16 186 this->base().unique(
Chris@16 187 ::boost::bimaps::container_adaptor::detail::comparison_adaptor
Chris@16 188 <
Chris@16 189 std::equal_to<key_type>,
Chris@16 190 BOOST_DEDUCED_TYPENAME Base::value_type,
Chris@16 191 key_from_base_value
Chris@16 192
Chris@16 193 >(
Chris@16 194 std::equal_to<key_type>(),
Chris@16 195 this->template functor<key_from_base_value>()
Chris@16 196 )
Chris@16 197 );
Chris@16 198 }
Chris@16 199
Chris@16 200 template< class BinaryPredicate >
Chris@16 201 void unique(BinaryPredicate binary_pred)
Chris@16 202 {
Chris@16 203 this->base().unique(
Chris@16 204 ::boost::bimaps::container_adaptor::detail::comparison_adaptor
Chris@16 205 <
Chris@16 206 BinaryPredicate,
Chris@16 207 BOOST_DEDUCED_TYPENAME Base::value_type,
Chris@16 208 key_from_base_value
Chris@16 209
Chris@16 210 >( binary_pred, this->template functor<key_from_base_value>() )
Chris@16 211 );
Chris@16 212 }
Chris@16 213
Chris@16 214 void merge(list_map_adaptor & x)
Chris@16 215 {
Chris@16 216 this->base().merge(x.base(),
Chris@16 217 ::boost::bimaps::container_adaptor::detail::comparison_adaptor
Chris@16 218 <
Chris@16 219 std::less<key_type>,
Chris@16 220 BOOST_DEDUCED_TYPENAME Base::value_type,
Chris@16 221 key_from_base_value
Chris@16 222
Chris@16 223 >(
Chris@16 224 std::less<key_type>(),
Chris@16 225 this->template functor<key_from_base_value>()
Chris@16 226 )
Chris@16 227 );
Chris@16 228 }
Chris@16 229
Chris@16 230 template< class Compare >
Chris@16 231 void merge(list_map_adaptor & x, Compare comp)
Chris@16 232 {
Chris@16 233 this->base().merge(x.base(),
Chris@16 234 ::boost::bimaps::container_adaptor::detail::comparison_adaptor
Chris@16 235 <
Chris@16 236 Compare,
Chris@16 237 BOOST_DEDUCED_TYPENAME Base::value_type,
Chris@16 238 key_from_base_value
Chris@16 239
Chris@16 240 >( comp, this->template functor<key_from_base_value>() )
Chris@16 241 );
Chris@16 242 }
Chris@16 243
Chris@16 244 void sort()
Chris@16 245 {
Chris@16 246 this->base().sort(
Chris@16 247 ::boost::bimaps::container_adaptor::detail::comparison_adaptor
Chris@16 248 <
Chris@16 249 std::less<key_type>,
Chris@16 250 BOOST_DEDUCED_TYPENAME Base::value_type,
Chris@16 251 key_from_base_value
Chris@16 252
Chris@16 253 >(
Chris@16 254 std::less<key_type>(),
Chris@16 255 this->template functor<key_from_base_value>()
Chris@16 256 )
Chris@16 257 );
Chris@16 258 }
Chris@16 259
Chris@16 260 template< class Compare >
Chris@16 261 void sort(Compare comp)
Chris@16 262 {
Chris@16 263 this->base().sort(
Chris@16 264 ::boost::bimaps::container_adaptor::detail::comparison_adaptor
Chris@16 265 <
Chris@16 266 Compare,
Chris@16 267 BOOST_DEDUCED_TYPENAME Base::value_type,
Chris@16 268 key_from_base_value
Chris@16 269
Chris@16 270 >( comp, this->template functor<key_from_base_value>() )
Chris@16 271 );
Chris@16 272 }
Chris@16 273
Chris@16 274 };
Chris@16 275
Chris@16 276
Chris@16 277 } // namespace container_adaptor
Chris@16 278 } // namespace bimaps
Chris@16 279 } // namespace boost
Chris@16 280
Chris@16 281
Chris@16 282 #endif // BOOST_BIMAP_CONTAINER_ADAPTOR_LIST_MAP_ADAPTOR_HPP
Chris@16 283