diff options
author | nkozlovskiy <nmk@ydb.tech> | 2023-09-29 12:24:06 +0300 |
---|---|---|
committer | nkozlovskiy <nmk@ydb.tech> | 2023-09-29 12:41:34 +0300 |
commit | e0e3e1717e3d33762ce61950504f9637a6e669ed (patch) | |
tree | bca3ff6939b10ed60c3d5c12439963a1146b9711 /contrib/restricted/boost/bimap | |
parent | 38f2c5852db84c7b4d83adfcb009eb61541d1ccd (diff) | |
download | ydb-e0e3e1717e3d33762ce61950504f9637a6e669ed.tar.gz |
add ydb deps
Diffstat (limited to 'contrib/restricted/boost/bimap')
98 files changed, 14731 insertions, 0 deletions
diff --git a/contrib/restricted/boost/bimap/include/boost/bimap.hpp b/contrib/restricted/boost/bimap/include/boost/bimap.hpp new file mode 100644 index 0000000000..51d726dd32 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap.hpp @@ -0,0 +1,19 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +// See www.boost.org/libs/bimap for documentation. + +// Convenience header + +#include <boost/bimap/bimap.hpp> + +namespace boost +{ + using ::boost::bimaps::bimap; +} + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/bimap.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/bimap.hpp new file mode 100644 index 0000000000..8c3f04331b --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/bimap.hpp @@ -0,0 +1,438 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file bimap.hpp +/// \brief Includes the basic bimap container + +/** \mainpage notitle +\n +\image html http://matias.capeletto.googlepages.com/boost.bimap.reference.logo.png + +\section Introduction + +This is the complete reference of Boost.Bimap. + +After getting a good understanding of the library from a user perspective +the next step will be: + + - Understand the tagged idiom. (boost::bimaps::tags) + - Understand the internals of the relation class (boost::bimaps::relation) + - Read the container_adaptor toolbox docs (boost::bimaps::container_adaptor) + - Understand the internals of the bimap class. (boost::bimaps, boost::bimaps::views + and boost::bimaps::detail) + + + **/ + +/** \defgroup mutant_group mutant idiom +\brief A safe wrapper around reinterpret_cast + **/ + +/** \defgroup relation_group relation +\brief The relation + **/ + +/** \defgroup tags_group tagged idiom +\brief The tagged idiom + **/ + + +#ifndef BOOST_BIMAP_BIMAP_HPP +#define BOOST_BIMAP_BIMAP_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> +#include <boost/bimap/detail/user_interface_config.hpp> +#include <boost/mpl/aux_/na.hpp> + +#ifndef BOOST_BIMAP_DISABLE_SERIALIZATION + #include <boost/core/serialization.hpp> +#endif // BOOST_BIMAP_DISABLE_SERIALIZATION + +// Boost.Bimap +#include <boost/bimap/detail/bimap_core.hpp> +#include <boost/bimap/detail/map_view_base.hpp> +#include <boost/bimap/detail/modifier_adaptor.hpp> +#include <boost/bimap/relation/support/data_extractor.hpp> +#include <boost/bimap/relation/support/member_with_tag.hpp> + +#include <boost/bimap/support/map_type_by.hpp> +#include <boost/bimap/support/map_by.hpp> +#include <boost/bimap/support/iterator_type_by.hpp> + +/// \brief The namespace where all the boost libraries lives. + +namespace boost { + +/// \brief Boost.Bimap library namespace +/** +All the entities in the library are defined in this namespace. + **/ +namespace bimaps { + +/// \brief The bimap class is the entry point to the library. +/** +This class manages the instantiation of the desired bimap type. +As there are several types of bidirectional maps that can be +created using it. the main job of it is to find the desired +type. This is done using metaprogramming to obtain the relation +type that will be stored, the map_view type of each side and +the set_view type of the general relationship. The instantiation +is kept simple using an extended standard set theory, where a +bidirectional map type is defined by the set types it relates. +For example, a bidirectional map that has multimap semantics +viewed from both sides is defined by specifying that the two +keys sets are of \c multiset_of<Key> type. +This allows the bimap class to support seamingless N-N, 1-N, +ordered/unordered and even vector-list types of mapping. +The three last parameters are used to specify the set type of +the relation, an inplace hooked data class and the allocator +type. As a help to the bimap user, these parameters support +default types but use a special idiom that allow them to be +specified without interleaving the usual use_default keyword. +The possible bimap instantiation are enumerated here: +\c {Side}KeyType can be directly a type, this is default to +\c set_of<{Side}KeyType>, or can be a \c {SetType}_of<Type> +specification. Additionally this two parameters can be tagged +to specify others tags instead of the usual \c member_at::{Side} +ones. + + +\code + + typedef bimap + < + LeftCollectionType, RightCollectionType + + [ , SetTypeOfRelation ] // Default to left_based + [ , info_hook< Info > ] // Default to no info + [ , Allocator ] // Default to std::allocator<> + + > bm; + +\endcode + + **/ + + +template +< + class KeyTypeA, class KeyTypeB, + class AP1 = ::boost::mpl::na, + class AP2 = ::boost::mpl::na, + class AP3 = ::boost::mpl::na +> +class bimap +: + // Bimap Core, use mpl magic to find the desired bimap type + + public ::boost::bimaps::detail::bimap_core<KeyTypeA,KeyTypeB,AP1,AP2,AP3>, + + // You can use bimap as a collection of relations + + public ::boost::bimaps::detail::bimap_core<KeyTypeA,KeyTypeB,AP1,AP2,AP3> + ::relation_set, + + // Include extra typedefs (i.e. left_local_iterator for unordered_map) + + public ::boost::bimaps::detail:: left_map_view_extra_typedefs< + BOOST_DEDUCED_TYPENAME ::boost::bimaps::detail::left_map_view_type< + ::boost::bimaps::detail::bimap_core<KeyTypeA,KeyTypeB,AP1,AP2,AP3> + >::type + >, + public ::boost::bimaps::detail::right_map_view_extra_typedefs< + BOOST_DEDUCED_TYPENAME ::boost::bimaps::detail::right_map_view_type< + ::boost::bimaps::detail::bimap_core<KeyTypeA,KeyTypeB,AP1,AP2,AP3> + >::type + > +{ + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::detail:: + bimap_core<KeyTypeA,KeyTypeB,AP1,AP2,AP3> base_; + + BOOST_DEDUCED_TYPENAME base_::core_type core; + + public: + + // metadata -------------------------------------------------------- + + /* + // The rest is computed in the core, because it is quite difficult to + // expose a nice interface with so many metaprogramming stuff. + + // Map by {side} metadata + + typedef -unspecified- {side}_tag; + typedef -unspecified- {side}_data_type; + typedef -unspecified- {side}_value_type; + typedef -unspecified- {side}_key_type; + + // There are other typedefs for definitions of different map views + + ------------------------------------------------------------------*/ + + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::detail:: + left_map_view_type<base_>::type left_map; + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::detail:: + right_map_view_type<base_>::type right_map; + + typedef BOOST_DEDUCED_TYPENAME + left_map::iterator left_iterator; + typedef BOOST_DEDUCED_TYPENAME + left_map::const_iterator left_const_iterator; + + typedef BOOST_DEDUCED_TYPENAME + right_map::iterator right_iterator; + typedef BOOST_DEDUCED_TYPENAME + right_map::const_iterator right_const_iterator; + + typedef BOOST_DEDUCED_TYPENAME + left_map::reference left_reference; + typedef BOOST_DEDUCED_TYPENAME + left_map::const_reference left_const_reference; + + typedef BOOST_DEDUCED_TYPENAME + right_map::reference right_reference; + typedef BOOST_DEDUCED_TYPENAME + right_map::const_reference right_const_reference; + + typedef BOOST_DEDUCED_TYPENAME base_::relation::info_type info_type; + + typedef BOOST_DEDUCED_TYPENAME base_::core_type::allocator_type allocator_type; + + /// Left map view + left_map left; + + /// Right map view + right_map right; + + typedef BOOST_DEDUCED_TYPENAME base_::logic_relation_set_tag + logic_relation_set_tag; + typedef BOOST_DEDUCED_TYPENAME base_::logic_left_tag logic_left_tag; + typedef BOOST_DEDUCED_TYPENAME base_::logic_right_tag logic_right_tag; + typedef BOOST_DEDUCED_TYPENAME base_::core_type::ctor_args_list + ctor_args_list; + + bimap(const allocator_type& al = allocator_type()) : + + base_::relation_set( + ::boost::multi_index::get< + logic_relation_set_tag + >(core) + ), + + core(al), + + left ( + ::boost::multi_index::get< + logic_left_tag + >(core) + ), + right ( + ::boost::multi_index::get< + logic_right_tag + >(core) + ) + + {} + + template< class InputIterator > + bimap(InputIterator first,InputIterator last, + const allocator_type& al = allocator_type()) : + + base_::relation_set( + ::boost::multi_index::get< + BOOST_DEDUCED_TYPENAME base_::logic_relation_set_tag>(core) + ), + + core(first,last,ctor_args_list(),al), + + left ( + ::boost::multi_index::get< + BOOST_DEDUCED_TYPENAME base_::logic_left_tag>(core) + ), + right ( + ::boost::multi_index::get< + BOOST_DEDUCED_TYPENAME base_::logic_right_tag>(core) + ) + + {} + + bimap(const bimap& x) : + + base_::relation_set( + ::boost::multi_index::get< + BOOST_DEDUCED_TYPENAME base_::logic_relation_set_tag>(core) + ), + + core(x.core), + + left ( + ::boost::multi_index::get< + BOOST_DEDUCED_TYPENAME base_::logic_left_tag>(core) + ), + right ( + ::boost::multi_index::get< + BOOST_DEDUCED_TYPENAME base_::logic_right_tag>(core) + ) + + {} + + bimap& operator=(const bimap& x) + { + core = x.core; + return *this; + } + + // Projection of iterators + + template< class IteratorType > + left_iterator project_left(IteratorType iter) + { + return core.template project< + BOOST_DEDUCED_TYPENAME base_::logic_left_tag>(iter.base()); + } + + template< class IteratorType > + left_const_iterator project_left(IteratorType iter) const + { + return core.template project< + BOOST_DEDUCED_TYPENAME base_::logic_left_tag>(iter.base()); + } + + template< class IteratorType > + right_iterator project_right(IteratorType iter) + { + return core.template project< + BOOST_DEDUCED_TYPENAME base_::logic_right_tag>(iter.base()); + } + + template< class IteratorType > + right_const_iterator project_right(IteratorType iter) const + { + return core.template project< + BOOST_DEDUCED_TYPENAME base_::logic_right_tag>(iter.base()); + } + + template< class IteratorType > + BOOST_DEDUCED_TYPENAME base_::relation_set::iterator + project_up(IteratorType iter) + { + return core.template project< + BOOST_DEDUCED_TYPENAME base_::logic_relation_set_tag>(iter.base()); + } + + template< class IteratorType > + BOOST_DEDUCED_TYPENAME base_::relation_set::const_iterator + project_up(IteratorType iter) const + { + return core.template project< + BOOST_DEDUCED_TYPENAME base_::logic_relation_set_tag>(iter.base()); + } + + // Support for tags + + template< class Tag, class IteratorType > + BOOST_DEDUCED_TYPENAME ::boost::bimaps::support:: + iterator_type_by<Tag,bimap>::type + project(IteratorType iter) + { + return core.template project<Tag>(iter.base()); + } + + template< class Tag, class IteratorType > + BOOST_DEDUCED_TYPENAME ::boost::bimaps::support:: + const_iterator_type_by<Tag,bimap>::type + project(IteratorType iter) const + { + return core.template project<Tag>(iter.base()); + } + + template< class Tag > + struct map_by : + public ::boost::bimaps::support::map_type_by<Tag,bimap>::type + { + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::support:: + map_type_by<Tag,bimap>::type type; + + private: map_by() {} + }; + + template< class Tag > + BOOST_DEDUCED_TYPENAME ::boost::bimaps::support:: + map_type_by<Tag,bimap>::type &by() + { + return ::boost::bimaps::support::map_by<Tag>(*this); + } + + template< class Tag > + const BOOST_DEDUCED_TYPENAME ::boost::bimaps::support:: + map_type_by<Tag,bimap>::type &by() const + { + return ::boost::bimaps::support::map_by<Tag>(*this); + } + + + #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION + + // Serialization support + + private: + + friend class boost::serialization::access; + + template<class Archive> + void serialize(Archive & ar, const unsigned int) + { + ar & serialization::make_nvp("mi_core",core); + } + + #endif // BOOST_BIMAP_DISABLE_SERIALIZATION +}; + +} // namespace bimaps +} // namespace boost + + +/** \namespace boost::bimaps::support +\brief Metafunctions to help working with bimaps. + **/ + +/** \namespace boost::bimaps::views +\brief Bimap views. + **/ + +/** \namespace boost::bimaps::views::detail +\brief Bimap views details. + **/ + + + +// Include basic tools for user commodity + +#include <boost/bimap/tags/tagged.hpp> +#include <boost/bimap/relation/member_at.hpp> +#include <boost/multi_index/detail/unbounded.hpp> + +// Bring the most used namespaces directly to the user main namespace +namespace boost { +namespace bimaps { + +using ::boost::bimaps::tags::tagged; + +namespace member_at = ::boost::bimaps::relation::member_at; + +using ::boost::multi_index::unbounded; + +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_BIMAP_HPP diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/associative_container_adaptor.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/associative_container_adaptor.hpp new file mode 100644 index 0000000000..419407f82f --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/associative_container_adaptor.hpp @@ -0,0 +1,287 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file container_adaptor/associative_container_adaptor.hpp +/// \brief Container adaptor to build a type that is compliant to the concept of an associative container. + +#ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_ASSOCIATIVE_CONTAINER_ADAPTOR_HPP +#define BOOST_BIMAP_CONTAINER_ADAPTOR_ASSOCIATIVE_CONTAINER_ADAPTOR_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <utility> + +#include <boost/mpl/vector.hpp> +#include <boost/mpl/if.hpp> +#include <boost/mpl/aux_/na.hpp> +#include <boost/bimap/container_adaptor/detail/identity_converters.hpp> +#include <boost/bimap/container_adaptor/container_adaptor.hpp> +#include <boost/call_traits.hpp> + +namespace boost { +namespace bimaps { +namespace container_adaptor { + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +template +< + class Base, class Iterator, class ConstIterator, class KeyType, + class IteratorToBaseConverter, class IteratorFromBaseConverter, + class ValueToBaseConverter, class ValueFromBaseConverter, class KeyToBaseConverter, + class FunctorsFromDerivedClasses +> +struct associative_container_adaptor_base +{ + typedef container_adaptor + < + Base, + + Iterator, ConstIterator, + + IteratorToBaseConverter, IteratorFromBaseConverter, + ValueToBaseConverter , ValueFromBaseConverter, + + BOOST_DEDUCED_TYPENAME mpl::push_front< + + FunctorsFromDerivedClasses, + + BOOST_DEDUCED_TYPENAME mpl::if_< ::boost::mpl::is_na<KeyToBaseConverter>, + // { + detail::key_to_base_identity + < + BOOST_DEDUCED_TYPENAME Base::key_type, KeyType + >, + // } + // else + // { + KeyToBaseConverter + // } + + >::type + + >::type + + > type; +}; + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + + +/// \brief Container adaptor to build a type that is compliant to the concept of an associative container. + +template +< + class Base, + + class Iterator, + class ConstIterator, + + class KeyType, + + class IteratorToBaseConverter = ::boost::mpl::na, + class IteratorFromBaseConverter = ::boost::mpl::na, + class ValueToBaseConverter = ::boost::mpl::na, + class ValueFromBaseConverter = ::boost::mpl::na, + class KeyToBaseConverter = ::boost::mpl::na, + + class FunctorsFromDerivedClasses = mpl::vector<> +> +class associative_container_adaptor : + + public associative_container_adaptor_base + < + Base, Iterator, ConstIterator, KeyType, + IteratorToBaseConverter, IteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, KeyToBaseConverter, + FunctorsFromDerivedClasses + + >::type +{ + + // MetaData ------------------------------------------------------------- + + typedef typename associative_container_adaptor_base + < + Base, Iterator, ConstIterator, KeyType, + IteratorToBaseConverter, IteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, KeyToBaseConverter, + FunctorsFromDerivedClasses + + >::type base_; + + public: + + typedef KeyType key_type; + + protected: + + typedef BOOST_DEDUCED_TYPENAME mpl::if_< ::boost::mpl::is_na<KeyToBaseConverter>, + // { + detail::key_to_base_identity + < + BOOST_DEDUCED_TYPENAME Base::key_type, KeyType + >, + // } + // else + // { + KeyToBaseConverter + // } + + >::type key_to_base; + + public: + + explicit associative_container_adaptor(Base & c) + : base_(c) {} + + protected: + + + typedef associative_container_adaptor associative_container_adaptor_; + + // Interface -------------------------------------------------------------- + + public: + + template< class CompatibleKey > + BOOST_DEDUCED_TYPENAME base_::size_type erase(const CompatibleKey & k) + { + return this->base().erase + ( + this->template functor<key_to_base>()(k) + ); + } + + // As we redefine erase, the other overloads need to be manually routed + + BOOST_DEDUCED_TYPENAME base_::iterator erase( + BOOST_DEDUCED_TYPENAME base_::iterator pos) + { + return base_::container_adaptor_::erase(pos); + } + + BOOST_DEDUCED_TYPENAME base_::iterator erase( + BOOST_DEDUCED_TYPENAME base_::iterator first, + BOOST_DEDUCED_TYPENAME base_::iterator last) + { + return base_::container_adaptor_::erase(first,last); + } + + template< class CompatibleKey > + BOOST_DEDUCED_TYPENAME base_::size_type count(const CompatibleKey & k) const + { + return this->base().count( + this->template functor<key_to_base>()(k) + ); + } + + template< class CompatibleKey > + BOOST_DEDUCED_TYPENAME base_::iterator find(const CompatibleKey & k) + { + return this->template functor<typename base_::iterator_from_base>() + ( + this->base().find( + this->template functor<key_to_base>()(k) + ) + ); + } + + template< class CompatibleKey > + BOOST_DEDUCED_TYPENAME base_::const_iterator + find(const CompatibleKey & k) const + { + return this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_from_base>() + ( + this->base().find( + this->template functor<key_to_base>()(k) + ) + ); + } + + template< class CompatibleKey > + std::pair + < + BOOST_DEDUCED_TYPENAME base_::iterator, + BOOST_DEDUCED_TYPENAME base_::iterator + > + equal_range(const CompatibleKey & k) + { + std::pair< + + BOOST_DEDUCED_TYPENAME Base::iterator, + BOOST_DEDUCED_TYPENAME Base::iterator + + > r( this->base().equal_range( + this->template functor<key_to_base>()(k) + ) + ); + + return std::pair + < + BOOST_DEDUCED_TYPENAME base_::iterator, + BOOST_DEDUCED_TYPENAME base_::iterator + >( + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_from_base + >() ( r.first ), + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_from_base + >() ( r.second ) + ); + } + + template< class CompatibleKey > + std::pair + < + BOOST_DEDUCED_TYPENAME base_::const_iterator, + BOOST_DEDUCED_TYPENAME base_::const_iterator + > + equal_range(const CompatibleKey & k) const + { + std::pair< + + BOOST_DEDUCED_TYPENAME Base::const_iterator, + BOOST_DEDUCED_TYPENAME Base::const_iterator + + > r( this->base().equal_range( + this->template functor<key_to_base>()(k) + ) + ); + + return std::pair + < + BOOST_DEDUCED_TYPENAME base_::const_iterator, + BOOST_DEDUCED_TYPENAME base_::const_iterator + >( + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_from_base + >() ( r.first ), + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_from_base + >() ( r.second ) + ); + } + +}; + + +} // namespace container_adaptor +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_CONTAINER_ADAPTOR_ASSOCIATIVE_CONTAINER_ADAPTOR_HPP + + + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/container_adaptor.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/container_adaptor.hpp new file mode 100644 index 0000000000..374c351f0a --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/container_adaptor.hpp @@ -0,0 +1,291 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file container_adaptor/container_adaptor.hpp +/// \brief Container adaptor to build a type that is compliant to the concept of a container. + +#ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_CONTAINER_ADAPTOR_HPP +#define BOOST_BIMAP_CONTAINER_ADAPTOR_CONTAINER_ADAPTOR_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <utility> + +#include <boost/mpl/if.hpp> +#include <boost/mpl/aux_/na.hpp> +#include <boost/bimap/container_adaptor/detail/identity_converters.hpp> +#include <boost/iterator/iterator_traits.hpp> + +#include <boost/bimap/container_adaptor/detail/functor_bag.hpp> +#include <boost/mpl/vector.hpp> +#include <boost/mpl/copy.hpp> +#include <boost/mpl/front_inserter.hpp> +#include <boost/call_traits.hpp> + + + +namespace boost { +namespace bimaps { + +/// \brief Container Adaptor toolbox, easy way to build new containers from existing ones. + +namespace container_adaptor { + +/// \brief Container adaptor to build a type that is compliant to the concept of a container. + +template +< + class Base, + + class Iterator, + class ConstIterator, + + class IteratorToBaseConverter = ::boost::mpl::na, + class IteratorFromBaseConverter = ::boost::mpl::na, + class ValueToBaseConverter = ::boost::mpl::na, + class ValueFromBaseConverter = ::boost::mpl::na, + + class FunctorsFromDerivedClasses = mpl::vector<> +> +class container_adaptor +{ + // MetaData ------------------------------------------------------------- + + public: + + typedef Iterator iterator; + typedef ConstIterator const_iterator; + + typedef BOOST_DEDUCED_TYPENAME iterator_value < iterator >::type value_type; + typedef BOOST_DEDUCED_TYPENAME iterator_pointer < iterator >::type pointer; + typedef BOOST_DEDUCED_TYPENAME iterator_reference< iterator >::type reference; + typedef BOOST_DEDUCED_TYPENAME iterator_reference< const_iterator >::type const_reference; + + typedef BOOST_DEDUCED_TYPENAME Base::size_type size_type; + typedef BOOST_DEDUCED_TYPENAME Base::difference_type difference_type; + + typedef BOOST_DEDUCED_TYPENAME mpl::if_< ::boost::mpl::is_na<IteratorToBaseConverter>, + // { + ::boost::bimaps::container_adaptor::detail:: + iterator_to_base_identity + < + BOOST_DEDUCED_TYPENAME Base::iterator , iterator, + BOOST_DEDUCED_TYPENAME Base::const_iterator , const_iterator + >, + // } + // else + // { + IteratorToBaseConverter + // } + + >::type iterator_to_base; + + typedef BOOST_DEDUCED_TYPENAME mpl::if_< ::boost::mpl::is_na<IteratorFromBaseConverter>, + // { + ::boost::bimaps::container_adaptor::detail:: + iterator_from_base_identity + < + BOOST_DEDUCED_TYPENAME Base::iterator , iterator, + BOOST_DEDUCED_TYPENAME Base::const_iterator , const_iterator + >, + // } + // else + // { + IteratorFromBaseConverter + // } + + >::type iterator_from_base; + + typedef BOOST_DEDUCED_TYPENAME mpl::if_< ::boost::mpl::is_na<ValueToBaseConverter>, + // { + ::boost::bimaps::container_adaptor::detail:: + value_to_base_identity + < + BOOST_DEDUCED_TYPENAME Base::value_type, + value_type + >, + // } + // else + // { + ValueToBaseConverter + // } + + >::type value_to_base; + + typedef BOOST_DEDUCED_TYPENAME mpl::if_< ::boost::mpl::is_na<ValueFromBaseConverter>, + // { + ::boost::bimaps::container_adaptor::detail:: + value_from_base_identity + < + BOOST_DEDUCED_TYPENAME Base::value_type, + value_type + >, + // } + // else + // { + ValueFromBaseConverter + // } + + >::type value_from_base; + + // ACCESS ----------------------------------------------------------------- + + public: + + explicit container_adaptor(Base & c) : dwfb(c) {} + + protected: + + typedef Base base_type; + + typedef container_adaptor container_adaptor_; + + const Base & base() const { return dwfb.data; } + Base & base() { return dwfb.data; } + + // Interface -------------------------------------------------------------- + + public: + + size_type size() const { return base().size(); } + size_type max_size() const { return base().max_size(); } + bool empty() const { return base().empty(); } + + iterator begin() + { + return this->template functor<iterator_from_base>()( base().begin() ); + } + + iterator end() + { + return this->template functor<iterator_from_base>()( base().end() ); + } + + const_iterator begin() const + { + return this->template functor<iterator_from_base>()( base().begin() ); + } + + const_iterator end() const + { + return this->template functor<iterator_from_base>()( base().end() ); + } + + + iterator erase(iterator pos) + { + return this->template functor<iterator_from_base>()( + base().erase(this->template functor<iterator_to_base>()(pos)) + ); + } + + iterator erase(iterator first, iterator last) + { + return this->template functor<iterator_from_base>()( + base().erase( + this->template functor<iterator_to_base>()(first), + this->template functor<iterator_to_base>()(last) + ) + ); + } + + void clear() + { + base().clear(); + } + + template< class InputIterator > + void insert(InputIterator iterBegin, InputIterator iterEnd) + { + for( ; iterBegin != iterEnd ; ++iterBegin ) + { + base().insert( this->template + functor<value_to_base>()( *iterBegin ) + ); + } + } + + std::pair<iterator, bool> insert( + BOOST_DEDUCED_TYPENAME ::boost::call_traits< value_type >::param_type x) + { + std::pair< BOOST_DEDUCED_TYPENAME Base::iterator, bool > r( + base().insert( this->template functor<value_to_base>()(x) ) + ); + + return std::pair<iterator, bool>( this->template + functor<iterator_from_base>()(r.first),r.second + ); + } + + iterator insert(iterator pos, + BOOST_DEDUCED_TYPENAME ::boost::call_traits< value_type >::param_type x) + { + return this->template functor<iterator_from_base>()( + base().insert( + this->template functor<iterator_to_base>()(pos), + this->template functor<value_to_base>()(x)) + ); + } + + void swap( container_adaptor & c ) + { + base().swap( c.base() ); + } + + // Access to functors ---------------------------------------------------- + + protected: + + template< class Functor > + Functor & functor() + { + return dwfb.template functor<Functor>(); + } + + template< class Functor > + Functor const & functor() const + { + return dwfb.template functor<Functor>(); + } + + // Data ------------------------------------------------------------------ + + private: + + ::boost::bimaps::container_adaptor::detail::data_with_functor_bag + < + Base &, + + BOOST_DEDUCED_TYPENAME mpl::copy + < + mpl::vector + < + iterator_to_base, + iterator_from_base, + value_to_base, + value_from_base + >, + + mpl::front_inserter< FunctorsFromDerivedClasses > + + >::type + + > dwfb; +}; + + +} // namespace container_adaptor +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_CONTAINER_ADAPTOR_CONTAINER_ADAPTOR_HPP diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/detail/comparison_adaptor.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/detail/comparison_adaptor.hpp new file mode 100644 index 0000000000..aceaa34c16 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/detail/comparison_adaptor.hpp @@ -0,0 +1,111 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file container_adaptor/detail/comparison_adaptor.hpp +/// \brief Comparison adaptor. + +#ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_DETAIL_COMPARISON_ADAPTOR_HPP +#define BOOST_BIMAP_CONTAINER_ADAPTOR_DETAIL_COMPARISON_ADAPTOR_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/call_traits.hpp> + +namespace boost { +namespace bimaps { +namespace container_adaptor { +namespace detail { + +/// \brief Comparison adaptor +/** + +A simple comparison adaptor. + **/ + +template < class Compare, class NewType, class Converter > +struct comparison_adaptor +{ + typedef NewType first_argument_type; + typedef NewType second_argument_type; + typedef bool result_type; + + comparison_adaptor( const Compare & comp, const Converter & conv) + : compare(comp), converter(conv) {} + + bool operator()( BOOST_DEDUCED_TYPENAME call_traits<NewType>::param_type x, + BOOST_DEDUCED_TYPENAME call_traits<NewType>::param_type y) const + { + return compare( converter(x), converter(y) ); + } + + private: + Compare compare; + Converter converter; +}; + +template < class Compare, class NewType, class Converter > +struct compatible_comparison_adaptor +{ + typedef NewType first_argument_type; + typedef NewType second_argument_type; + typedef bool result_type; + + compatible_comparison_adaptor( const Compare & comp, const Converter & conv) + : compare(comp), converter(conv) {} + + template< class CompatibleTypeLeft, class CompatibleTypeRight > + bool operator()( const CompatibleTypeLeft & x, + const CompatibleTypeRight & y) const + { + return compare( converter(x), converter(y) ); + } + + private: + Compare compare; + Converter converter; +}; + + +/// \brief Unary Check adaptor +/** + +A simple unary check adaptor. + **/ + +template < class Compare, class NewType, class Converter > +struct unary_check_adaptor +{ + typedef BOOST_DEDUCED_TYPENAME call_traits<NewType>::param_type argument_type; + typedef bool result_type; + + unary_check_adaptor( const Compare & comp, const Converter & conv ) : + compare(comp), converter(conv) {} + + bool operator()( BOOST_DEDUCED_TYPENAME call_traits<NewType>::param_type x) const + { + return compare( converter(x) ); + } + + private: + Compare compare; + Converter converter; +}; + +} // namespace detail +} // namespace container_adaptor +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_CONTAINER_ADAPTOR_DETAIL_COMPARISON_ADAPTOR_HPP + + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/detail/functor_bag.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/detail/functor_bag.hpp new file mode 100644 index 0000000000..9df655e349 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/detail/functor_bag.hpp @@ -0,0 +1,100 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file container_adaptor/detail/functor_bag.hpp +/// \brief Defines a EBO optimizacion helper for functors. + +#ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_DETAIL_FUNCTOR_BAG_HPP +#define BOOST_BIMAP_CONTAINER_ADAPTOR_DETAIL_FUNCTOR_BAG_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#if defined(BOOST_MSVC) +// This bogus warning will appear when add_const is applied to a +// const volatile reference because we can't detect const volatile +// references with MSVC6. +# pragma warning(push) +# pragma warning(disable:4181) +// warning C4181: qualifier applied to reference type ignored +#endif + +#include <boost/mpl/placeholders.hpp> + +#include <boost/type_traits/add_reference.hpp> +#include <boost/type_traits/is_base_of.hpp> + +#include <boost/mpl/inherit_linearly.hpp> +#include <boost/mpl/inherit.hpp> + +namespace boost { +namespace bimaps { +namespace container_adaptor { +namespace detail { + +/// \brief EBO optimizacion helper for functors +/** + +This class is a generalization of a helper class explained in an article by +Nathan C. Myers.\n +See it at \link http://www.cantrip.org/emptyopt.html + **/ + +template < class Data, class FunctorList > +struct data_with_functor_bag : + + public mpl::inherit_linearly< + + FunctorList, + mpl::if_< is_base_of< mpl::_2, mpl::_1 >, + // { + mpl::_1, + // } + // else + // { + mpl::inherit< mpl::_1, mpl::_2 > + // } + > + + >::type +{ + Data data; + + data_with_functor_bag() {} + + data_with_functor_bag(BOOST_DEDUCED_TYPENAME add_reference<Data>::type d) + : data(d) {} + + template< class Functor > + Functor& functor() + { + return *(static_cast<Functor*>(this)); + } + + template< class Functor > + const Functor& functor() const + { + return *(static_cast<Functor const *>(this)); + } +}; + +} // namespace detail +} // namespace container_adaptor +} // namespace bimaps +} // namespace boost + +#if defined(BOOST_MSVC) +# pragma warning(pop) +#endif + +#endif // BOOST_BIMAP_CONTAINER_ADAPTOR_DETAIL_FUNCTOR_BAG_HPP + + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/detail/identity_converters.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/detail/identity_converters.hpp new file mode 100644 index 0000000000..4f79cfc167 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/detail/identity_converters.hpp @@ -0,0 +1,191 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file container_adaptor/detail/identity_converters.hpp +/// \brief Value and iterators identity converters. + +#ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_DETAIL_IDENTITY_CONVERTERS_HPP +#define BOOST_BIMAP_CONTAINER_ADAPTOR_DETAIL_IDENTITY_CONVERTERS_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +namespace boost { +namespace bimaps { +namespace container_adaptor { + +/// \brief Details of the container adaptor toolbox + +namespace detail { + +/// \brief Iterator identity converter used by default in container adaptors. +/** +If Iterator and ConstIterator are of the same type one of the convert function is not +included. + **/ + +template +< + class BaseIterator , class Iterator, + class BaseConstIterator , class ConstIterator +> +struct iterator_to_base_identity +{ + BaseIterator operator()(Iterator iter) const + { + return BaseIterator(iter); + } + + BaseConstIterator operator()(ConstIterator iter) const + { + return BaseConstIterator(iter); + } +}; + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +template< class BaseIterator, class Iterator > +struct iterator_to_base_identity<BaseIterator,Iterator,BaseIterator,Iterator> +{ + BaseIterator operator()(Iterator iter) const + { + return BaseIterator(iter); + } +}; + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +/// \brief Iterator from base identity converter used by default in container adaptors. +/** +If Iterator and ConstIterator are of the same type one of the convert function is not +included. + **/ + +template +< + class BaseIterator , class Iterator, + class BaseConstIterator , class ConstIterator +> +struct iterator_from_base_identity +{ + Iterator operator()(BaseIterator iter) const + { + return Iterator(iter); + } + ConstIterator operator()(BaseConstIterator iter) const + { + return ConstIterator(iter); + } +}; + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +template< class BaseIterator, class Iterator, class ConstIterator > +struct iterator_from_base_identity<BaseIterator,Iterator,BaseIterator,ConstIterator> +{ + Iterator operator()(BaseIterator iter) const + { + return Iterator(iter); + } +}; + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +/// \brief Value to base identity converter used by default in container adaptors. + +template< class BaseValue, class Value > +struct value_to_base_identity +{ + BaseValue operator()(const Value & val) const + { + return BaseValue(val); + } +}; + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +template< class Value > +struct value_to_base_identity< Value, Value > +{ + const Value & operator()(const Value & val) const + { + return val; + } +}; + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +/// \brief Value from base identity converter used by default in container adaptors. + +template< class BaseValue, class Value > +struct value_from_base_identity +{ + Value operator()(const BaseValue & val) const + { + return Value(val); + } +}; + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +template< class Value > +struct value_from_base_identity<Value,Value> +{ + Value & operator()(Value & val) const + { + return val; + } + + const Value & operator()(const Value & val) const + { + return val; + } +}; + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +/// \brief Key to base identity converter used by default in container adaptors. + +template< class BaseKey, class Key > +struct key_to_base_identity +{ + BaseKey operator()(const Key & k) const + { + return BaseKey(k); + } +}; + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +template< class Key > +struct key_to_base_identity< Key, Key > +{ + // As default accept any type as key in order to allow container + // adaptors to work with compatible key types + + template< class CompatibleKey > + const CompatibleKey & operator()(const CompatibleKey & k) const + { + return k; + } +}; + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +} // namespace detail +} // namespace container_adaptor +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_CONTAINER_ADAPTOR_DETAIL_IDENTITY_CONVERTERS_HPP + + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/detail/key_extractor.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/detail/key_extractor.hpp new file mode 100644 index 0000000000..2dca1da210 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/detail/key_extractor.hpp @@ -0,0 +1,45 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file container_adaptor/detail/key_extractor.hpp +/// \brief Key extractor for a pair<Key,Data>. + +#ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_DETAIL_KEY_EXTRACTOR_HPP +#define BOOST_BIMAP_CONTAINER_ADAPTOR_DETAIL_KEY_EXTRACTOR_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +namespace boost { +namespace bimaps { +namespace container_adaptor { +namespace detail { + +/// \brief Key Extractor + +template < class T > +struct key_from_pair_extractor +{ + typedef T argument_type; + typedef BOOST_DEDUCED_TYPENAME T::first_type result_type; + + result_type operator()( const T & p ) { return p.first; } +}; + +} // namespace detail +} // namespace container_adaptor +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_CONTAINER_ADAPTOR_DETAIL_KEY_EXTRACTOR_HPP + + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/detail/non_unique_container_helper.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/detail/non_unique_container_helper.hpp new file mode 100644 index 0000000000..25ba2f56cd --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/detail/non_unique_container_helper.hpp @@ -0,0 +1,62 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file container_adaptor/detail/non_unique_container_helper.hpp +/// \brief Details for non unique containers + +#ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_DETAIL_NON_UNIQUE_CONTAINER_HELPER_HPP +#define BOOST_BIMAP_CONTAINER_ADAPTOR_DETAIL_NON_UNIQUE_CONTAINER_HELPER_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +/*****************************************************************************/ +#define BOOST_BIMAP_NON_UNIQUE_CONTAINER_ADAPTOR_INSERT_FUNCTIONS \ + \ +template <class InputIterator> \ +void insert(InputIterator iterBegin, InputIterator iterEnd) \ +{ \ + for( ; iterBegin != iterEnd ; ++iterBegin ) \ + { \ + this->base().insert( \ + this->template functor< \ + BOOST_DEDUCED_TYPENAME base_::value_to_base>()( \ + BOOST_DEDUCED_TYPENAME base_::value_type(*iterBegin)) ); \ + } \ +} \ + \ +BOOST_DEDUCED_TYPENAME base_::iterator insert( \ + BOOST_DEDUCED_TYPENAME ::boost::call_traits< \ + BOOST_DEDUCED_TYPENAME base_::value_type >::param_type x) \ +{ \ + return this->base().insert( this->template functor< \ + BOOST_DEDUCED_TYPENAME base_:: \ + value_to_base>()(x) ); \ +} \ + \ +BOOST_DEDUCED_TYPENAME base_::iterator \ + insert(BOOST_DEDUCED_TYPENAME base_::iterator pos, \ + BOOST_DEDUCED_TYPENAME ::boost::call_traits< \ + BOOST_DEDUCED_TYPENAME base_::value_type >::param_type x) \ +{ \ + return this->template functor< \ + BOOST_DEDUCED_TYPENAME base_::iterator_from_base>()( \ + this->base().insert(this->template functor< \ + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(pos), \ + this->template functor< \ + BOOST_DEDUCED_TYPENAME base_::value_to_base>()(x)) \ + ); \ +} +/*****************************************************************************/ + +#endif // BOOST_BIMAP_CONTAINER_ADAPTOR_DETAIL_NON_UNIQUE_CONTAINER_HELPER_HPP + + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/list_adaptor.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/list_adaptor.hpp new file mode 100644 index 0000000000..62f2031855 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/list_adaptor.hpp @@ -0,0 +1,249 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file container_adaptor/list_adaptor.hpp +/// \brief Container adaptor to easily build a std::list signature compatible container. + +#ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_LIST_ADAPTOR_HPP +#define BOOST_BIMAP_CONTAINER_ADAPTOR_LIST_ADAPTOR_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/container_adaptor/sequence_container_adaptor.hpp> +#include <boost/bimap/container_adaptor/detail/comparison_adaptor.hpp> +#include <boost/mpl/aux_/na.hpp> +#include <boost/mpl/vector.hpp> +#include <boost/call_traits.hpp> +#include <functional> + +namespace boost { +namespace bimaps { +namespace container_adaptor { + +/// \brief Container adaptor to easily build a std::list signature compatible container. + +template +< + class Base, + + class Iterator, + class ConstIterator, + class ReverseIterator, + class ConstReverseIterator, + + class IteratorToBaseConverter = ::boost::mpl::na, + class IteratorFromBaseConverter = ::boost::mpl::na, + class ReverseIteratorFromBaseConverter = ::boost::mpl::na, + class ValueToBaseConverter = ::boost::mpl::na, + class ValueFromBaseConverter = ::boost::mpl::na, + + class FunctorsFromDerivedClasses = mpl::vector<> +> +class list_adaptor : + + public ::boost::bimaps::container_adaptor::sequence_container_adaptor + < + Base, Iterator, ConstIterator, ReverseIterator, ConstReverseIterator, + IteratorToBaseConverter, IteratorFromBaseConverter, + ReverseIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + FunctorsFromDerivedClasses + > +{ + typedef ::boost::bimaps::container_adaptor::sequence_container_adaptor + < + Base, Iterator, ConstIterator, ReverseIterator, ConstReverseIterator, + IteratorToBaseConverter, IteratorFromBaseConverter, + ReverseIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + FunctorsFromDerivedClasses + + > base_; + + // Access ----------------------------------------------------------------- + + public: + + explicit list_adaptor(Base & c) : + base_(c) {} + + protected: + + typedef list_adaptor list_adaptor_; + + // Interface ------------------------------------------------------------- + + public: + + void splice(Iterator position, list_adaptor & x) + { + this->base().splice( + this->template functor<BOOST_DEDUCED_TYPENAME base_::iterator_to_base>() + (position), + x.base() + ); + } + + void splice(Iterator position, list_adaptor & x, Iterator i) + { + this->base().splice( + this->template functor<BOOST_DEDUCED_TYPENAME base_::iterator_to_base>() + (position), + x.base(), + this->template functor<BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(i) + ); + } + + void splice(Iterator position, list_adaptor & x, + Iterator first, Iterator last) + { + this->base().splice( + this->template functor<BOOST_DEDUCED_TYPENAME base_::iterator_to_base>() + (position), + x.base(), + this->template functor<BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(first), + this->template functor<BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(last) + ); + } + + void remove( + BOOST_DEDUCED_TYPENAME ::boost::call_traits< + BOOST_DEDUCED_TYPENAME base_::value_type + >::param_type value + ) + { + this->base().remove( + this->template functor<BOOST_DEDUCED_TYPENAME base_::value_to_base>()(value) + ); + } + + template< class Predicate > + void remove_if(Predicate pred) + { + this->base().remove_if( + ::boost::bimaps::container_adaptor::detail::unary_check_adaptor + < + Predicate, + BOOST_DEDUCED_TYPENAME Base::value_type, + BOOST_DEDUCED_TYPENAME base_::value_from_base + + >( pred, this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>() ) + ); + } + + void unique() + { + this->base().unique( + ::boost::bimaps::container_adaptor::detail::comparison_adaptor + < + std::equal_to<BOOST_DEDUCED_TYPENAME base_::value_type>, + BOOST_DEDUCED_TYPENAME Base::value_type, + BOOST_DEDUCED_TYPENAME base_::value_from_base + + >( + std::equal_to<BOOST_DEDUCED_TYPENAME base_::value_type>(), + this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>() + ) + ); + } + + template< class BinaryPredicate > + void unique(BinaryPredicate binary_pred) + { + this->base().unique( + ::boost::bimaps::container_adaptor::detail::comparison_adaptor + < + BinaryPredicate, + BOOST_DEDUCED_TYPENAME Base::value_type, + BOOST_DEDUCED_TYPENAME base_::value_from_base + + >( binary_pred, + this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>() ) + ); + } + + void merge(list_adaptor & x) + { + this->base().merge(x.base(), + ::boost::bimaps::container_adaptor::detail::comparison_adaptor + < + std::less<BOOST_DEDUCED_TYPENAME base_::value_type>, + BOOST_DEDUCED_TYPENAME Base::value_type, + BOOST_DEDUCED_TYPENAME base_::value_from_base + + >( + std::less<BOOST_DEDUCED_TYPENAME base_::value_type>(), + this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>() + ) + ); + } + + template< class Compare > + void merge(list_adaptor & x, Compare comp) + { + this->base().merge(x.base(), + ::boost::bimaps::container_adaptor::detail::comparison_adaptor + < + Compare, + BOOST_DEDUCED_TYPENAME Base::value_type, + BOOST_DEDUCED_TYPENAME base_::value_from_base + + >( comp, this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>() ) + ); + } + + void sort() + { + this->base().sort( + ::boost::bimaps::container_adaptor::detail::comparison_adaptor + < + std::less<BOOST_DEDUCED_TYPENAME base_::value_type>, + BOOST_DEDUCED_TYPENAME Base::value_type, + BOOST_DEDUCED_TYPENAME base_::value_from_base + + >( + std::less<BOOST_DEDUCED_TYPENAME base_::value_type>(), + this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>() + ) + ); + } + + template< class Compare > + void sort(Compare comp) + { + this->base().sort( + ::boost::bimaps::container_adaptor::detail::comparison_adaptor + < + Compare, + BOOST_DEDUCED_TYPENAME Base::value_type, + BOOST_DEDUCED_TYPENAME base_::value_from_base + + >( comp, this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>() ) + ); + } + + void reverse() + { + this->base().reverse(); + } + +}; + + +} // namespace container_adaptor +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_CONTAINER_ADAPTOR_SET_ADAPTOR_HPP + + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/list_map_adaptor.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/list_map_adaptor.hpp new file mode 100644 index 0000000000..4fc5cdffe5 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/list_map_adaptor.hpp @@ -0,0 +1,283 @@ + // Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file container_adaptor/list_map_adaptor.hpp +/// \brief Container adaptor. + +#ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_LIST_MAP_ADAPTOR_HPP +#define BOOST_BIMAP_CONTAINER_ADAPTOR_LIST_MAP_ADAPTOR_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/mpl/list.hpp> +#include <boost/mpl/push_front.hpp> + +#include <boost/bimap/container_adaptor/list_adaptor.hpp> +#include <boost/bimap/container_adaptor/detail/identity_converters.hpp> +#include <boost/bimap/container_adaptor/detail/key_extractor.hpp> +#include <boost/bimap/container_adaptor/detail/comparison_adaptor.hpp> +#include <boost/mpl/vector.hpp> +#include <boost/mpl/aux_/na.hpp> +#include <boost/mpl/if.hpp> + +namespace boost { +namespace bimaps { +namespace container_adaptor { + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +template +< + class Base, class Iterator, class ConstIterator, + class ReverseIterator, class ConstReverseIterator, + class IteratorToBaseConverter, class IteratorFromBaseConverter, + class ReverseIteratorFromBaseConverter, + class ValueToBaseConverter, class ValueFromBaseConverter, + class KeyFromBaseValueConverter, + class FunctorsFromDerivedClasses +> +struct list_map_adaptor_base +{ + typedef list_adaptor + < + Base, + + Iterator, ConstIterator, ReverseIterator, ConstReverseIterator, + + IteratorToBaseConverter, IteratorFromBaseConverter, + + ReverseIteratorFromBaseConverter, + + ValueToBaseConverter, ValueFromBaseConverter, + + BOOST_DEDUCED_TYPENAME mpl::push_front< + + FunctorsFromDerivedClasses, + + BOOST_DEDUCED_TYPENAME mpl::if_< ::boost::mpl::is_na<KeyFromBaseValueConverter>, + // { + detail::key_from_pair_extractor + < + BOOST_DEDUCED_TYPENAME Iterator::value_type + >, + // } + // else + // { + KeyFromBaseValueConverter + // } + + >::type + + >::type + + > type; +}; + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +/// \brief Container adaptor to easily build a list map container + +template +< + class Base, + + class Iterator, + class ConstIterator, + class ReverseIterator, + class ConstReverseIterator, + + class IteratorToBaseConverter = ::boost::mpl::na, + class IteratorFromBaseConverter = ::boost::mpl::na, + class ReverseIteratorFromBaseConverter = ::boost::mpl::na, + class ValueToBaseConverter = ::boost::mpl::na, + class ValueFromBaseConverter = ::boost::mpl::na, + class KeyFromBaseValueConverter = ::boost::mpl::na, + + class FunctorsFromDerivedClasses = mpl::vector<> +> +class list_map_adaptor : + + public list_map_adaptor_base + < + Base, Iterator, ConstIterator, ReverseIterator, ConstReverseIterator, + IteratorToBaseConverter, IteratorFromBaseConverter, + ReverseIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + KeyFromBaseValueConverter, + FunctorsFromDerivedClasses + + >::type +{ + typedef BOOST_DEDUCED_TYPENAME list_map_adaptor_base + < + Base, Iterator, ConstIterator, ReverseIterator, ConstReverseIterator, + IteratorToBaseConverter, IteratorFromBaseConverter, + ReverseIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + KeyFromBaseValueConverter, + FunctorsFromDerivedClasses + + >::type base_; + + // MetaData ------------------------------------------------------------- + + public: + + typedef BOOST_DEDUCED_TYPENAME Iterator::value_type::first_type key_type; + typedef BOOST_DEDUCED_TYPENAME Iterator::value_type::second_type data_type; + typedef data_type mapped_type; + + protected: + + typedef BOOST_DEDUCED_TYPENAME mpl::if_< ::boost::mpl::is_na<KeyFromBaseValueConverter>, + // { + detail::key_from_pair_extractor< BOOST_DEDUCED_TYPENAME Iterator::value_type >, + // } + // else + // { + KeyFromBaseValueConverter + // } + + >::type key_from_base_value; + + // Access ----------------------------------------------------------------- + + public: + + explicit list_map_adaptor(Base & c) : + base_(c) {} + + protected: + + typedef list_map_adaptor list_map_adaptor_; + + // Functions ------------------------------------------------------------- + + public: + + // The following functions are overwritten in order to work + // with key_type instead of value_type + + template< class Predicate > + void remove_if(Predicate pred) + { + this->base().remove_if( + ::boost::bimaps::container_adaptor::detail::unary_check_adaptor + < + Predicate, + BOOST_DEDUCED_TYPENAME Base::value_type, + key_from_base_value + + >( pred, this->template functor<key_from_base_value>() ) + ); + } + + void unique() + { + this->base().unique( + ::boost::bimaps::container_adaptor::detail::comparison_adaptor + < + std::equal_to<key_type>, + BOOST_DEDUCED_TYPENAME Base::value_type, + key_from_base_value + + >( + std::equal_to<key_type>(), + this->template functor<key_from_base_value>() + ) + ); + } + + template< class BinaryPredicate > + void unique(BinaryPredicate binary_pred) + { + this->base().unique( + ::boost::bimaps::container_adaptor::detail::comparison_adaptor + < + BinaryPredicate, + BOOST_DEDUCED_TYPENAME Base::value_type, + key_from_base_value + + >( binary_pred, this->template functor<key_from_base_value>() ) + ); + } + + void merge(list_map_adaptor & x) + { + this->base().merge(x.base(), + ::boost::bimaps::container_adaptor::detail::comparison_adaptor + < + std::less<key_type>, + BOOST_DEDUCED_TYPENAME Base::value_type, + key_from_base_value + + >( + std::less<key_type>(), + this->template functor<key_from_base_value>() + ) + ); + } + + template< class Compare > + void merge(list_map_adaptor & x, Compare comp) + { + this->base().merge(x.base(), + ::boost::bimaps::container_adaptor::detail::comparison_adaptor + < + Compare, + BOOST_DEDUCED_TYPENAME Base::value_type, + key_from_base_value + + >( comp, this->template functor<key_from_base_value>() ) + ); + } + + void sort() + { + this->base().sort( + ::boost::bimaps::container_adaptor::detail::comparison_adaptor + < + std::less<key_type>, + BOOST_DEDUCED_TYPENAME Base::value_type, + key_from_base_value + + >( + std::less<key_type>(), + this->template functor<key_from_base_value>() + ) + ); + } + + template< class Compare > + void sort(Compare comp) + { + this->base().sort( + ::boost::bimaps::container_adaptor::detail::comparison_adaptor + < + Compare, + BOOST_DEDUCED_TYPENAME Base::value_type, + key_from_base_value + + >( comp, this->template functor<key_from_base_value>() ) + ); + } + +}; + + +} // namespace container_adaptor +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_CONTAINER_ADAPTOR_LIST_MAP_ADAPTOR_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/map_adaptor.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/map_adaptor.hpp new file mode 100644 index 0000000000..04050cd28d --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/map_adaptor.hpp @@ -0,0 +1,132 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file container_adaptor/map_adaptor.hpp +/// \brief Container adaptor to easily build a std::map signature compatible container. + +#ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_MAP_ADAPTOR_HPP +#define BOOST_BIMAP_CONTAINER_ADAPTOR_MAP_ADAPTOR_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/container_adaptor/ordered_associative_container_adaptor.hpp> +#include <boost/mpl/vector.hpp> +#include <boost/mpl/aux_/na.hpp> +#include <boost/call_traits.hpp> + +namespace boost { +namespace bimaps { +namespace container_adaptor { + +/// \brief Container adaptor to easily build a std::map signature compatible container. + +template +< + class Base, + + class Iterator, + class ConstIterator, + class ReverseIterator, + class ConstReverseIterator, + + class IteratorToBaseConverter = ::boost::mpl::na, + class IteratorFromBaseConverter = ::boost::mpl::na, + class ReverseIteratorFromBaseConverter = ::boost::mpl::na, + class ValueToBaseConverter = ::boost::mpl::na, + class ValueFromBaseConverter = ::boost::mpl::na, + class KeyToBaseConverter = ::boost::mpl::na, + + class FunctorsFromDerivedClasses = mpl::vector<> +> +class map_adaptor : + + public ::boost::bimaps::container_adaptor:: + ordered_associative_container_adaptor + < + Base, + Iterator, ConstIterator, ReverseIterator, ConstReverseIterator, + BOOST_DEDUCED_TYPENAME Iterator::value_type::first_type, + IteratorToBaseConverter, IteratorFromBaseConverter, + ReverseIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + KeyToBaseConverter, + FunctorsFromDerivedClasses + > +{ + + typedef ::boost::bimaps::container_adaptor:: + ordered_associative_container_adaptor + < + Base, + Iterator, ConstIterator, ReverseIterator, ConstReverseIterator, + BOOST_DEDUCED_TYPENAME Iterator::value_type::first_type, + IteratorToBaseConverter, IteratorFromBaseConverter, + ReverseIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + KeyToBaseConverter, + FunctorsFromDerivedClasses + + > base_; + + // MetaData ------------------------------------------------------------- + + public: + + typedef BOOST_DEDUCED_TYPENAME Iterator::value_type::second_type data_type; + typedef data_type mapped_type; + + // Access ----------------------------------------------------------------- + + public: + + explicit map_adaptor(Base & c) : + base_(c) {} + + protected: + + typedef map_adaptor map_adaptor_; + + // Interface -------------------------------------------------------------- + + public: + + template< class CompatibleKey > + data_type& operator[](const CompatibleKey & k) + { + return this->base() + [this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k)]; + } + + template< class CompatibleKey > + data_type& at(const CompatibleKey & k) + { + return this->base(). + at(this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k)); + } + + template< class CompatibleKey > + const data_type& at(const CompatibleKey & k) const + { + return this->base(). + at(this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k)); + } + +}; + + +} // namespace container_adaptor +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_CONTAINER_ADAPTOR_MAP_ADAPTOR_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/multimap_adaptor.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/multimap_adaptor.hpp new file mode 100644 index 0000000000..419fb279d1 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/multimap_adaptor.hpp @@ -0,0 +1,110 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file container_adaptor/multimap_adaptor.hpp +/// \brief Container adaptor to easily build a std::multimap signature compatible container. + +#ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_MULTIMAP_ADAPTOR_HPP +#define BOOST_BIMAP_CONTAINER_ADAPTOR_MULTIMAP_ADAPTOR_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/container_adaptor/ordered_associative_container_adaptor.hpp> +#include <boost/bimap/container_adaptor/detail/non_unique_container_helper.hpp> +#include <boost/mpl/aux_/na.hpp> +#include <boost/mpl/vector.hpp> + +namespace boost { +namespace bimaps { +namespace container_adaptor { + +/// \brief Container adaptor to easily build a std::multimap signature compatible container. + +template +< + class Base, + + class Iterator, + class ConstIterator, + class ReverseIterator, + class ConstReverseIterator, + + class IteratorToBaseConverter = ::boost::mpl::na, + class IteratorFromBaseConverter = ::boost::mpl::na, + class ReverseIteratorFromBaseConverter = ::boost::mpl::na, + class ValueToBaseConverter = ::boost::mpl::na, + class ValueFromBaseConverter = ::boost::mpl::na, + class KeyToBaseConverter = ::boost::mpl::na, + + class FunctorsFromDerivedClasses = mpl::vector<> +> +class multimap_adaptor : + + public ::boost::bimaps::container_adaptor:: + ordered_associative_container_adaptor + < + Base, + Iterator, ConstIterator, ReverseIterator, ConstReverseIterator, + BOOST_DEDUCED_TYPENAME Iterator::value_type::first_type, + IteratorToBaseConverter, IteratorFromBaseConverter, + ReverseIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + KeyToBaseConverter, + FunctorsFromDerivedClasses + > +{ + typedef ::boost::bimaps::container_adaptor:: + ordered_associative_container_adaptor + < + Base, + Iterator, ConstIterator, ReverseIterator, ConstReverseIterator, + BOOST_DEDUCED_TYPENAME Iterator::value_type::first_type, + IteratorToBaseConverter, IteratorFromBaseConverter, + ReverseIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + KeyToBaseConverter, + FunctorsFromDerivedClasses + + > base_; + + // MetaData ------------------------------------------------------------- + + public: + + typedef BOOST_DEDUCED_TYPENAME Iterator::value_type::second_type data_type; + typedef data_type mapped_type; + + // Access ----------------------------------------------------------------- + + public: + + explicit multimap_adaptor(Base & c) : + base_(c) {} + + protected: + + typedef multimap_adaptor multimap_adaptor_; + + public: + + BOOST_BIMAP_NON_UNIQUE_CONTAINER_ADAPTOR_INSERT_FUNCTIONS +}; + + +} // namespace container_adaptor +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_CONTAINER_ADAPTOR_MULTIMAP_ADAPTOR_HPP + + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/multiset_adaptor.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/multiset_adaptor.hpp new file mode 100644 index 0000000000..660acaf98e --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/multiset_adaptor.hpp @@ -0,0 +1,103 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file container_adaptor/multiset_adaptor.hpp +/// \brief Container adaptor to easily build a std::multiset signature compatible container. + +#ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_MULTISET_ADAPTOR_HPP +#define BOOST_BIMAP_CONTAINER_ADAPTOR_MULTISET_ADAPTOR_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/container_adaptor/ordered_associative_container_adaptor.hpp> +#include <boost/bimap/container_adaptor/detail/non_unique_container_helper.hpp> +#include <boost/mpl/aux_/na.hpp> +#include <boost/mpl/vector.hpp> + +namespace boost { +namespace bimaps { +namespace container_adaptor { + +/// \brief Container adaptor to easily build a std::multiset signature compatible container. + +template +< + class Base, + + class Iterator, + class ConstIterator, + class ReverseIterator, + class ConstReverseIterator, + + class IteratorToBaseConverter = ::boost::mpl::na, + class IteratorFromBaseConverter = ::boost::mpl::na, + class ReverseIteratorFromBaseConverter = ::boost::mpl::na, + class ValueToBaseConverter = ::boost::mpl::na, + class ValueFromBaseConverter = ::boost::mpl::na, + class KeyToBaseConverter = ::boost::mpl::na, + + class FunctorsFromDerivedClasses = mpl::vector<> +> +class multiset_adaptor : + + public ::boost::bimaps::container_adaptor:: + ordered_associative_container_adaptor + < + Base, + Iterator, ConstIterator, ReverseIterator, ConstReverseIterator, + BOOST_DEDUCED_TYPENAME Iterator::value_type, + IteratorToBaseConverter, IteratorFromBaseConverter, + ReverseIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + KeyToBaseConverter, + FunctorsFromDerivedClasses + > +{ + + typedef ::boost::bimaps::container_adaptor:: + ordered_associative_container_adaptor + < + Base, + Iterator, ConstIterator, ReverseIterator, ConstReverseIterator, + BOOST_DEDUCED_TYPENAME Iterator::value_type, + IteratorToBaseConverter, IteratorFromBaseConverter, + ReverseIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + KeyToBaseConverter, + FunctorsFromDerivedClasses + + > base_; + + // Access ----------------------------------------------------------------- + + public: + + explicit multiset_adaptor(Base & c) : + base_(c) {} + + protected: + + typedef multiset_adaptor multiset_adaptor_; + + public: + + BOOST_BIMAP_NON_UNIQUE_CONTAINER_ADAPTOR_INSERT_FUNCTIONS +}; + + +} // namespace container_adaptor +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_CONTAINER_ADAPTOR_MULTISET_ADAPTOR_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/ordered_associative_container_adaptor.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/ordered_associative_container_adaptor.hpp new file mode 100644 index 0000000000..8b8db0613c --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/ordered_associative_container_adaptor.hpp @@ -0,0 +1,312 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file container_adaptor/ordered_associative_container_adaptor.hpp +/// \brief Container adaptor to build a type that is compliant to the concept of an ordered associative container. + +#ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_ORDERED_ASSOCIATIVE_CONTAINER_ADAPTOR_HPP +#define BOOST_BIMAP_CONTAINER_ADAPTOR_ORDERED_ASSOCIATIVE_CONTAINER_ADAPTOR_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/container_adaptor/associative_container_adaptor.hpp> +#include <boost/bimap/container_adaptor/detail/comparison_adaptor.hpp> +#include <boost/mpl/if.hpp> +#include <boost/mpl/vector.hpp> +#include <boost/mpl/push_front.hpp> +#include <boost/mpl/aux_/na.hpp> +#include <boost/operators.hpp> +#include <boost/call_traits.hpp> + +namespace boost { +namespace bimaps { +namespace container_adaptor { + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +template +< + class Base, class Iterator, class ConstIterator, + class ReverseIterator, class ConstReverseIterator, class KeyType, + class IteratorToBaseConverter, class IteratorFromBaseConverter, + class ReverseIteratorFromBaseConverter, + class ValueToBaseConverter, class ValueFromBaseConverter, + class KeyToBaseConverter, + class FunctorsFromDerivedClasses +> +struct ordered_associative_container_adaptor_base +{ + typedef associative_container_adaptor< + Base, Iterator, ConstIterator, KeyType, + IteratorToBaseConverter, IteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, KeyToBaseConverter, + + BOOST_DEDUCED_TYPENAME mpl::push_front< + + FunctorsFromDerivedClasses, + + BOOST_DEDUCED_TYPENAME mpl::if_< + ::boost::mpl::is_na<ReverseIteratorFromBaseConverter>, + // { + detail::iterator_from_base_identity + < + BOOST_DEDUCED_TYPENAME Base::reverse_iterator, + ReverseIterator, + BOOST_DEDUCED_TYPENAME Base::const_reverse_iterator, + ConstReverseIterator + >, + // } + // else + // { + ReverseIteratorFromBaseConverter + // } + + >::type + + >::type + + > type; +}; + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +/// \brief Container adaptor to build a type that is compliant to the concept of an ordered associative container. + +template +< + class Base, + + class Iterator, + class ConstIterator, + class ReverseIterator, + class ConstReverseIterator, + + class KeyType, + + class IteratorToBaseConverter = ::boost::mpl::na, + class IteratorFromBaseConverter = ::boost::mpl::na, + class ReverseIteratorFromBaseConverter = ::boost::mpl::na, + class ValueToBaseConverter = ::boost::mpl::na, + class ValueFromBaseConverter = ::boost::mpl::na, + class KeyToBaseConverter = ::boost::mpl::na, + + class FunctorsFromDerivedClasses = mpl::vector<> +> +class ordered_associative_container_adaptor : + + public ordered_associative_container_adaptor_base + < + Base, Iterator, ConstIterator, + ReverseIterator, ConstReverseIterator, KeyType, + IteratorToBaseConverter, IteratorFromBaseConverter, + ReverseIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, KeyToBaseConverter, + FunctorsFromDerivedClasses + + >::type, + + ::boost::totally_ordered + < + ordered_associative_container_adaptor + < + Base, Iterator, ConstIterator, + ReverseIterator, ConstReverseIterator, + KeyType, IteratorToBaseConverter, IteratorFromBaseConverter, + ReverseIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + KeyToBaseConverter, FunctorsFromDerivedClasses + > + > +{ + // MetaData ------------------------------------------------------------- + + typedef BOOST_DEDUCED_TYPENAME ordered_associative_container_adaptor_base + < + Base, Iterator, ConstIterator, + ReverseIterator, ConstReverseIterator, KeyType, + IteratorToBaseConverter, IteratorFromBaseConverter, + ReverseIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, KeyToBaseConverter, + FunctorsFromDerivedClasses + + >::type base_; + + public: + + typedef detail::compatible_comparison_adaptor + < + BOOST_DEDUCED_TYPENAME Base::key_compare, + BOOST_DEDUCED_TYPENAME base_::key_type, + BOOST_DEDUCED_TYPENAME base_::key_to_base + + > key_compare; + + typedef detail::comparison_adaptor + < + BOOST_DEDUCED_TYPENAME Base::value_compare, + BOOST_DEDUCED_TYPENAME base_::value_type, + BOOST_DEDUCED_TYPENAME base_::value_to_base + + > value_compare; + + typedef ReverseIterator reverse_iterator; + typedef ConstReverseIterator const_reverse_iterator; + + protected: + + typedef BOOST_DEDUCED_TYPENAME mpl::if_< + ::boost::mpl::is_na<ReverseIteratorFromBaseConverter>, + // { + detail::iterator_from_base_identity + < + BOOST_DEDUCED_TYPENAME Base::reverse_iterator, + reverse_iterator, + BOOST_DEDUCED_TYPENAME Base::const_reverse_iterator, + const_reverse_iterator + >, + // } + // else + // { + ReverseIteratorFromBaseConverter + // } + + >::type reverse_iterator_from_base; + + // Access ----------------------------------------------------------------- + + public: + + explicit ordered_associative_container_adaptor(Base & c) + : base_(c) {} + + protected: + + typedef ordered_associative_container_adaptor + ordered_associative_container_adaptor_; + + // Interface -------------------------------------------------------------- + + public: + + reverse_iterator rbegin() + { + return this->template functor< + reverse_iterator_from_base + >() ( this->base().rbegin() ); + + } + + reverse_iterator rend() + { + return this->template functor< + reverse_iterator_from_base + >() ( this->base().rend() ); + } + + const_reverse_iterator rbegin() const + { + return this->template functor< + reverse_iterator_from_base + >() ( this->base().rbegin() ); + } + + const_reverse_iterator rend() const + { + return this->template functor< + reverse_iterator_from_base + >() ( this->base().rend() ); + } + + key_compare key_comp() const + { + typedef BOOST_DEDUCED_TYPENAME base_::key_to_base key_to_base_; + + return key_compare( + this->base().key_comp(), + this->template functor<key_to_base_>() + ); + } + + value_compare value_comp() const + { + typedef BOOST_DEDUCED_TYPENAME base_::value_to_base value_to_base_; + + return value_compare( + this->base().value_comp(), + this->template functor<value_to_base_>() + ); + } + + template< class CompatibleKey > + BOOST_DEDUCED_TYPENAME base_::iterator lower_bound(const CompatibleKey & k) + { + return this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_from_base>()( + this->base().lower_bound( + this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k) + ) + ); + } + + template< class CompatibleKey > + BOOST_DEDUCED_TYPENAME base_::const_iterator lower_bound(const CompatibleKey & k) const + { + return this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_from_base>()( + this->base().lower_bound( + this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k) + ) + ); + } + + template< class CompatibleKey > + BOOST_DEDUCED_TYPENAME base_::iterator upper_bound(const CompatibleKey & k) + { + return this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_from_base>()( + this->base().upper_bound( + this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k) + ) + ); + } + + template< class CompatibleKey > + BOOST_DEDUCED_TYPENAME base_::const_iterator upper_bound(const CompatibleKey & k) const + { + return this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_from_base>()( + this->base().upper_bound( + this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k) + ) + ); + } + + // Totally ordered implementation + + bool operator==(const ordered_associative_container_adaptor & c) const + { + return ( this->base() == c.base() ); + } + + bool operator<(const ordered_associative_container_adaptor & c) const + { + return ( this->base() < c.base() ); + } +}; + + +} // namespace container_adaptor +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_CONTAINER_ADAPTOR_ORDERED_ASSOCIATIVE_CONTAINER_ADAPTOR_HPP diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/sequence_container_adaptor.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/sequence_container_adaptor.hpp new file mode 100644 index 0000000000..99a5e27738 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/sequence_container_adaptor.hpp @@ -0,0 +1,356 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file container_adaptor/sequence_container_adaptor.hpp +/// \brief Container adaptor to build a type that is compliant to the concept of a weak associative container. + +#ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_SEQUENCE_CONTAINER_ADAPTOR_HPP +#define BOOST_BIMAP_CONTAINER_ADAPTOR_SEQUENCE_CONTAINER_ADAPTOR_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <utility> + +#include <boost/mpl/if.hpp> +#include <boost/mpl/vector.hpp> +#include <boost/mpl/aux_/na.hpp> +#include <boost/bimap/container_adaptor/detail/identity_converters.hpp> +#include <boost/bimap/container_adaptor/container_adaptor.hpp> +#include <boost/call_traits.hpp> +#include <boost/operators.hpp> + +namespace boost { +namespace bimaps { +namespace container_adaptor { + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +template +< + class Base, class Iterator, class ConstIterator, + class ReverseIterator, class ConstReverseIterator, + class IteratorToBaseConverter, class IteratorFromBaseConverter, + class ReverseIteratorFromBaseConverter, + class ValueToBaseConverter, class ValueFromBaseConverter, + class FunctorsFromDerivedClasses +> +struct sequence_container_adaptor_base +{ + typedef container_adaptor + < + Base, Iterator, ConstIterator, + IteratorToBaseConverter, IteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + + BOOST_DEDUCED_TYPENAME mpl::push_front< + + FunctorsFromDerivedClasses, + + BOOST_DEDUCED_TYPENAME mpl::if_< + ::boost::mpl::is_na<ReverseIteratorFromBaseConverter>, + // { + detail::iterator_from_base_identity + < + BOOST_DEDUCED_TYPENAME Base::reverse_iterator, + ReverseIterator, + BOOST_DEDUCED_TYPENAME Base::const_reverse_iterator, + ConstReverseIterator + >, + // } + // else + // { + ReverseIteratorFromBaseConverter + // } + + >::type + + >::type + + > type; +}; + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +/// \brief Container adaptor to build a type that is compliant to the concept of a sequence container. + +template +< + class Base, + + class Iterator, + class ConstIterator, + + class ReverseIterator, + class ConstReverseIterator, + + class IteratorToBaseConverter = ::boost::mpl::na, + class IteratorFromBaseConverter = ::boost::mpl::na, + class ReverseIteratorFromBaseConverter = ::boost::mpl::na, + class ValueToBaseConverter = ::boost::mpl::na, + class ValueFromBaseConverter = ::boost::mpl::na, + + class FunctorsFromDerivedClasses = mpl::vector<> +> +class sequence_container_adaptor : + + public sequence_container_adaptor_base + < + Base, Iterator, ConstIterator, + ReverseIterator, ConstReverseIterator, + IteratorToBaseConverter, IteratorFromBaseConverter, + ReverseIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + FunctorsFromDerivedClasses + + >::type, + + ::boost::totally_ordered + < + sequence_container_adaptor + < + Base, Iterator, ConstIterator, + ReverseIterator, ConstReverseIterator, + IteratorToBaseConverter, IteratorFromBaseConverter, + ReverseIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + FunctorsFromDerivedClasses + > + > +{ + typedef BOOST_DEDUCED_TYPENAME sequence_container_adaptor_base + < + Base, Iterator, ConstIterator, + ReverseIterator, ConstReverseIterator, + IteratorToBaseConverter, IteratorFromBaseConverter, + ReverseIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + FunctorsFromDerivedClasses + + >::type base_; + + // MetaData ------------------------------------------------------------- + + public: + + typedef ReverseIterator reverse_iterator; + typedef ConstReverseIterator const_reverse_iterator; + + protected: + + typedef BOOST_DEDUCED_TYPENAME mpl::if_< + ::boost::mpl::is_na<ReverseIteratorFromBaseConverter>, + // { + detail::iterator_from_base_identity + < + BOOST_DEDUCED_TYPENAME Base::reverse_iterator, + reverse_iterator, + BOOST_DEDUCED_TYPENAME Base::const_reverse_iterator, + const_reverse_iterator + >, + // } + // else + // { + ReverseIteratorFromBaseConverter + // } + + >::type reverse_iterator_from_base; + + + // Access ----------------------------------------------------------------- + + public: + + explicit sequence_container_adaptor(Base & c) + : base_(c) {} + + protected: + + + typedef sequence_container_adaptor sequence_container_adaptor_; + + // Interface -------------------------------------------------------------- + + public: + + reverse_iterator rbegin() + { + return this->template functor< + reverse_iterator_from_base + >() ( this->base().rbegin() ); + + } + + reverse_iterator rend() + { + return this->template functor< + reverse_iterator_from_base + >() ( this->base().rend() ); + } + + const_reverse_iterator rbegin() const + { + return this->template functor< + reverse_iterator_from_base + >() ( this->base().rbegin() ); + } + + const_reverse_iterator rend() const + { + return this->template functor< + reverse_iterator_from_base + >() ( this->base().rend() ); + } + + void 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()) + { + this->base().resize(n, + this->template functor<BOOST_DEDUCED_TYPENAME base_::value_to_base>()(x) + ); + } + + BOOST_DEDUCED_TYPENAME base_::reference front() + { + return this->template functor< + BOOST_DEDUCED_TYPENAME base_::value_from_base>() + ( + this->base().front() + ); + } + + BOOST_DEDUCED_TYPENAME base_::reference back() + { + return this->template functor< + BOOST_DEDUCED_TYPENAME base_::value_from_base>() + ( + this->base().back() + ); + } + + BOOST_DEDUCED_TYPENAME base_::const_reference front() const + { + return this->template functor< + BOOST_DEDUCED_TYPENAME base_::value_from_base>() + ( + this->base().front() + ); + } + + BOOST_DEDUCED_TYPENAME base_::const_reference back() const + { + return this->template functor< + BOOST_DEDUCED_TYPENAME base_::value_from_base>() + ( + this->base().back() + ); + } + + void push_front( + BOOST_DEDUCED_TYPENAME ::boost::call_traits< + BOOST_DEDUCED_TYPENAME base_::value_type >::param_type x) + { + this->base().push_front( + this->template functor<BOOST_DEDUCED_TYPENAME base_::value_to_base>()(x)); + } + + void pop_front() + { + this->base().pop_front(); + } + + void push_back( + BOOST_DEDUCED_TYPENAME ::boost::call_traits< + BOOST_DEDUCED_TYPENAME base_::value_type >::param_type x) + { + this->base().push_back( + this->template functor<BOOST_DEDUCED_TYPENAME base_::value_to_base>()(x)); + } + + void pop_back() + { + this->base().pop_back(); + } + + std::pair<BOOST_DEDUCED_TYPENAME base_::iterator,bool> + insert(BOOST_DEDUCED_TYPENAME base_::iterator position, + BOOST_DEDUCED_TYPENAME ::boost::call_traits< + BOOST_DEDUCED_TYPENAME base_::value_type >::param_type x) + { + std::pair< BOOST_DEDUCED_TYPENAME Base::iterator, bool > r( + this->base().insert( + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position), + this->template functor< + BOOST_DEDUCED_TYPENAME base_::value_to_base >()(x) + ) + ); + + return std::pair<BOOST_DEDUCED_TYPENAME base_::iterator, bool>( + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_from_base>()(r.first), + r.second + ); + } + + void insert(BOOST_DEDUCED_TYPENAME base_::iterator position, + BOOST_DEDUCED_TYPENAME base_::size_type m, + BOOST_DEDUCED_TYPENAME ::boost::call_traits< + BOOST_DEDUCED_TYPENAME base_::value_type >::param_type x) + { + this->base().insert( + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position), + m, + this->template functor<BOOST_DEDUCED_TYPENAME base_::value_to_base >()(x) + ); + } + + template< class InputIterator > + void insert(BOOST_DEDUCED_TYPENAME base_::iterator position, + InputIterator first, InputIterator last) + { + // This is the same problem found in the insert function + // of container_adaptor + // For now, do the simple thing. This can be optimized + + for( ; first != last ; ++first ) + { + this->base().insert( + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()( position ), + this->template functor< + BOOST_DEDUCED_TYPENAME base_::value_to_base >()( *first ) + ); + } + } + + // Totally ordered implementation + + bool operator==(const sequence_container_adaptor & c) const + { + return ( this->base() == c.base() ); + } + + bool operator<(const sequence_container_adaptor & c) const + { + return ( this->base() < c.base() ); + } +}; + +} // namespace container_adaptor +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_CONTAINER_ADAPTOR_SEQUENCE_CONTAINER_ADAPTOR_HPP diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/set_adaptor.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/set_adaptor.hpp new file mode 100644 index 0000000000..c6ba052c5f --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/set_adaptor.hpp @@ -0,0 +1,100 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file container_adaptor/set_adaptor.hpp +/// \brief Container adaptor to easily build a std::set signature compatible container. + +#ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_SET_ADAPTOR_HPP +#define BOOST_BIMAP_CONTAINER_ADAPTOR_SET_ADAPTOR_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/container_adaptor/ordered_associative_container_adaptor.hpp> +#include <boost/mpl/vector.hpp> +#include <boost/mpl/aux_/na.hpp> + +namespace boost { +namespace bimaps { +namespace container_adaptor { + +/// \brief Container adaptor to easily build a std::set signature compatible container. + +template +< + class Base, + + class Iterator, + class ConstIterator, + class ReverseIterator, + class ConstReverseIterator, + + class IteratorToBaseConverter = ::boost::mpl::na, + class IteratorFromBaseConverter = ::boost::mpl::na, + class ReverseIteratorFromBaseConverter = ::boost::mpl::na, + class ValueToBaseConverter = ::boost::mpl::na, + class ValueFromBaseConverter = ::boost::mpl::na, + class KeyToBaseConverter = ::boost::mpl::na, + + class FunctorsFromDerivedClasses = mpl::vector<> +> +class set_adaptor : + + public ::boost::bimaps::container_adaptor:: + ordered_associative_container_adaptor + < + Base, + Iterator, ConstIterator, ReverseIterator, ConstReverseIterator, + BOOST_DEDUCED_TYPENAME Iterator::value_type, + IteratorToBaseConverter, IteratorFromBaseConverter, + ReverseIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + KeyToBaseConverter, + FunctorsFromDerivedClasses + > +{ + + typedef ::boost::bimaps::container_adaptor:: + ordered_associative_container_adaptor + < + Base, + Iterator, ConstIterator, ReverseIterator, ConstReverseIterator, + BOOST_DEDUCED_TYPENAME Iterator::value_type, + IteratorToBaseConverter, IteratorFromBaseConverter, + ReverseIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + KeyToBaseConverter, + FunctorsFromDerivedClasses + + > base_; + + // Access ----------------------------------------------------------------- + + public: + + explicit set_adaptor(Base & c) : + base_(c) {} + + protected: + + typedef set_adaptor set_adaptor_; + +}; + + +} // namespace container_adaptor +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_CONTAINER_ADAPTOR_SET_ADAPTOR_HPP + + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/support/iterator_facade_converters.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/support/iterator_facade_converters.hpp new file mode 100644 index 0000000000..98c32b0cad --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/support/iterator_facade_converters.hpp @@ -0,0 +1,77 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file container_adaptor/support/iterator_facade_converters.hpp +/// \brief Converter for Boost.Iterators based iterators. + +#ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_DETAIL_ITERATOR_FACADE_CONVERTERS_HPP +#define BOOST_BIMAP_CONTAINER_ADAPTOR_DETAIL_ITERATOR_FACADE_CONVERTERS_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +namespace boost { +namespace bimaps { +namespace container_adaptor { + +/// \brief Utilities to help in the construction of a container adaptor + +namespace support { + +/// \brief Converter for Boost.Iterators based iterators. +/** +Container adaptor is designed to play well with Boost.Iterators. This +converter can be used if this library is used to adapt the iterators. + **/ +template +< + class Iterator, + class ConstIterator +> +struct iterator_facade_to_base +{ + BOOST_DEDUCED_TYPENAME Iterator::base_type operator()(Iterator iter) const + { + return iter.base(); + } + + BOOST_DEDUCED_TYPENAME ConstIterator::base_type operator()(ConstIterator iter) const + { + return iter.base(); + } +}; + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +template +< + class Iterator +> +struct iterator_facade_to_base<Iterator,Iterator> +{ + BOOST_DEDUCED_TYPENAME Iterator::base_type operator()(Iterator iter) const + { + return iter.base(); + } +}; + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +#undef BOOST_BIMAP_CONTAINER_ADAPTOR_IMPLEMENT_CONVERT_FACADE_FUNCTION + + +} // namespace support +} // namespace container_adaptor +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_CONTAINER_ADAPTOR_DETAIL_ITERATOR_FACADE_CONVERTERS_HPP diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/unordered_associative_container_adaptor.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/unordered_associative_container_adaptor.hpp new file mode 100644 index 0000000000..7ecffcf7d7 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/unordered_associative_container_adaptor.hpp @@ -0,0 +1,293 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file container_adaptor/unordered_associative_container_adaptor.hpp +/// \brief Container adaptor to build a type that is compliant to the concept of an unordered associative container. + +#ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_UNORDERED_ASSOCIATIVE_CONTAINER_ADAPTOR_HPP +#define BOOST_BIMAP_CONTAINER_ADAPTOR_UNORDERED_ASSOCIATIVE_CONTAINER_ADAPTOR_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/container_adaptor/associative_container_adaptor.hpp> +#include <boost/mpl/if.hpp> +#include <boost/mpl/vector.hpp> +#include <boost/mpl/push_front.hpp> +#include <boost/mpl/aux_/na.hpp> +#include <boost/call_traits.hpp> + +namespace boost { +namespace bimaps { +namespace container_adaptor { + + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +template +< + class Base, class Iterator, class ConstIterator, + class LocalIterator, class ConstLocalIterator, + class KeyType, + class IteratorToBaseConverter, class IteratorFromBaseConverter, + class LocalIteratorFromBaseConverter, + class ValueToBaseConverter, class ValueFromBaseConverter, + class KeyToBaseConverter, + class FunctorsFromDerivedClasses +> +struct unordered_associative_container_adaptor_base +{ + + typedef associative_container_adaptor + < + Base, Iterator, ConstIterator, KeyType, + IteratorToBaseConverter, IteratorFromBaseConverter, + ValueToBaseConverter , ValueFromBaseConverter, + KeyToBaseConverter, + + BOOST_DEDUCED_TYPENAME mpl::push_front< + + FunctorsFromDerivedClasses, + + BOOST_DEDUCED_TYPENAME mpl::if_< + ::boost::mpl::is_na<LocalIteratorFromBaseConverter>, + // { + detail::iterator_from_base_identity + < + BOOST_DEDUCED_TYPENAME Base::local_iterator, + LocalIterator, + BOOST_DEDUCED_TYPENAME Base::const_local_iterator, + ConstLocalIterator + >, + // } + // else + // { + LocalIteratorFromBaseConverter + // } + + >::type + + >::type + + > type; +}; + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + + +/// \brief Container adaptor to build a type that is compliant to the concept of an unordered associative container. + +template +< + class Base, + + class Iterator, + class ConstIterator, + + class LocalIterator, + class ConstLocalIterator, + + class KeyType, + + class IteratorToBaseConverter = ::boost::mpl::na, + class IteratorFromBaseConverter = ::boost::mpl::na, + class LocalIteratorFromBaseConverter = ::boost::mpl::na, + class ValueToBaseConverter = ::boost::mpl::na, + class ValueFromBaseConverter = ::boost::mpl::na, + class KeyToBaseConverter = ::boost::mpl::na, + + class FunctorsFromDerivedClasses = mpl::vector<> + +> +class unordered_associative_container_adaptor : + + public unordered_associative_container_adaptor_base + < + Base, Iterator, ConstIterator, + LocalIterator, ConstLocalIterator, + KeyType, + IteratorToBaseConverter, IteratorFromBaseConverter, + LocalIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + KeyToBaseConverter, + FunctorsFromDerivedClasses + + >::type +{ + typedef BOOST_DEDUCED_TYPENAME unordered_associative_container_adaptor_base + < + Base, Iterator, ConstIterator, + LocalIterator, ConstLocalIterator, + KeyType, + IteratorToBaseConverter, IteratorFromBaseConverter, + LocalIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + KeyToBaseConverter, + FunctorsFromDerivedClasses + + >::type base_; + + // Metadata --------------------------------------------------------------- + + public: + + typedef BOOST_DEDUCED_TYPENAME Base::key_equal key_equal; + typedef BOOST_DEDUCED_TYPENAME Base::hasher hasher; + + typedef LocalIterator local_iterator; + typedef ConstLocalIterator const_local_iterator; + + protected: + + typedef BOOST_DEDUCED_TYPENAME mpl::if_< + ::boost::mpl::is_na<LocalIteratorFromBaseConverter>, + // { + detail::iterator_from_base_identity + < + BOOST_DEDUCED_TYPENAME Base::local_iterator, + local_iterator, + BOOST_DEDUCED_TYPENAME Base::const_local_iterator, + const_local_iterator + >, + // } + // else + // { + LocalIteratorFromBaseConverter + // } + + >::type local_iterator_from_base; + + // Access ----------------------------------------------------------------- + + public: + + explicit unordered_associative_container_adaptor(Base & c) + : base_(c) {} + + protected: + + + typedef unordered_associative_container_adaptor + unordered_associative_container_adaptor_; + + // Interface -------------------------------------------------------------- + + public: + + // bucket interface: + + BOOST_DEDUCED_TYPENAME base_::size_type bucket_count() const + { + return this->base().bucket_count(); + } + + BOOST_DEDUCED_TYPENAME base_::size_type max_bucket_count() const + { + return this->base().max_bucket_count(); + } + + BOOST_DEDUCED_TYPENAME base_::size_type bucket_size( + BOOST_DEDUCED_TYPENAME base_::size_type n) const + { + return this->base().bucket_size(n); + } + + template< class CompatibleKey > + BOOST_DEDUCED_TYPENAME base_::size_type bucket( + const CompatibleKey & k) const + { + typedef BOOST_DEDUCED_TYPENAME base_::key_to_base key_to_base; + return this->base().bucket( + this->template functor<key_to_base>()(k) + ); + } + + local_iterator begin(BOOST_DEDUCED_TYPENAME base_::size_type n) + { + return this->template functor< + local_iterator_from_base + >() ( this->base().begin(n) ); + } + + const_local_iterator begin(BOOST_DEDUCED_TYPENAME base_::size_type n) const + { + return this->template functor< + local_iterator_from_base + >() ( this->base().begin(n) ); + } + + local_iterator end(BOOST_DEDUCED_TYPENAME base_::size_type n) + { + return this->template functor< + local_iterator_from_base + >() ( this->base().end(n) ); + } + + const_local_iterator end(BOOST_DEDUCED_TYPENAME base_::size_type n) const + { + return this->template functor< + local_iterator_from_base + >() ( this->base().end(n) ); + } + + // hash policy + + float load_factor() const + { + return this->base().load_factor(); + } + + float max_load_factor() const + { + return this->base().max_load_factor(); + } + + void max_load_factor(float z) + { + return this->base().max_load_factor(z); + } + + void rehash(BOOST_DEDUCED_TYPENAME base_::size_type n) + { + return this->base().rehash(n); + } + + // We have redefined end and begin so we have to manually route the old ones + + BOOST_DEDUCED_TYPENAME base_::iterator begin() + { + return base_::container_adaptor_::begin(); + } + + BOOST_DEDUCED_TYPENAME base_::iterator end() + { + return base_::container_adaptor_::end(); + } + + BOOST_DEDUCED_TYPENAME base_::const_iterator begin() const + { + return base_::container_adaptor_::begin(); + } + + BOOST_DEDUCED_TYPENAME base_::const_iterator end() const + { + return base_::container_adaptor_::end(); + } + +}; + + +} // namespace container_adaptor +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_CONTAINER_ADAPTOR_UNORDERED_ASSOCIATIVE_CONTAINER_ADAPTOR_HPP diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/unordered_map_adaptor.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/unordered_map_adaptor.hpp new file mode 100644 index 0000000000..d5a38ad404 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/unordered_map_adaptor.hpp @@ -0,0 +1,133 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file container_adaptor/unordered_map_adaptor.hpp +/// \brief Container adaptor to easily build a std::unordered_map signature compatible container. + +#ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_UNORDERED_MAP_ADAPTOR_HPP +#define BOOST_BIMAP_CONTAINER_ADAPTOR_UNORDERED_MAP_ADAPTOR_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/container_adaptor/unordered_associative_container_adaptor.hpp> +#include <boost/mpl/aux_/na.hpp> +#include <boost/mpl/vector.hpp> +#include <boost/call_traits.hpp> + +namespace boost { +namespace bimaps { +namespace container_adaptor { + +/// \brief Container adaptor to easily build a std::unordered_map signature compatible container. + +template +< + class Base, + + class Iterator, + class ConstIterator, + class LocalIterator, + class ConstLocalIterator, + + class IteratorToBaseConverter = ::boost::mpl::na, + class IteratorFromBaseConverter = ::boost::mpl::na, + class LocalIteratorFromBaseConverter = ::boost::mpl::na, + class ValueToBaseConverter = ::boost::mpl::na, + class ValueFromBaseConverter = ::boost::mpl::na, + class KeyToBaseConverter = ::boost::mpl::na, + + class FunctorsFromDerivedClasses = mpl::vector<> +> +class unordered_map_adaptor : + + public ::boost::bimaps::container_adaptor:: + unordered_associative_container_adaptor + < + Base, + Iterator, ConstIterator, LocalIterator, ConstLocalIterator, + BOOST_DEDUCED_TYPENAME Iterator::value_type::first_type, + IteratorToBaseConverter, IteratorFromBaseConverter, + LocalIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + KeyToBaseConverter, + FunctorsFromDerivedClasses + > +{ + + typedef ::boost::bimaps::container_adaptor:: + unordered_associative_container_adaptor + < + Base, + Iterator, ConstIterator, LocalIterator, ConstLocalIterator, + BOOST_DEDUCED_TYPENAME Iterator::value_type::first_type, + IteratorToBaseConverter, IteratorFromBaseConverter, + LocalIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + KeyToBaseConverter, + FunctorsFromDerivedClasses + + > base_; + + // MetaData ------------------------------------------------------------- + + public: + + typedef BOOST_DEDUCED_TYPENAME Iterator::value_type::second_type data_type; + typedef data_type mapped_type; + + // Access ----------------------------------------------------------------- + + public: + + explicit unordered_map_adaptor(Base & c) : + base_(c) {} + + protected: + + typedef unordered_map_adaptor unordered_map_adaptor_; + + // Interface -------------------------------------------------------------- + + public: + + template< class CompatibleKey > + data_type& operator[](const CompatibleKey & k) + { + return this->base() + [this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k)]; + } + + template< class CompatibleKey > + data_type& at(const CompatibleKey & k) + { + return this->base(). + at(this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k)); + } + + template< class CompatibleKey > + const data_type& at(const CompatibleKey & k) const + { + return this->base(). + at(this->template functor<BOOST_DEDUCED_TYPENAME base_::key_to_base>()(k)); + } + +}; + + + +} // namespace container_adaptor +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_CONTAINER_ADAPTOR_UNORDERED_MAP_ADAPTOR_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/unordered_multimap_adaptor.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/unordered_multimap_adaptor.hpp new file mode 100644 index 0000000000..473ed49e2e --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/unordered_multimap_adaptor.hpp @@ -0,0 +1,111 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file container_adaptor/unordered_multimap_adaptor.hpp +/// \brief Container adaptor to easily build a std::unordered_multimap signature compatible container. + +#ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_UNORDERED_MULTIMAP_ADAPTOR_HPP +#define BOOST_BIMAP_CONTAINER_ADAPTOR_UNORDERED_MULTIMAP_ADAPTOR_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/container_adaptor/unordered_associative_container_adaptor.hpp> +#include <boost/bimap/container_adaptor/detail/non_unique_container_helper.hpp> +#include <boost/mpl/aux_/na.hpp> +#include <boost/mpl/vector.hpp> + +namespace boost { +namespace bimaps { +namespace container_adaptor { + +/// \brief Container adaptor to easily build a std::unordered_multimap signature compatible container. + +template +< + class Base, + + class Iterator, + class ConstIterator, + class LocalIterator, + class ConstLocalIterator, + + class IteratorToBaseConverter = ::boost::mpl::na, + class IteratorFromBaseConverter = ::boost::mpl::na, + class LocalIteratorFromBaseConverter = ::boost::mpl::na, + class ValueToBaseConverter = ::boost::mpl::na, + class ValueFromBaseConverter = ::boost::mpl::na, + class KeyToBaseConverter = ::boost::mpl::na, + + class FunctorsFromDerivedClasses = mpl::vector<> +> +class unordered_multimap_adaptor : + + public ::boost::bimaps::container_adaptor:: + unordered_associative_container_adaptor + < + Base, + Iterator, ConstIterator, LocalIterator, ConstLocalIterator, + BOOST_DEDUCED_TYPENAME Iterator::value_type::first_type, + IteratorToBaseConverter, IteratorFromBaseConverter, + LocalIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + KeyToBaseConverter, + FunctorsFromDerivedClasses + > +{ + typedef ::boost::bimaps::container_adaptor:: + unordered_associative_container_adaptor + < + Base, + Iterator, ConstIterator, LocalIterator, ConstLocalIterator, + BOOST_DEDUCED_TYPENAME Iterator::value_type::first_type, + IteratorToBaseConverter, IteratorFromBaseConverter, + LocalIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + KeyToBaseConverter, + FunctorsFromDerivedClasses + + > base_; + + // MetaData ------------------------------------------------------------- + + public: + + typedef BOOST_DEDUCED_TYPENAME Iterator::value_type::second_type data_type; + typedef data_type mapped_type; + + // Access ----------------------------------------------------------------- + + public: + + explicit unordered_multimap_adaptor(Base & c) : + base_(c) {} + + protected: + + typedef unordered_multimap_adaptor unordered_multimap_adaptor_; + + public: + + BOOST_BIMAP_NON_UNIQUE_CONTAINER_ADAPTOR_INSERT_FUNCTIONS +}; + + + +} // namespace container_adaptor +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_CONTAINER_ADAPTOR_UNORDERED_MULTIMAP_ADAPTOR_HPP + + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/unordered_multiset_adaptor.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/unordered_multiset_adaptor.hpp new file mode 100644 index 0000000000..5406e8793f --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/unordered_multiset_adaptor.hpp @@ -0,0 +1,102 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file container_adaptor/unordered_multiset_adaptor.hpp +/// \brief Container adaptor to easily build a std::unordered_multiset signature compatible container. + +#ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_UNORDERED_MULTISET_ADAPTOR_HPP +#define BOOST_BIMAP_CONTAINER_ADAPTOR_UNORDERED_MULTISET_ADAPTOR_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/container_adaptor/unordered_associative_container_adaptor.hpp> +#include <boost/bimap/container_adaptor/detail/non_unique_container_helper.hpp> +#include <boost/mpl/aux_/na.hpp> +#include <boost/mpl/vector.hpp> + +namespace boost { +namespace bimaps { +namespace container_adaptor { + +/// \brief Container adaptor to easily build a std::unordered_multiset signature compatible container. + +template +< + class Base, + + class Iterator, + class ConstIterator, + class LocalIterator, + class ConstLocalIterator, + + class IteratorToBaseConverter = ::boost::mpl::na, + class IteratorFromBaseConverter = ::boost::mpl::na, + class LocalIteratorFromBaseConverter = ::boost::mpl::na, + class ValueToBaseConverter = ::boost::mpl::na, + class ValueFromBaseConverter = ::boost::mpl::na, + class KeyToBaseConverter = ::boost::mpl::na, + + class FunctorsFromDerivedClasses = mpl::vector<> +> +class unordered_multiset_adaptor : + + public ::boost::bimaps::container_adaptor:: + unordered_associative_container_adaptor + < + Base, + Iterator, ConstIterator, LocalIterator, ConstLocalIterator, + BOOST_DEDUCED_TYPENAME Iterator::value_type, + IteratorToBaseConverter, IteratorFromBaseConverter, + LocalIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + KeyToBaseConverter, + FunctorsFromDerivedClasses + > +{ + typedef ::boost::bimaps::container_adaptor:: + unordered_associative_container_adaptor + < + Base, + Iterator, ConstIterator, LocalIterator, ConstLocalIterator, + BOOST_DEDUCED_TYPENAME Iterator::value_type, + IteratorToBaseConverter, IteratorFromBaseConverter, + LocalIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + KeyToBaseConverter, + FunctorsFromDerivedClasses + + > base_; + + // Access ----------------------------------------------------------------- + + public: + + explicit unordered_multiset_adaptor(Base & c) : + base_(c) {} + + protected: + + typedef unordered_multiset_adaptor unordered_multiset_adaptor_; + + public: + + BOOST_BIMAP_NON_UNIQUE_CONTAINER_ADAPTOR_INSERT_FUNCTIONS +}; + + +} // namespace container_adaptor +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_CONTAINER_ADAPTOR_UNORDERED_MULTISET_ADAPTOR_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/unordered_set_adaptor.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/unordered_set_adaptor.hpp new file mode 100644 index 0000000000..840f02b051 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/unordered_set_adaptor.hpp @@ -0,0 +1,98 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file container_adaptor/unordered_set_adaptor.hpp +/// \brief Container adaptor to easily build a std::unordered_set signature compatible container. + +#ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_UNORDERED_SET_ADAPTOR_HPP +#define BOOST_BIMAP_CONTAINER_ADAPTOR_UNORDERED_SET_ADAPTOR_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/container_adaptor/unordered_associative_container_adaptor.hpp> +#include <boost/mpl/aux_/na.hpp> +#include <boost/mpl/vector.hpp> + +namespace boost { +namespace bimaps { +namespace container_adaptor { + +/// \brief Container adaptor to easily build a std::unordered_set signature compatible container. + +template +< + class Base, + + class Iterator, + class ConstIterator, + class LocalIterator, + class ConstLocalIterator, + + class IteratorToBaseConverter = ::boost::mpl::na, + class IteratorFromBaseConverter = ::boost::mpl::na, + class LocalIteratorFromBaseConverter = ::boost::mpl::na, + class ValueToBaseConverter = ::boost::mpl::na, + class ValueFromBaseConverter = ::boost::mpl::na, + class KeyToBaseConverter = ::boost::mpl::na, + + class FunctorsFromDerivedClasses = mpl::vector<> +> +class unordered_set_adaptor : + + public ::boost::bimaps::container_adaptor:: + unordered_associative_container_adaptor + < + Base, + Iterator, ConstIterator, LocalIterator, ConstLocalIterator, + BOOST_DEDUCED_TYPENAME Iterator::value_type, + IteratorToBaseConverter, IteratorFromBaseConverter, + LocalIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + KeyToBaseConverter, + FunctorsFromDerivedClasses + > +{ + typedef ::boost::bimaps::container_adaptor:: + unordered_associative_container_adaptor + < + Base, + Iterator, ConstIterator, LocalIterator, ConstLocalIterator, + BOOST_DEDUCED_TYPENAME Iterator::value_type, + IteratorToBaseConverter, IteratorFromBaseConverter, + LocalIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + KeyToBaseConverter, + FunctorsFromDerivedClasses + + > base_; + + // Access ----------------------------------------------------------------- + + public: + + explicit unordered_set_adaptor(Base & c) : + base_(c) {} + + protected: + + typedef unordered_set_adaptor unordered_set_adaptor_; + +}; + + +} // namespace container_adaptor +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_CONTAINER_ADAPTOR_UNORDERED_SET_ADAPTOR_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/vector_adaptor.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/vector_adaptor.hpp new file mode 100644 index 0000000000..e1d9cfae43 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/vector_adaptor.hpp @@ -0,0 +1,150 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file container_adaptor/vector_adaptor.hpp +/// \brief Container adaptor to easily build a std::vector signature compatible container. + +#ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_VECTOR_ADAPTOR_HPP +#define BOOST_BIMAP_CONTAINER_ADAPTOR_VECTOR_ADAPTOR_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/container_adaptor/sequence_container_adaptor.hpp> +#include <boost/mpl/aux_/na.hpp> +#include <boost/mpl/vector.hpp> + +namespace boost { +namespace bimaps { +namespace container_adaptor { + +/// \brief Container adaptor to easily build a std::vector signature compatible container. + +template +< + class Base, + + class Iterator, + class ConstIterator, + class ReverseIterator, + class ConstReverseIterator, + + class IteratorToBaseConverter = ::boost::mpl::na, + class IteratorFromBaseConverter = ::boost::mpl::na, + class ReverseIteratorFromBaseConverter = ::boost::mpl::na, + class ValueToBaseConverter = ::boost::mpl::na, + class ValueFromBaseConverter = ::boost::mpl::na, + + class FunctorsFromDerivedClasses = mpl::vector<> +> +class vector_adaptor : + + public ::boost::bimaps::container_adaptor::sequence_container_adaptor + < + Base, + Iterator, ConstIterator, ReverseIterator, ConstReverseIterator, + IteratorToBaseConverter, IteratorFromBaseConverter, + ReverseIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + FunctorsFromDerivedClasses + > +{ + + typedef ::boost::bimaps::container_adaptor::sequence_container_adaptor + < + Base, + Iterator, ConstIterator, ReverseIterator, ConstReverseIterator, + IteratorToBaseConverter, IteratorFromBaseConverter, + ReverseIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + FunctorsFromDerivedClasses + + > base_; + + // Access ----------------------------------------------------------------- + + public: + + vector_adaptor() {} + + explicit vector_adaptor(Base & c) : + base_(c) {} + + protected: + + typedef vector_adaptor vector_adaptor_; + + // Interface -------------------------------------------------------------- + + public: + + BOOST_DEDUCED_TYPENAME base_::size_type capacity() const + { + return this->base().capacity(); + } + + void reserve(BOOST_DEDUCED_TYPENAME base_::size_type m) + { + this->base().resize(m); + } + + void 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()) + { + this->base().resize(n, + this->template functor<BOOST_DEDUCED_TYPENAME base_::value_to_base>()(x) + ); + } + + BOOST_DEDUCED_TYPENAME base_::const_reference + operator[](BOOST_DEDUCED_TYPENAME base_::size_type n) const + { + return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()( + this->base().operator[](n) + ); + } + + BOOST_DEDUCED_TYPENAME base_::const_reference + at(BOOST_DEDUCED_TYPENAME base_::size_type n) const + { + return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()( + this->base().at(n) + ); + } + + BOOST_DEDUCED_TYPENAME base_::reference + operator[](BOOST_DEDUCED_TYPENAME base_::size_type n) + { + return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()( + this->base().operator[](n) + ); + } + + BOOST_DEDUCED_TYPENAME base_::reference + at(BOOST_DEDUCED_TYPENAME base_::size_type n) + { + return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()( + this->base().at(n) + ); + } +}; + + +} // namespace container_adaptor +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_CONTAINER_ADAPTOR_VECTOR_ADAPTOR_HPP + + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/vector_map_adaptor.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/vector_map_adaptor.hpp new file mode 100644 index 0000000000..b0dfe92586 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/container_adaptor/vector_map_adaptor.hpp @@ -0,0 +1,104 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file container_adaptor/vector_map_adaptor.hpp +/// \brief Container adaptor. + +#ifndef BOOST_BIMAP_CONTAINER_ADAPTOR_VECTOR_MAP_ADAPTOR_HPP +#define BOOST_BIMAP_CONTAINER_ADAPTOR_VECTOR_MAP_ADAPTOR_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/mpl/list.hpp> +#include <boost/mpl/push_front.hpp> +#include <boost/mpl/aux_/na.hpp> +#include <boost/bimap/container_adaptor/vector_adaptor.hpp> +#include <boost/bimap/container_adaptor/detail/identity_converters.hpp> +#include <boost/mpl/vector.hpp> + +namespace boost { +namespace bimaps { +namespace container_adaptor { + +/// \brief Container adaptor. + +template +< + class Base, + + class Iterator, + class ConstIterator, + class ReverseIterator, + class ConstReverseIterator, + + class IteratorToBaseConverter = ::boost::mpl::na, + class IteratorFromBaseConverter = ::boost::mpl::na, + class ReverseIteratorFromBaseConverter = ::boost::mpl::na, + class ValueToBaseConverter = ::boost::mpl::na, + class ValueFromBaseConverter = ::boost::mpl::na, + + class FunctorsFromDerivedClasses = mpl::vector<> +> +class vector_map_adaptor : + + public vector_adaptor + < + Base, + Iterator, ConstIterator, ReverseIterator, ConstReverseIterator, + IteratorToBaseConverter, IteratorFromBaseConverter, + ReverseIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + FunctorsFromDerivedClasses + > +{ + typedef vector_adaptor + < + Base, + Iterator, ConstIterator, ReverseIterator, ConstReverseIterator, + IteratorToBaseConverter, IteratorFromBaseConverter, + ReverseIteratorFromBaseConverter, + ValueToBaseConverter, ValueFromBaseConverter, + FunctorsFromDerivedClasses + + > base_; + + // MetaData ------------------------------------------------------------- + + public: + + typedef BOOST_DEDUCED_TYPENAME Iterator::value_type::first_type key_type; + typedef BOOST_DEDUCED_TYPENAME Iterator::value_type::second_type data_type; + typedef data_type mapped_type; + + // Access ----------------------------------------------------------------- + + public: + + vector_map_adaptor() {} + + explicit vector_map_adaptor(Base & c) : + base_(c) {} + + protected: + + typedef vector_map_adaptor vector_map_adaptor_; + +}; + + +} // namespace container_adaptor +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_CONTAINER_ADAPTOR_VECTOR_MAP_ADAPTOR_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/detail/bimap_core.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/detail/bimap_core.hpp new file mode 100644 index 0000000000..0d2ca99b88 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/detail/bimap_core.hpp @@ -0,0 +1,478 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file detail/bimap_core.hpp +/// \brief Bimap base definition. + +#ifndef BOOST_BIMAP_DETAIL_BIMAP_CORE_HPP +#define BOOST_BIMAP_DETAIL_BIMAP_CORE_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/mpl/placeholders.hpp> +#include <boost/mpl/push_front.hpp> +#include <boost/mpl/if.hpp> +#include <boost/mpl/and.hpp> +#include <boost/mpl/not.hpp> +#include <boost/mpl/vector.hpp> + +#include <boost/type_traits/add_const.hpp> +#include <boost/type_traits/is_same.hpp> + +#include <boost/concept_check.hpp> + +// Boost.MultiIndex +#include <boost/multi_index_container.hpp> +#include <boost/multi_index/member.hpp> + +// Boost.Bimap +#include <boost/bimap/relation/mutant_relation.hpp> +#include <boost/bimap/relation/member_at.hpp> +#include <boost/bimap/relation/support/data_extractor.hpp> +#include <boost/bimap/tags/support/default_tagged.hpp> +#include <boost/bimap/tags/tagged.hpp> +#include <boost/bimap/detail/manage_bimap_key.hpp> +#include <boost/bimap/detail/manage_additional_parameters.hpp> +#include <boost/bimap/detail/map_view_iterator.hpp> +#include <boost/bimap/detail/set_view_iterator.hpp> + +#include <boost/bimap/set_of.hpp> +#include <boost/bimap/unconstrained_set_of.hpp> +#include <boost/core/allocator_access.hpp> + +namespace boost { +namespace bimaps { + +/// \brief Library details + +namespace detail { + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +template< class Type > +struct get_value_type +{ + typedef BOOST_DEDUCED_TYPENAME Type::value_type type; +}; + +struct independent_index_tag {}; + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + + +/// \brief Base for the bimap class. +/** + + +See also bimap. + **/ + + +template< class LeftSetType, class RightSetType, class AP1, class AP2, class AP3 > +class bimap_core +{ + // Manage bimap key instantiation + // -------------------------------------------------------------------- + public: + + typedef BOOST_DEDUCED_TYPENAME manage_bimap_key + < + LeftSetType + + >::type left_set_type; + + typedef BOOST_DEDUCED_TYPENAME manage_bimap_key + < + RightSetType + + >::type right_set_type; + + + private: + + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::tags::support::default_tagged + < + BOOST_DEDUCED_TYPENAME left_set_type::user_type, + ::boost::bimaps::relation::member_at::left + + >::type left_tagged_type; + + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::tags::support::default_tagged + < + BOOST_DEDUCED_TYPENAME right_set_type::user_type, + ::boost::bimaps::relation::member_at::right + + >::type right_tagged_type; + + public: + + //@{ + + typedef BOOST_DEDUCED_TYPENAME left_tagged_type::tag left_tag; + typedef BOOST_DEDUCED_TYPENAME right_tagged_type::tag right_tag; + + //@} + + //@{ + + typedef BOOST_DEDUCED_TYPENAME left_set_type::value_type left_key_type; + typedef BOOST_DEDUCED_TYPENAME right_set_type::value_type right_key_type; + + //@} + + //@{ + + typedef right_key_type left_data_type; + typedef left_key_type right_data_type; + + //@} + + // Manage the additional parameters + // -------------------------------------------------------------------- + private: + + typedef BOOST_DEDUCED_TYPENAME manage_additional_parameters<AP1,AP2,AP3>::type parameters; + + /// \brief Relation type stored by the bimap. + // -------------------------------------------------------------------- + public: + + typedef ::boost::bimaps::relation::mutant_relation + < + + ::boost::bimaps::tags::tagged< + BOOST_DEDUCED_TYPENAME mpl::if_< + mpl::and_ + < + BOOST_DEDUCED_TYPENAME left_set_type::mutable_key, + BOOST_DEDUCED_TYPENAME parameters::set_type_of_relation::left_mutable_key + >, + // { + left_key_type, + // } + // else + // { + BOOST_DEDUCED_TYPENAME ::boost::add_const< left_key_type >::type + // } + + >::type, + left_tag + >, + + ::boost::bimaps::tags::tagged< + BOOST_DEDUCED_TYPENAME mpl::if_< + mpl::and_ + < + BOOST_DEDUCED_TYPENAME right_set_type::mutable_key, + BOOST_DEDUCED_TYPENAME parameters::set_type_of_relation::right_mutable_key + >, + // { + right_key_type, + // } + // else + // { + BOOST_DEDUCED_TYPENAME ::boost::add_const< right_key_type >::type + // } + + >::type, + right_tag + >, + + // It is ::boost::mpl::na if no info_hook was included + BOOST_DEDUCED_TYPENAME parameters::additional_info, + + // Force mutable keys + true + + > relation; + + //@{ + + typedef BOOST_DEDUCED_TYPENAME relation::left_pair left_value_type; + typedef BOOST_DEDUCED_TYPENAME relation::right_pair right_value_type; + + //@} + + // Bind the member of the relation, so multi_index can manage them + // -------------------------------------------------------------------- + private: + + typedef BOOST_DEDUCED_TYPENAME relation::storage_base relation_storage_base; + + typedef BOOST_MULTI_INDEX_MEMBER(relation_storage_base, left_key_type, left) + left_member_extractor; + + typedef BOOST_MULTI_INDEX_MEMBER(relation_storage_base,right_key_type,right) + right_member_extractor; + + // The core indices are somewhat complicated to calculate, because they + // can be zero, one, two or three indices, depending on the use of + // {side}_based set type of relations and unconstrained_set_of and + // unconstrained_set_of_relation specifications. + + typedef BOOST_DEDUCED_TYPENAME mpl::if_< + ::boost::bimaps::detail::is_unconstrained_set_of< left_set_type >, + // { + mpl::vector<>, + // } + // else + // { + mpl::vector + < + BOOST_DEDUCED_TYPENAME left_set_type:: + BOOST_NESTED_TEMPLATE index_bind + < + left_member_extractor, + left_tag + + >::type + > + // } + >::type left_core_indices; + + typedef BOOST_DEDUCED_TYPENAME mpl::if_< + ::boost::bimaps::detail::is_unconstrained_set_of< right_set_type >, + // { + left_core_indices, + // } + // else + // { + BOOST_DEDUCED_TYPENAME mpl::push_front + < + left_core_indices, + + BOOST_DEDUCED_TYPENAME right_set_type:: + BOOST_NESTED_TEMPLATE index_bind + < + right_member_extractor, + right_tag + + >::type + + >::type + // } + >::type basic_core_indices; + + // If it is based either on the left or on the right, then only the side + // indices are needed. But the set type of the relation can be completely + // different from the one used for the sides in which case we have to add yet + // another index to the core. + + // TODO + // If all the set types are unsconstrained there must be readable compile + // time error. + + typedef BOOST_DEDUCED_TYPENAME mpl::if_< + + is_same< BOOST_DEDUCED_TYPENAME parameters::set_type_of_relation, left_based >, + // { + ::boost::bimaps::tags::tagged< left_set_type, left_tag >, + // } + /* else */ BOOST_DEDUCED_TYPENAME mpl::if_< + is_same< BOOST_DEDUCED_TYPENAME parameters::set_type_of_relation, right_based >, + // { + ::boost::bimaps::tags::tagged< right_set_type, right_tag >, + // } + // else + // { + tags::tagged + < + BOOST_DEDUCED_TYPENAME parameters:: + set_type_of_relation::BOOST_NESTED_TEMPLATE bind_to + < + relation + + >::type, + independent_index_tag + > + // } + >::type + >::type tagged_set_of_relation_type; + + protected: + + typedef BOOST_DEDUCED_TYPENAME tagged_set_of_relation_type::tag + relation_set_tag; + + typedef BOOST_DEDUCED_TYPENAME tagged_set_of_relation_type::value_type + relation_set_type_of; + + // Logic tags + // This is a necessary extra level of indirection to allow unconstrained + // sets to be plug in the design. The bimap constructors use this logic + // tags. + + typedef BOOST_DEDUCED_TYPENAME mpl::if_< + ::boost::bimaps::detail::is_unconstrained_set_of< left_set_type >, + + BOOST_DEDUCED_TYPENAME mpl::if_< + ::boost::bimaps::detail::is_unconstrained_set_of< right_set_type >, + + independent_index_tag, + right_tag + + >::type, + + left_tag + + >::type logic_left_tag; + + typedef BOOST_DEDUCED_TYPENAME mpl::if_< + ::boost::bimaps::detail::is_unconstrained_set_of< right_set_type >, + + BOOST_DEDUCED_TYPENAME mpl::if_< + ::boost::bimaps::detail::is_unconstrained_set_of< left_set_type >, + + independent_index_tag, + left_tag + + >::type, + + right_tag + + >::type logic_right_tag; + + typedef BOOST_DEDUCED_TYPENAME mpl::if_< + is_same< relation_set_tag, independent_index_tag >, + + BOOST_DEDUCED_TYPENAME mpl::if_< + ::boost::bimaps::detail:: + is_unconstrained_set_of< relation_set_type_of >, + + logic_left_tag, + independent_index_tag + + >::type, + + BOOST_DEDUCED_TYPENAME mpl::if_< + is_same< BOOST_DEDUCED_TYPENAME parameters::set_type_of_relation, left_based >, + + logic_left_tag, + logic_right_tag + + >::type + + >::type logic_relation_set_tag; + + private: + + typedef BOOST_DEDUCED_TYPENAME mpl::if_< + mpl::and_< is_same< relation_set_tag, independent_index_tag >, + mpl::not_< + ::boost::bimaps::detail:: + is_unconstrained_set_of< relation_set_type_of > + > + >, + // { + BOOST_DEDUCED_TYPENAME mpl::push_front + < + basic_core_indices, + + BOOST_DEDUCED_TYPENAME relation_set_type_of:: + BOOST_NESTED_TEMPLATE index_bind + < + ::boost::bimaps::relation::support::both_keys_extractor<relation>, + independent_index_tag + + >::type + + >::type, + // } + // else + // { + basic_core_indices + // } + + >::type complete_core_indices; + + struct core_indices : public complete_core_indices {}; + + // Define the core using compute_index_type to translate the + // set type to an multi-index specification + // -------------------------------------------------------------------- + public: + + typedef multi_index::multi_index_container + < + relation, + core_indices, + BOOST_DEDUCED_TYPENAME boost::allocator_rebind<BOOST_DEDUCED_TYPENAME + parameters::allocator, relation>::type + + > core_type; + + // Core metadata + // -------------------------------------------------------------------- + public: + + typedef BOOST_DEDUCED_TYPENAME ::boost::multi_index:: + index<core_type, logic_left_tag>::type left_index; + + typedef BOOST_DEDUCED_TYPENAME ::boost::multi_index:: + index<core_type,logic_right_tag>::type right_index; + + typedef BOOST_DEDUCED_TYPENAME left_index::iterator left_core_iterator; + typedef BOOST_DEDUCED_TYPENAME left_index::const_iterator left_core_const_iterator; + + typedef BOOST_DEDUCED_TYPENAME right_index::iterator right_core_iterator; + typedef BOOST_DEDUCED_TYPENAME right_index::const_iterator right_core_const_iterator; + + // Relation set view + + typedef BOOST_DEDUCED_TYPENAME ::boost::multi_index::index + < + core_type, logic_relation_set_tag + + >::type relation_set_core_index; + + typedef BOOST_DEDUCED_TYPENAME relation_set_type_of:: + BOOST_NESTED_TEMPLATE set_view_bind + < + relation_set_core_index + + >::type relation_set; + + public: + + typedef bimap_core bimap_core_; +}; + +// Two auxiliary metafunctions to compute the map view types +// The map view type can not be computed inside the bimap core because a +// they need the bimap core to be parsed first. + +template< class BimapBaseType > +struct left_map_view_type +{ + typedef BOOST_DEDUCED_TYPENAME BimapBaseType::left_set_type left_set_type; + typedef BOOST_DEDUCED_TYPENAME + left_set_type::BOOST_NESTED_TEMPLATE map_view_bind< + BOOST_DEDUCED_TYPENAME BimapBaseType::left_tag, BimapBaseType + >::type type; +}; + +template< class BimapBaseType > +struct right_map_view_type +{ + typedef BOOST_DEDUCED_TYPENAME BimapBaseType::right_set_type right_set_type; + typedef BOOST_DEDUCED_TYPENAME + right_set_type::BOOST_NESTED_TEMPLATE map_view_bind< + BOOST_DEDUCED_TYPENAME BimapBaseType::right_tag, BimapBaseType + >::type type; +}; + + +} // namespace detail +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_DETAIL_BIMAP_CORE_HPP diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/detail/concept_tags.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/detail/concept_tags.hpp new file mode 100644 index 0000000000..c5c9fff299 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/detail/concept_tags.hpp @@ -0,0 +1,97 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file detail/concept_tags.hpp +/// \brief Bimap tags and concepts + +#ifndef BOOST_BIMAP_DETAIL_CONCEPT_TAGS_HPP +#define BOOST_BIMAP_DETAIL_CONCEPT_TAGS_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/mpl/identity.hpp> +#include <boost/mpl/placeholders.hpp> +#include <boost/mpl/bool.hpp> + +namespace boost { +namespace bimaps { +namespace detail { + +/// \brief Tag of {SetType}_of definition classes +/** +The {SetType}_of classes are derived from this class so it is easy to construct +metafunctions. For example now is easy to create a is_set_type_of metafunction. + **/ + +struct set_type_of_tag {}; + +/// \brief Tag of {SetType}_of_relation definition classes + +struct set_type_of_relation_tag {}; + +/// \brief Tag of {Side}_based identifiers + +struct side_based_tag : set_type_of_relation_tag {}; + +} // namespace detail + + +/** \struct boost::bimaps::left_based + \brief Tag to indicate that the main view will be based on the left side. + +This is convenient because the multi-index core will be more efficient. +If possible use this options or the right based one. + +See also right_based. + **/ + +/** \struct boost::bimaps::right_based + \brief Tag to indicate that the main view will be based on the right side. + +This is convenient because the multi-index core will be more efficient. +If possible use this options or the right based one. + +See also left_based. + **/ + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +struct left_based : ::boost::bimaps::detail::side_based_tag +{ + // I run into troubles if I do not define bind for side based tags. + // Maybe a more coherent way of binding the relation can be developed. + template< class Relation > struct bind_to { typedef void type; }; + + typedef mpl::bool_<true> left_mutable_key; + typedef mpl::bool_<true> right_mutable_key; +}; + +struct right_based : ::boost::bimaps::detail::side_based_tag +{ + // I run into troubles if I do not define bind for side based tags. + // Maybe a more coherent way of binding the relation can be developed. + template< class Relation > struct bind_to { typedef void type; }; + + typedef mpl::bool_<true> left_mutable_key; + typedef mpl::bool_<true> right_mutable_key; +}; + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +typedef mpl::_ _relation; + +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_DETAIL_CONCEPT_TAGS_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/detail/debug/static_error.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/detail/debug/static_error.hpp new file mode 100644 index 0000000000..4e5cb26371 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/detail/debug/static_error.hpp @@ -0,0 +1,35 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file detail/debug/static_error.hpp +/// \brief Formatted compile time error + +#ifndef BOOST_BIMAP_DETAIL_DEBUG_STATIC_ERROR_HPP +#define BOOST_BIMAP_DETAIL_DEBUG_STATIC_ERROR_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/mpl/assert.hpp> +#include <boost/preprocessor/cat.hpp> + +// Easier way to call BOOST_MPL_ASSERT_MSG in class scope to generate +// a static error. +/*===========================================================================*/ +#define BOOST_BIMAP_STATIC_ERROR(MESSAGE,VARIABLES) \ + BOOST_MPL_ASSERT_MSG(false, \ + BOOST_PP_CAT(BIMAP_STATIC_ERROR__,MESSAGE), \ + VARIABLES) +/*===========================================================================*/ + + + +#endif // BOOST_BIMAP_DETAIL_DEBUG_STATIC_ERROR_HPP diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/detail/generate_index_binder.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/detail/generate_index_binder.hpp new file mode 100644 index 0000000000..8c982cc17d --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/detail/generate_index_binder.hpp @@ -0,0 +1,125 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file detail/generate_index_binder.hpp +/// \brief Define macros to help building the set type of definitions + + +#ifndef BOOST_BIMAP_DETAIL_GENERATE_INDEX_BINDER_HPP +#define BOOST_BIMAP_DETAIL_GENERATE_INDEX_BINDER_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/multi_index/tag.hpp> + + +/*===========================================================================*/ +#define BOOST_BIMAP_GENERATE_INDEX_BINDER_0CP( \ + \ + MULTI_INDEX_TYPE \ + \ +) \ + \ +template< class KeyExtractor, class Tag > \ +struct index_bind \ +{ \ + typedef MULTI_INDEX_TYPE \ + < \ + multi_index::tag< Tag >, \ + KeyExtractor \ + \ + > type; \ +}; +/*===========================================================================*/ + + + +/*===========================================================================*/ +#define BOOST_BIMAP_GENERATE_INDEX_BINDER_1CP( \ + \ + MULTI_INDEX_TYPE, \ + CONFIG_PARAMETER \ + \ +) \ + \ +template< class KeyExtractor, class Tag > \ +struct index_bind \ +{ \ + typedef MULTI_INDEX_TYPE \ + < \ + multi_index::tag< Tag >, \ + KeyExtractor, \ + CONFIG_PARAMETER \ + \ + > type; \ +}; +/*===========================================================================*/ + + + + +/*===========================================================================*/ +#define BOOST_BIMAP_GENERATE_INDEX_BINDER_2CP( \ + \ + MULTI_INDEX_TYPE, \ + CONFIG_PARAMETER_1, \ + CONFIG_PARAMETER_2 \ +) \ + \ +template< class KeyExtractor, class Tag > \ +struct index_bind \ +{ \ + typedef MULTI_INDEX_TYPE \ + < \ + multi_index::tag< Tag >, \ + KeyExtractor, \ + CONFIG_PARAMETER_1, \ + CONFIG_PARAMETER_2 \ + \ + > type; \ + \ +}; +/*===========================================================================*/ + + +// This is a special registration to allow sequenced and random access indices +// to play along smoothly with the other index types. + +/*===========================================================================*/ +#define BOOST_BIMAP_GENERATE_INDEX_BINDER_0CP_NO_EXTRACTOR( \ + \ + MULTI_INDEX_TYPE \ + \ +) \ + \ +template< class KeyExtractor, class Tag > \ +struct index_bind \ +{ \ + typedef MULTI_INDEX_TYPE< multi_index::tag< Tag > > type; \ +}; +/*===========================================================================*/ + + +// This is yet another special registration to allow unconstrained sets +// to play along smoothly with the other index types. + +/*===========================================================================*/ +#define BOOST_BIMAP_GENERATE_INDEX_BINDER_FAKE \ + \ +template< class KeyExtractor, class Tag > \ +struct index_bind \ +{ \ + typedef void type; \ +}; \ +/*===========================================================================*/ + +#endif // BOOST_BIMAP_DETAIL_GENERATE_INDEX_BINDER_HPP diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/detail/generate_relation_binder.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/detail/generate_relation_binder.hpp new file mode 100644 index 0000000000..6d2981633a --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/detail/generate_relation_binder.hpp @@ -0,0 +1,88 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file detail/generate_relation_binder.hpp +/// \brief Define macros to help building the set type of definitions + +#ifndef BOOST_BIMAP_DETAIL_GENERATE_RELATION_BINDER_HPP +#define BOOST_BIMAP_DETAIL_GENERATE_RELATION_BINDER_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/mpl/apply.hpp> + +/*===========================================================================*/ +#define BOOST_BIMAP_GENERATE_RELATION_BINDER_0CP( \ + \ + SET_TYPE_OF \ + ) \ + \ + template< class Relation > \ + struct bind_to \ + { \ + typedef SET_TYPE_OF<Relation> type; \ + \ + }; +/*===========================================================================*/ + + + +/*===========================================================================*/ +#define BOOST_BIMAP_GENERATE_RELATION_BINDER_1CP( \ + \ + SET_TYPE_OF, \ + CP1 \ + ) \ + \ + template< class Relation > \ + struct bind_to \ + { \ + typedef SET_TYPE_OF \ + < \ + Relation, \ + BOOST_DEDUCED_TYPENAME mpl::apply<CP1, \ + BOOST_DEDUCED_TYPENAME Relation::storage_base >::type \ + \ + > type; \ + \ + }; +/*===========================================================================*/ + + + +/*===========================================================================*/ +#define BOOST_BIMAP_GENERATE_RELATION_BINDER_2CP( \ + \ + SET_TYPE_OF, \ + CP1, \ + CP2 \ + ) \ + \ + template< class Relation > \ + struct bind_to \ + { \ + typedef SET_TYPE_OF \ + < \ + Relation, \ + BOOST_DEDUCED_TYPENAME mpl::apply<CP1, \ + BOOST_DEDUCED_TYPENAME Relation::storage_base >::type, \ + BOOST_DEDUCED_TYPENAME mpl::apply<CP2, \ + BOOST_DEDUCED_TYPENAME Relation::storage_base >::type \ + \ + > type; \ + \ + }; +/*===========================================================================*/ + + + +#endif // BOOST_BIMAP_DETAIL_GENERATE_RELATION_BINDER_HPP diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/detail/generate_view_binder.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/detail/generate_view_binder.hpp new file mode 100644 index 0000000000..bd1c43f8c0 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/detail/generate_view_binder.hpp @@ -0,0 +1,58 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file detail/generate_view_binder.hpp +/// \brief Define macros to help building the set type of definitions + +#ifndef BOOST_BIMAP_DETAIL_GENERATE_VIEW_BINDER_HPP +#define BOOST_BIMAP_DETAIL_GENERATE_VIEW_BINDER_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/multi_index/tag.hpp> + +/*===========================================================================*/ +#define BOOST_BIMAP_GENERATE_MAP_VIEW_BINDER( \ + \ + MAP_VIEW_TYPE \ + \ +) \ + \ +template< class Tag, class BimapType > \ +struct map_view_bind \ +{ \ + typedef MAP_VIEW_TYPE \ + < \ + Tag, \ + BimapType \ + \ + > type; \ +}; +/*===========================================================================*/ + + +/*===========================================================================*/ +#define BOOST_BIMAP_GENERATE_SET_VIEW_BINDER( \ + \ + SET_VIEW_TYPE \ + \ +) \ + \ +template< class IndexType > \ +struct set_view_bind \ +{ \ + typedef SET_VIEW_TYPE<IndexType> type; \ +}; +/*===========================================================================*/ + + +#endif // BOOST_BIMAP_DETAIL_GENERATE_VIEW_BINDER_HPP diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/detail/is_set_type_of.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/detail/is_set_type_of.hpp new file mode 100644 index 0000000000..58dad370d1 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/detail/is_set_type_of.hpp @@ -0,0 +1,66 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file detail/is_set_type_of.hpp +/// \brief Is set type of and is set type of relation metafunctions. + +#ifndef BOOST_BIMAP_DETAIL_IS_SET_TYPE_OF_HPP +#define BOOST_BIMAP_DETAIL_IS_SET_TYPE_OF_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/type_traits/is_base_of.hpp> +#include <boost/bimap/detail/concept_tags.hpp> + +/** \struct boost::bimaps::detail::is_set_type_of + +\brief Type trait to check if a class is a set_type_of specification + +\code +template< class Type > +struct is_set_type_of : {true_|false_} {}; +\endcode + **/ + +/** \struct boost::bimaps::detail::is_set_type_of_relation + +\brief Type trait to check if a class is a set_type_of_relation specification + +\code +template< class Type > +struct is_set_type_of_relation : {true_|false_} {}; +\endcode + + **/ + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +namespace boost { +namespace bimaps { +namespace detail { + +template< class Type > +struct is_set_type_of : + is_base_of< set_type_of_tag, Type > {}; + +template< class Type > +struct is_set_type_of_relation : + is_base_of< set_type_of_relation_tag, Type > {}; + +} // namespace detail +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +#endif // BOOST_BIMAP_DETAIL_IS_SET_TYPE_OF_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/detail/manage_additional_parameters.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/detail/manage_additional_parameters.hpp new file mode 100644 index 0000000000..78d89aeaf8 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/detail/manage_additional_parameters.hpp @@ -0,0 +1,243 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file detail/manage_additional_parameters.hpp +/// \brief Utility class to extract the additional parameters from the template parameters. + +#ifndef BOOST_BIMAP_DETAIL_MANAGE_ADDITIONAL_PARAMETERS_HPP +#define BOOST_BIMAP_DETAIL_MANAGE_ADDITIONAL_PARAMETERS_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <memory> + +// Boost.MPL +#include <boost/mpl/bool.hpp> +#include <boost/mpl/if.hpp> +#include <boost/mpl/aux_/na.hpp> +#include <boost/type_traits/is_same.hpp> + +#include <boost/bimap/detail/is_set_type_of.hpp> + +namespace boost { +namespace bimaps { + +template< class Type > +struct with_info +{ + typedef Type value_type; +}; + +namespace detail { + +/// \brief Metafunction to check if a given type is a data_hook specification. + +template< class Type > +struct is_with_info : ::boost::mpl::false_ {}; + +template< class ValueType > +struct is_with_info< with_info<ValueType> > : ::boost::mpl::true_ {}; + +/** \struct boost::bimaps::detail::manage_additional_parameters +\brief Utility class to extract the additional parameters from the template parameters. + +\code +template< class AP1, class AP2, class AP3 > +struct manage_additional_parameters +{ + struct parameters + { + typedef -unspecified- set_type_of_relation; + typedef -unspecified- data_hook; + typedef -unspecified- allocator; + }; + + typedef parameters type; +}; +\endcode + +See also bimap, bimap_core. + **/ + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +template< class AP1, class AP2, class AP3 > +struct manage_additional_parameters +{ + // (1) manage_additional_parameters< + // not_specified,not_specified,not_specified> + // + // set_type_of_relation: based on the left key type + // info_hook: no additional info + // allocator: default allocator + + struct case_NNN + { + typedef left_based set_type_of_relation; + typedef std::allocator<char> allocator; + typedef ::boost::mpl::na additional_info; + }; + + // (2) manage_additional_parameters<Allocator,not_specified,not_specified> + // + // set_type_of_relation: based on the left key type + // info_hook: no additional info + // allocator: Allocator + + struct case_ANN + { + typedef left_based set_type_of_relation; + typedef AP1 allocator; + typedef ::boost::mpl::na additional_info; + }; + + // (3) manage_additional_parameters< + // SetOfRelationType,not_specified,not_specified> + // + // set_type_of_relation: SetTypeOfRelation + // info_hook: no additional info + // allocator: default allocator + + struct case_SNN + { + typedef AP1 set_type_of_relation; + typedef std::allocator<char> allocator; + typedef ::boost::mpl::na additional_info; + }; + + // (4) manage_additional_parameters< + // SetTypeOfRelation,Allocator,not_specified> + // + // set_type_of_relation: SetTypeOfRelation + // info_hook: no additional info + // allocator: Allocator + + struct case_SAN + { + typedef AP1 set_type_of_relation; + typedef AP2 allocator; + typedef ::boost::mpl::na additional_info; + }; + + // (5) manage_additional_parameters<InfoToHook,not_specified,not_specified> + // + // set_type_of_relation: based on the left key type + // info_hook: InfoToHook + // allocator: default allocator + + struct case_HNN + { + typedef left_based set_type_of_relation; + typedef std::allocator<char> allocator; + typedef BOOST_DEDUCED_TYPENAME AP1::value_type additional_info; + }; + + // (6) manage_additional_parameters< + // SetTypeOfRelation,InfoToHook,not_specified> + // + // set_type_of_relation: SetTypeOfRelation + // info_hook: InfoToHook + // allocator: default allocator + + struct case_SHN + { + typedef AP1 set_type_of_relation; + typedef std::allocator<char> allocator; + typedef BOOST_DEDUCED_TYPENAME AP2::value_type additional_info; + }; + + // (7) manage_additional_parameters< + // DataToHook,Allocator,not_specified> + // + // set_type_of_relation: SetTypeOfRelation + // info_hook: InfoToHook + // allocator: default allocator + + struct case_HAN + { + typedef left_based set_type_of_relation; + typedef AP2 allocator; + typedef BOOST_DEDUCED_TYPENAME AP1::value_type additional_info; + }; + + // (8) manage_additional_parameters< + // SetTypeOfRelation,DataToHook,Allocator> + // + // set_type_of_relation: SetTypeOfRelation + // info_hook: InfoToHook + // allocator: Allocator + + struct case_SHA + { + typedef AP1 set_type_of_relation; + typedef AP2 allocator; + typedef BOOST_DEDUCED_TYPENAME AP2::value_type additional_info; + }; + + // Some annidated mpl::if_ and we are done! + + typedef BOOST_DEDUCED_TYPENAME mpl::if_ + < + ::boost::mpl::is_na<AP1>, + case_NNN, // (1) + BOOST_DEDUCED_TYPENAME mpl::if_ + < + ::boost::mpl::is_na<AP2>, + BOOST_DEDUCED_TYPENAME mpl::if_ + < + is_set_type_of_relation<AP1>, + case_SNN, // (3) + BOOST_DEDUCED_TYPENAME mpl::if_ + < + is_with_info<AP1>, + case_HNN, // (5) + case_ANN // (2) + + >::type + + >::type, + BOOST_DEDUCED_TYPENAME mpl::if_ + < + ::boost::mpl::is_na<AP3>, + BOOST_DEDUCED_TYPENAME mpl::if_ + < + is_with_info<AP1>, + case_HAN, // (7) + BOOST_DEDUCED_TYPENAME mpl::if_ + < + is_with_info<AP2>, + case_SHN, // (6) + case_SAN // (4) + + >::type + + >::type, + + case_SHA // (8) + + >::type + + >::type + + >::type type; + +}; + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +} // namespace detail +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_DETAIL_MANAGE_ADDITIONAL_PARAMETERS_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/detail/manage_bimap_key.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/detail/manage_bimap_key.hpp new file mode 100644 index 0000000000..987bb0d4ac --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/detail/manage_bimap_key.hpp @@ -0,0 +1,84 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file detail/manage_bimap_key.hpp +/// \brief Utility class to manage the set types of a bimap. + +#ifndef BOOST_BIMAP_DETAIL_MANAGE_BIMAP_KEY_HPP +#define BOOST_BIMAP_DETAIL_MANAGE_BIMAP_KEY_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/mpl/eval_if.hpp> +#include <boost/mpl/identity.hpp> + +#include <boost/bimap/detail/is_set_type_of.hpp> + +#include <boost/bimap/set_of.hpp> + +namespace boost { +namespace bimaps { +namespace detail { + +/** \struct boost::bimaps::detail::manage_bimap_key +\brief Metafunction to manage the set types of a bimap. + +\code +template< class Type > +struct manage_bimap_key +{ + typedef -SetType- type; +} +\endcode + +See also bimap, bimap_core. + **/ + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +template< class Type > +struct manage_bimap_key +{ + +typedef BOOST_DEDUCED_TYPENAME + + mpl::eval_if< BOOST_DEDUCED_TYPENAME is_set_type_of< Type >::type, + // { + mpl::identity< Type >, + // } + // else + // { + // Default it to a set + mpl::identity< set_of< Type > > + // } + + >::type set_type; + + // Returns set_type and evaluate the concept_checked_type + + typedef BOOST_DEDUCED_TYPENAME mpl::if_c< true, set_type, + BOOST_DEDUCED_TYPENAME set_type::lazy_concept_checked::type + >::type type; +}; + + + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +} // namespace detail +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_DETAIL_MANAGE_BIMAP_KEY_HPP + + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/detail/map_view_base.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/detail/map_view_base.hpp new file mode 100644 index 0000000000..8f61d5cc04 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/detail/map_view_base.hpp @@ -0,0 +1,544 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file detail/map_view_base.hpp +/// \brief Helper base for the construction of the bimap views types. + +#ifndef BOOST_BIMAP_DETAIL_MAP_VIEW_BASE_HPP +#define BOOST_BIMAP_DETAIL_MAP_VIEW_BASE_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <stdexcept> +#include <utility> + +#include <boost/throw_exception.hpp> +#include <boost/type_traits/is_const.hpp> +#include <boost/mpl/if.hpp> + +#include <boost/bimap/relation/support/get_pair_functor.hpp> +#include <boost/bimap/relation/detail/to_mutable_relation_functor.hpp> +#include <boost/bimap/container_adaptor/support/iterator_facade_converters.hpp> +#include <boost/bimap/relation/support/data_extractor.hpp> +#include <boost/bimap/relation/support/opposite_tag.hpp> +#include <boost/bimap/relation/support/pair_type_by.hpp> +//#include <boost/bimap/support/iterator_type_by.hpp> +#include <boost/bimap/support/key_type_by.hpp> +#include <boost/bimap/support/data_type_by.hpp> +#include <boost/bimap/support/value_type_by.hpp> +#include <boost/bimap/detail/modifier_adaptor.hpp> +#include <boost/bimap/detail/debug/static_error.hpp> +#include <boost/bimap/detail/map_view_iterator.hpp> + +namespace boost { +namespace bimaps { + +namespace detail { + + +// The next macro can be converted in a metafunctor to gain code robustness. +/*===========================================================================*/ +#define BOOST_BIMAP_MAP_VIEW_CONTAINER_ADAPTOR( \ + CONTAINER_ADAPTOR, TAG, BIMAP, OTHER_ITER, CONST_OTHER_ITER \ +) \ +::boost::bimaps::container_adaptor::CONTAINER_ADAPTOR \ +< \ + BOOST_DEDUCED_TYPENAME BIMAP::core_type:: \ + BOOST_NESTED_TEMPLATE index<TAG>::type, \ + ::boost::bimaps::detail:: map_view_iterator<TAG,BIMAP>, \ + ::boost::bimaps::detail::const_map_view_iterator<TAG,BIMAP>, \ + ::boost::bimaps::detail:: OTHER_ITER<TAG,BIMAP>, \ + ::boost::bimaps::detail::CONST_OTHER_ITER<TAG,BIMAP>, \ + ::boost::bimaps::container_adaptor::support::iterator_facade_to_base \ + < \ + ::boost::bimaps::detail:: map_view_iterator<TAG,BIMAP>, \ + ::boost::bimaps::detail::const_map_view_iterator<TAG,BIMAP> \ + >, \ + ::boost::mpl::na, \ + ::boost::mpl::na, \ + ::boost::bimaps::relation::detail:: \ + pair_to_relation_functor<TAG,BOOST_DEDUCED_TYPENAME BIMAP::relation>, \ + ::boost::bimaps::relation::support:: \ + get_pair_functor<TAG, BOOST_DEDUCED_TYPENAME BIMAP::relation > \ +> +/*===========================================================================*/ + + +#if defined(BOOST_MSVC) +/*===========================================================================*/ +#define BOOST_BIMAP_MAP_VIEW_BASE_FRIEND(TYPE,TAG,BIMAP) \ + typedef ::boost::bimaps::detail::map_view_base< \ + TYPE<TAG,BIMAP>,TAG,BIMAP > friend_map_view_base; \ + friend class friend_map_view_base; +/*===========================================================================*/ +#else +/*===========================================================================*/ +#define BOOST_BIMAP_MAP_VIEW_BASE_FRIEND(TYPE,TAG,BIMAP) \ + friend class ::boost::bimaps::detail::map_view_base< \ + TYPE<TAG,BIMAP>,TAG,BIMAP >; +/*===========================================================================*/ +#endif + + +/// \brief Common base for map views. + +template< class Derived, class Tag, class BimapType> +class map_view_base +{ + typedef ::boost::bimaps::container_adaptor::support:: + iterator_facade_to_base< + ::boost::bimaps::detail:: map_view_iterator<Tag,BimapType>, + ::boost::bimaps::detail::const_map_view_iterator<Tag,BimapType> + > iterator_to_base_; + + typedef ::boost::bimaps::relation::detail:: + pair_to_relation_functor<Tag, + BOOST_DEDUCED_TYPENAME BimapType::relation> value_to_base_; + + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::support:: + key_type_by<Tag,BimapType>::type key_type_; + + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::support:: + data_type_by<Tag,BimapType>::type data_type_; + + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support:: + pair_type_by<Tag, + BOOST_DEDUCED_TYPENAME BimapType::relation>::type value_type_; + + typedef + ::boost::bimaps::detail::map_view_iterator<Tag,BimapType> iterator_; + + public: + + bool replace(iterator_ position, const value_type_ & x) + { + return derived().base().replace( + derived().template functor<iterator_to_base_>()(position), + derived().template functor<value_to_base_>()(x) + ); + } + + template< class CompatibleKey > + bool replace_key(iterator_ position, const CompatibleKey & k) + { + return derived().base().replace( + derived().template functor<iterator_to_base_>()(position), + derived().template functor<value_to_base_>()( + ::boost::bimaps::relation::detail:: + copy_with_first_replaced(*position,k) + ) + ); + } + + template< class CompatibleData > + bool replace_data(iterator_ position, const CompatibleData & d) + { + return derived().base().replace( + derived().template functor<iterator_to_base_>()(position), + derived().template functor<value_to_base_>()( + ::boost::bimaps::relation::detail:: + copy_with_second_replaced(*position,d) + ) + ); + } + + /* This function may be provided in the future + + template< class Modifier > + bool modify(iterator_ position, Modifier mod) + { + return derived().base().modify( + + derived().template functor<iterator_to_base_>()(position), + + ::boost::bimaps::detail::relation_modifier_adaptor + < + Modifier, + BOOST_DEDUCED_TYPENAME BimapType::relation, + BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support:: + data_extractor + < + Tag, BOOST_DEDUCED_TYPENAME BimapType::relation + + >::type, + BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support:: + data_extractor + < + BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support:: + opossite_tag<Tag,BimapType>::type, + BOOST_DEDUCED_TYPENAME BimapType::relation + + >::type + + >(mod) + ); + } + */ + + template< class Modifier > + bool modify_key(iterator_ position, Modifier mod) + { + return derived().base().modify_key( + derived().template functor<iterator_to_base_>()(position), mod + ); + } + + template< class Modifier > + bool modify_data(iterator_ position, Modifier mod) + { + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support:: + data_extractor + < + BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support:: + opossite_tag<Tag,BimapType>::type, + BOOST_DEDUCED_TYPENAME BimapType::relation + + >::type data_extractor_; + + return derived().base().modify( + + derived().template functor<iterator_to_base_>()(position), + + // this may be replaced later by + // ::boost::bind( mod, ::boost::bind(data_extractor_(),_1) ) + + ::boost::bimaps::detail::unary_modifier_adaptor + < + Modifier, + BOOST_DEDUCED_TYPENAME BimapType::relation, + data_extractor_ + + >(mod) + ); + } + + protected: + + typedef map_view_base map_view_base_; + + private: + + // Curiously Recurring Template interface. + + Derived& derived() + { + return *static_cast<Derived*>(this); + } + + Derived const& derived() const + { + return *static_cast<Derived const*>(this); + } +}; + + + + +template< class Derived, class Tag, class BimapType> +class mutable_data_unique_map_view_access +{ + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::support:: + data_type_by<Tag,BimapType>::type data_type_; + + public: + + template< class CompatibleKey > + data_type_ & at(const CompatibleKey& k) + { + typedef ::boost::bimaps::detail:: + map_view_iterator<Tag,BimapType> iterator; + + iterator iter = derived().find(k); + if( iter == derived().end() ) + { + ::boost::throw_exception( + std::out_of_range("bimap<>: invalid key") + ); + } + return iter->second; + } + + template< class CompatibleKey > + const data_type_ & at(const CompatibleKey& k) const + { + typedef ::boost::bimaps::detail:: + const_map_view_iterator<Tag,BimapType> const_iterator; + + const_iterator iter = derived().find(k); + if( iter == derived().end() ) + { + ::boost::throw_exception( + std::out_of_range("bimap<>: invalid key") + ); + } + return iter->second; + } + + template< class CompatibleKey > + data_type_ & operator[](const CompatibleKey& k) + { + typedef ::boost::bimaps::detail:: + map_view_iterator<Tag,BimapType> iterator; + + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::support:: + value_type_by<Tag,BimapType>::type value_type; + + iterator iter = derived().find(k); + if( iter == derived().end() ) + { + iter = derived().insert( value_type(k,data_type_()) ).first; + } + return iter->second; + } + + protected: + + typedef mutable_data_unique_map_view_access + mutable_data_unique_map_view_access_; + + private: + + // Curiously Recurring Template interface. + + Derived& derived() + { + return *static_cast<Derived*>(this); + } + + Derived const& derived() const + { + return *static_cast<Derived const*>(this); + } +}; + + +template< class Derived, class Tag, class BimapType> +class non_mutable_data_unique_map_view_access +{ + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::support:: + data_type_by<Tag,BimapType>::type data_type_; + + public: + + template< class CompatibleKey > + const data_type_ & at(const CompatibleKey& k) const + { + typedef ::boost::bimaps::detail:: + const_map_view_iterator<Tag,BimapType> const_iterator; + + const_iterator iter = derived().find(k); + if( iter == derived().end() ) + { + ::boost::throw_exception( + std::out_of_range("bimap<>: invalid key") + ); + } + return iter->second; + } + + template< class CompatibleKey > + data_type_ & operator[](const CompatibleKey&) + { + BOOST_BIMAP_STATIC_ERROR( OPERATOR_BRACKET_IS_NOT_SUPPORTED, (Derived)); + } + + protected: + + typedef non_mutable_data_unique_map_view_access + non_mutable_data_unique_map_view_access_; + + private: + + // Curiously Recurring Template interface. + + Derived& derived() + { + return *static_cast<Derived*>(this); + } + + Derived const& derived() const + { + return *static_cast<Derived const*>(this); + } +}; + + +template< class Derived, class Tag, class BimapType> +struct unique_map_view_access +{ + private: + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::support:: + value_type_by<Tag,BimapType>::type value_type; + + public: + typedef BOOST_DEDUCED_TYPENAME ::boost::mpl::if_ + < + typename ::boost::is_const< + BOOST_DEDUCED_TYPENAME value_type::second_type >::type, + + non_mutable_data_unique_map_view_access<Derived,Tag,BimapType>, + mutable_data_unique_map_view_access<Derived,Tag,BimapType> + + >::type type; +}; + +// Map views specialize the following structs to provide to the bimap class +// the extra side typedefs (i.e. left_local_iterator for unordered_maps, +// right_range_type for maps) + +template< class MapView > +struct left_map_view_extra_typedefs {}; + +template< class MapView > +struct right_map_view_extra_typedefs {}; + +} // namespace detail + +// This function is already part of Boost.Lambda. +// They may be moved to Boost.Utility. + +template <class T> inline const T& make_const(const T& t) { return t; } + +} // namespace bimaps +} // namespace boost + + +// The following macros avoids code duplication in map views +// Maybe this can be changed in the future using a scheme similar to +// the one used with map_view_base. + +/*===========================================================================*/ +#define BOOST_BIMAP_MAP_VIEW_RANGE_IMPLEMENTATION(BASE) \ + \ +typedef std::pair< \ + BOOST_DEDUCED_TYPENAME base_::iterator, \ + BOOST_DEDUCED_TYPENAME base_::iterator> range_type; \ + \ +typedef std::pair< \ + BOOST_DEDUCED_TYPENAME base_::const_iterator, \ + BOOST_DEDUCED_TYPENAME base_::const_iterator> const_range_type; \ + \ + \ +template< class LowerBounder, class UpperBounder> \ +range_type range(LowerBounder lower,UpperBounder upper) \ +{ \ + std::pair< \ + \ + BOOST_DEDUCED_TYPENAME BASE::base_type::iterator, \ + BOOST_DEDUCED_TYPENAME BASE::base_type::iterator \ + \ + > r( this->base().range(lower,upper) ); \ + \ + return range_type( \ + this->template functor< \ + BOOST_DEDUCED_TYPENAME BASE::iterator_from_base \ + >() ( r.first ), \ + this->template functor< \ + BOOST_DEDUCED_TYPENAME BASE::iterator_from_base \ + >() ( r.second ) \ + ); \ +} \ + \ +template< class LowerBounder, class UpperBounder> \ +const_range_type range(LowerBounder lower,UpperBounder upper) const \ +{ \ + std::pair< \ + \ + BOOST_DEDUCED_TYPENAME BASE::base_type::const_iterator, \ + BOOST_DEDUCED_TYPENAME BASE::base_type::const_iterator \ + \ + > r( this->base().range(lower,upper) ); \ + \ + return const_range_type( \ + this->template functor< \ + BOOST_DEDUCED_TYPENAME BASE::iterator_from_base \ + >() ( r.first ), \ + this->template functor< \ + BOOST_DEDUCED_TYPENAME BASE::iterator_from_base \ + >() ( r.second ) \ + ); \ +} +/*===========================================================================*/ + + +/*===========================================================================*/ +#define BOOST_BIMAP_VIEW_ASSIGN_IMPLEMENTATION(BASE) \ + \ +template< class InputIterator > \ +void assign(InputIterator first,InputIterator last) \ +{ \ + this->clear(); \ + this->insert(this->end(),first,last); \ +} \ + \ +void assign(BOOST_DEDUCED_TYPENAME BASE::size_type n, \ + const BOOST_DEDUCED_TYPENAME BASE::value_type& v) \ +{ \ + this->clear(); \ + for(BOOST_DEDUCED_TYPENAME BASE::size_type i = 0 ; i < n ; ++i) \ + { \ + this->push_back(v); \ + } \ +} +/*===========================================================================*/ + + +/*===========================================================================*/ +#define BOOST_BIMAP_VIEW_FRONT_BACK_IMPLEMENTATION(BASE) \ + \ +BOOST_DEDUCED_TYPENAME BASE::reference front() \ +{ \ + return this->template functor< \ + BOOST_DEDUCED_TYPENAME base_::value_from_base>() \ + ( \ + const_cast \ + < \ + BOOST_DEDUCED_TYPENAME BASE::base_type::value_type & \ + \ + > ( this->base().front() ) \ + ); \ +} \ + \ +BOOST_DEDUCED_TYPENAME BASE::reference back() \ +{ \ + return this->template functor< \ + BOOST_DEDUCED_TYPENAME base_::value_from_base>() \ + ( \ + const_cast \ + < \ + BOOST_DEDUCED_TYPENAME BASE::base_type::value_type & \ + \ + >( this->base().back() ) \ + ); \ +} \ + \ +BOOST_DEDUCED_TYPENAME BASE::const_reference front() const \ +{ \ + return this->template functor< \ + BOOST_DEDUCED_TYPENAME BASE::value_from_base>() \ + ( \ + this->base().front() \ + ); \ +} \ + \ +BOOST_DEDUCED_TYPENAME BASE::const_reference back() const \ +{ \ + return this->template functor< \ + BOOST_DEDUCED_TYPENAME BASE::value_from_base>() \ + ( \ + this->base().back() \ + ); \ +} +/*===========================================================================*/ + + +#endif // BOOST_BIMAP_DETAIL_MAP_VIEW_BASE_HPP diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/detail/map_view_iterator.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/detail/map_view_iterator.hpp new file mode 100644 index 0000000000..0fc3f6eab6 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/detail/map_view_iterator.hpp @@ -0,0 +1,334 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file detail/map_view_iterator.hpp +/// \brief Iterator adaptors from multi-index to bimap. + +#ifndef BOOST_BIMAP_DETAIL_MAP_VIEW_ITERATOR_HPP +#define BOOST_BIMAP_DETAIL_MAP_VIEW_ITERATOR_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +// Boost + +#ifndef BOOST_BIMAP_DISABLE_SERIALIZATION + #include <boost/core/serialization.hpp> +#endif // BOOST_BIMAP_DISABLE_SERIALIZATION + +#include <boost/iterator/detail/enable_if.hpp> +#include <boost/iterator/iterator_adaptor.hpp> +#include <boost/bimap/relation/support/pair_by.hpp> + +// check +#include <boost/bimap/relation/detail/metadata_access_builder.hpp> +#include <boost/bimap/relation/detail/static_access_builder.hpp> + +namespace boost { +namespace bimaps { +namespace detail { + +/** \brief Map View Iterator adaptors from multi index to bimap. + +These classes are based on transform iterators from Boost.Iterator. + **/ + +template< class Tag, class BimapCore > struct map_view_iterator ; +template< class Tag, class BimapCore > struct const_map_view_iterator ; + +template< class Tag, class BimapCore > struct reverse_map_view_iterator ; +template< class Tag, class BimapCore > struct const_reverse_map_view_iterator ; + +template< class Tag, class BimapCore > struct local_map_view_iterator ; +template< class Tag, class BimapCore > struct const_local_map_view_iterator ; + + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +#ifndef BOOST_BIMAP_DISABLE_SERIALIZATION +/*===========================================================================*/ +#define BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT \ + \ + template< class Archive > \ + void serialize(Archive & ar, const unsigned int v) \ + { \ + ::boost::core::split_member( ar, *this, v ); \ + } \ + \ + friend class ::boost::serialization::access; \ + \ + template< class Archive > \ + void save(Archive & ar, const unsigned int) const \ + { \ + ar << ::boost::serialization::make_nvp("mi_iterator",this->base()); \ + } \ + \ + template< class Archive > \ + void load(Archive & ar, const unsigned int) \ + { \ + BOOST_DEDUCED_TYPENAME base_::base_type iter; \ + ar >> ::boost::serialization::make_nvp("mi_iterator",iter); \ + this->base_reference() = iter; \ + } +/*===========================================================================*/ +#else +#define BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT // None +#endif // BOOST_BIMAP_DISABLE_SERIALIZATION + +/*===========================================================================*/ +#define BOOST_BIMAP_CORE_ITERATOR_TYPE_BY_BUILDER( METANAME, ITERATOR ) \ +BOOST_BIMAP_SYMMETRIC_STATIC_ACCESS_BUILDER( METANAME, BimapCore, \ + typedef BOOST_DEDUCED_TYPENAME BimapCore::core_type::BOOST_NESTED_TEMPLATE\ + index<BOOST_DEDUCED_TYPENAME BimapCore::left_tag> \ + ::type::ITERATOR type, \ + typedef BOOST_DEDUCED_TYPENAME BimapCore::core_type::BOOST_NESTED_TEMPLATE\ + index<BOOST_DEDUCED_TYPENAME BimapCore::right_tag> \ + ::type::ITERATOR type \ +) +/*===========================================================================*/ + + +BOOST_BIMAP_CORE_ITERATOR_TYPE_BY_BUILDER( core_iterator_type_by + , iterator ) + +BOOST_BIMAP_CORE_ITERATOR_TYPE_BY_BUILDER( reverse_core_iterator_type_by + , reverse_iterator ) + +BOOST_BIMAP_CORE_ITERATOR_TYPE_BY_BUILDER( local_core_iterator_type_by + , local_iterator ) + + +// map_view_iterator + +template< class Tag, class BimapCore > +struct map_view_iterator_adaptor { + typedef iterator_adaptor< + map_view_iterator<Tag,BimapCore>, + BOOST_DEDUCED_TYPENAME core_iterator_type_by<Tag,BimapCore>::type, + BOOST_DEDUCED_TYPENAME + ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type + > type; +}; +template< class Tag, class BimapCore > +struct map_view_iterator : + public map_view_iterator_adaptor<Tag,BimapCore>::type +{ + typedef BOOST_DEDUCED_TYPENAME + map_view_iterator_adaptor<Tag,BimapCore>::type base_; + public: + + map_view_iterator() {} + map_view_iterator(BOOST_DEDUCED_TYPENAME base_::base_type const& iter) + : base_(iter) {} + + BOOST_DEDUCED_TYPENAME base_::reference dereference() const + { + return ::boost::bimaps::relation::support::pair_by<Tag>( + *const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type*>( + &(*this->base()) + ) + ); + } + private: + friend class boost::iterators::iterator_core_access; + BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT +}; + + +template< class Tag, class BimapCore > +struct const_map_view_iterator_adaptor { + typedef iterator_adaptor< + const_map_view_iterator<Tag,BimapCore>, + BOOST_DEDUCED_TYPENAME core_iterator_type_by<Tag,BimapCore>::type, + const BOOST_DEDUCED_TYPENAME + ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type + > type; +}; +template< class Tag, class BimapCore > +struct const_map_view_iterator : + public const_map_view_iterator_adaptor<Tag,BimapCore>::type +{ + typedef BOOST_DEDUCED_TYPENAME + const_map_view_iterator_adaptor<Tag,BimapCore>::type base_; + public: + + const_map_view_iterator() {} + const_map_view_iterator( + BOOST_DEDUCED_TYPENAME base_::base_type const& iter) + : base_(iter) {} + const_map_view_iterator(map_view_iterator<Tag,BimapCore> i) + : base_(i.base()) {} + + BOOST_DEDUCED_TYPENAME base_::reference dereference() const + { + return ::boost::bimaps::relation::support::pair_by<Tag>(*this->base()); + } + private: + friend class boost::iterators::iterator_core_access; + BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT +}; + + +// reverse_map_view_iterator + +template< class Tag, class BimapCore > +struct reverse_map_view_iterator_adaptor { + typedef iterator_adaptor< + reverse_map_view_iterator<Tag,BimapCore>, + BOOST_DEDUCED_TYPENAME + reverse_core_iterator_type_by<Tag,BimapCore>::type, + BOOST_DEDUCED_TYPENAME + ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type + > type; +}; +template< class Tag, class BimapCore > +struct reverse_map_view_iterator : + public reverse_map_view_iterator_adaptor<Tag,BimapCore>::type +{ + typedef BOOST_DEDUCED_TYPENAME + reverse_map_view_iterator_adaptor<Tag,BimapCore>::type base_; + public: + + reverse_map_view_iterator() {} + reverse_map_view_iterator( + BOOST_DEDUCED_TYPENAME base_::base_type const& iter) + : base_(iter) {} + + BOOST_DEDUCED_TYPENAME base_::reference dereference() const + { + return ::boost::bimaps::relation::support::pair_by<Tag>( + *const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type*>( + &(*this->base()) + ) + ); + } + private: + friend class boost::iterators::iterator_core_access; + BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT +}; + +template< class Tag, class BimapCore > +struct const_reverse_map_view_iterator_adaptor { + typedef iterator_adaptor< + const_reverse_map_view_iterator<Tag,BimapCore>, + BOOST_DEDUCED_TYPENAME + reverse_core_iterator_type_by<Tag,BimapCore>::type, + const BOOST_DEDUCED_TYPENAME + ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type + > type; +}; +template< class Tag, class BimapCore > +struct const_reverse_map_view_iterator : + public const_reverse_map_view_iterator_adaptor<Tag,BimapCore>::type +{ + typedef BOOST_DEDUCED_TYPENAME + const_reverse_map_view_iterator_adaptor<Tag,BimapCore>::type base_; + + public: + + const_reverse_map_view_iterator() {} + const_reverse_map_view_iterator( + BOOST_DEDUCED_TYPENAME base_::base_type const& iter) + : base_(iter) {} + const_reverse_map_view_iterator(reverse_map_view_iterator<Tag,BimapCore> i) + : base_(i.base()) {} + + BOOST_DEDUCED_TYPENAME base_::reference dereference() const + { + return ::boost::bimaps::relation::support::pair_by<Tag>(*this->base()); + } + private: + friend class boost::iterators::iterator_core_access; + BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT +}; + + +// local_map_view_iterator + +template< class Tag, class BimapCore > +struct local_map_view_iterator_adaptor { + typedef iterator_adaptor< + local_map_view_iterator<Tag,BimapCore>, + BOOST_DEDUCED_TYPENAME + local_core_iterator_type_by<Tag,BimapCore>::type, + BOOST_DEDUCED_TYPENAME + ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type + > type; +}; +template< class Tag, class BimapCore > +struct local_map_view_iterator : + public local_map_view_iterator_adaptor<Tag,BimapCore>::type +{ + typedef BOOST_DEDUCED_TYPENAME + local_map_view_iterator_adaptor<Tag,BimapCore>::type base_; + public: + + local_map_view_iterator() {} + local_map_view_iterator( + BOOST_DEDUCED_TYPENAME base_::base_type const& iter) + : base_(iter) {} + + BOOST_DEDUCED_TYPENAME base_::reference dereference() const + { + return ::boost::bimaps::relation::support::pair_by<Tag>( + *const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type*>( + &(*this->base()) + ) + ); + } + private: + friend class boost::iterators::iterator_core_access; + BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT +}; + +template< class Tag, class BimapCore > +struct const_local_map_view_iterator_adaptor { + typedef iterator_adaptor< + const_local_map_view_iterator<Tag,BimapCore>, + BOOST_DEDUCED_TYPENAME + local_core_iterator_type_by<Tag,BimapCore>::type, + const BOOST_DEDUCED_TYPENAME + ::boost::bimaps::support::value_type_by<Tag,BimapCore>::type + > type; +}; +template< class Tag, class BimapCore > +struct const_local_map_view_iterator : + public const_local_map_view_iterator_adaptor<Tag,BimapCore>::type +{ + typedef BOOST_DEDUCED_TYPENAME + const_local_map_view_iterator_adaptor<Tag,BimapCore>::type base_; + public: + + const_local_map_view_iterator() {} + const_local_map_view_iterator( + BOOST_DEDUCED_TYPENAME base_::base_type const& iter) + : base_(iter) {} + const_local_map_view_iterator(local_map_view_iterator<Tag,BimapCore> i) + : base_(i.base()) {} + + BOOST_DEDUCED_TYPENAME base_::reference dereference() const + { + return ::boost::bimaps::relation::support::pair_by<Tag>(*this->base()); + } + private: + friend class boost::iterators::iterator_core_access; + BOOST_BIMAP_MAP_VIEW_ITERATOR_SERIALIZATION_SUPPORT +}; + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +} // namespace detail +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_DETAIL_MAP_VIEW_ITERATOR_HPP + + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/detail/modifier_adaptor.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/detail/modifier_adaptor.hpp new file mode 100644 index 0000000000..c1ee3670ce --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/detail/modifier_adaptor.hpp @@ -0,0 +1,91 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file detail/modifier_adaptor.hpp +/// \brief A binary to unary functor relation modifier adaptor. + +#ifndef BOOST_BIMAP_DETAIL_MODIFIER_ADAPTOR_HPP +#define BOOST_BIMAP_DETAIL_MODIFIER_ADAPTOR_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +namespace boost { +namespace bimaps { +namespace detail { + +/// \brief A binary to unary functor relation modifier adaptor. + +template +< + class Modifier, + class NewArgument, + class FirstExtractor, + class SecondExtractor +> +struct relation_modifier_adaptor : + Modifier, + FirstExtractor, + SecondExtractor +{ + typedef NewArgument argument_type; + typedef void result_type; + + relation_modifier_adaptor( const Modifier & m ) : Modifier(m) {} + relation_modifier_adaptor( const Modifier & m, + const FirstExtractor & fe, + const SecondExtractor & se ) : + Modifier(m), FirstExtractor(fe), SecondExtractor(se) {} + + void operator()( NewArgument & x ) const + { + Modifier::operator()( + FirstExtractor ::operator()( x ), + SecondExtractor::operator()( x ) + ); + } +}; + +/// \brief A simple unary modifier adaptor. +// This modifier is equivalent to bind( Modifier, bind( Extractor, _1 ) ) +// It may be a good idea to start using Boost.Bind instead of it. + +template +< + class Modifier, + class NewArgument, + class Extractor +> +struct unary_modifier_adaptor : + Modifier, + Extractor +{ + typedef NewArgument argument_type; + typedef void result_type; + + unary_modifier_adaptor( const Modifier & m ) : Modifier(m) {} + unary_modifier_adaptor( const Modifier & m, + const Extractor & fe) : + Modifier(m), Extractor(fe) {} + + void operator()( NewArgument & x ) const + { + Modifier::operator()( Extractor::operator()( x ) ); + } +}; + + +} // namespace detail +} // namespace bimap +} // namespace boost + + +#endif // BOOST_BIMAP_DETAIL_MODIFIER_ADAPTOR_HPP diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/detail/non_unique_views_helper.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/detail/non_unique_views_helper.hpp new file mode 100644 index 0000000000..c970fcdc44 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/detail/non_unique_views_helper.hpp @@ -0,0 +1,71 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file detail/non_unique_views_helper.hpp +/// \brief Details for non unique views + +#ifndef BOOST_BIMAP_DETAIL_NON_UNIQUE_VIEWS_HELPER_HPP +#define BOOST_BIMAP_DETAIL_NON_UNIQUE_VIEWS_HELPER_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +/*===========================================================================*/ +#define BOOST_BIMAP_NON_UNIQUE_VIEW_INSERT_FUNCTIONS \ + \ +template <class InputIterator> \ +void insert(InputIterator iterBegin, InputIterator iterEnd) \ +{ \ + for( ; iterBegin != iterEnd ; ++iterBegin ) \ + { \ + this->base().insert( \ + this->template functor< \ + BOOST_DEDUCED_TYPENAME base_::value_to_base>()( \ + BOOST_DEDUCED_TYPENAME base_::value_type(*iterBegin)) ); \ + } \ +} \ + \ +std::pair<BOOST_DEDUCED_TYPENAME base_::iterator, bool> insert( \ + BOOST_DEDUCED_TYPENAME ::boost::call_traits< \ + BOOST_DEDUCED_TYPENAME base_::value_type >::param_type x) \ +{ \ + typedef BOOST_DEDUCED_TYPENAME base_::base_type::iterator base_iterator; \ + \ + std::pair< base_iterator, bool > r( \ + this->base().insert( \ + this->template functor< \ + BOOST_DEDUCED_TYPENAME base_::value_to_base>()(x) ) \ + ); \ + \ + return std::pair<typename base_::iterator, bool>( \ + this->template functor< \ + BOOST_DEDUCED_TYPENAME base_::iterator_from_base>()(r.first), \ + r.second \ + ); \ +} \ + \ +BOOST_DEDUCED_TYPENAME base_::iterator insert( \ + BOOST_DEDUCED_TYPENAME base_::iterator pos, \ + BOOST_DEDUCED_TYPENAME ::boost::call_traits< \ + BOOST_DEDUCED_TYPENAME base_::value_type >::param_type x) \ +{ \ + return this->template functor< \ + BOOST_DEDUCED_TYPENAME base_::iterator_from_base>()( \ + this->base().insert( \ + this->template functor< \ + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(pos), \ + this->template functor< \ + BOOST_DEDUCED_TYPENAME base_::value_to_base>()(x)) \ + ); \ +} +/*===========================================================================*/ + +#endif // BOOST_BIMAP_DETAIL_NON_UNIQUE_VIEWS_HELPER_HPP diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/detail/set_view_base.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/detail/set_view_base.hpp new file mode 100644 index 0000000000..817e30f8ae --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/detail/set_view_base.hpp @@ -0,0 +1,331 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file detail/set_view_base.hpp +/// \brief Helper base for the construction of the bimap views types. + +#ifndef BOOST_BIMAP_DETAIL_SET_VIEW_BASE_HPP +#define BOOST_BIMAP_DETAIL_SET_VIEW_BASE_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/relation/member_at.hpp> +#include <boost/bimap/relation/support/data_extractor.hpp> +#include <boost/bimap/detail/modifier_adaptor.hpp> +#include <boost/bimap/detail/set_view_iterator.hpp> +#include <boost/bimap/relation/support/get_pair_functor.hpp> +#include <boost/bimap/relation/detail/to_mutable_relation_functor.hpp> +#include <boost/bimap/relation/mutant_relation.hpp> +#include <boost/bimap/container_adaptor/support/iterator_facade_converters.hpp> + +namespace boost { +namespace bimaps { +namespace detail { + +template< class Key, class Value, class KeyToBase > +class set_view_key_to_base +{ + public: + const Key operator()( const Value & v ) const + { + return keyToBase( v ); + } + private: + KeyToBase keyToBase; +}; + +template< class MutantRelationStorage, class KeyToBase > +class set_view_key_to_base<MutantRelationStorage,MutantRelationStorage,KeyToBase> +{ + typedef BOOST_DEDUCED_TYPENAME MutantRelationStorage::non_mutable_storage non_mutable_storage; + public: + const MutantRelationStorage & operator()( const non_mutable_storage & k ) const + { + return ::boost::bimaps::relation::detail::mutate<MutantRelationStorage>(k); + } + const MutantRelationStorage & operator()( const MutantRelationStorage & k ) const + { + return k; + } +}; + + +// The next macro can be converted in a metafunctor to gain code robustness. +/*===========================================================================*/ +#define BOOST_BIMAP_SET_VIEW_CONTAINER_ADAPTOR( \ + CONTAINER_ADAPTOR, CORE_INDEX, OTHER_ITER, CONST_OTHER_ITER \ +) \ +::boost::bimaps::container_adaptor::CONTAINER_ADAPTOR \ +< \ + CORE_INDEX, \ + ::boost::bimaps::detail:: \ + set_view_iterator< \ + BOOST_DEDUCED_TYPENAME CORE_INDEX::iterator >, \ + ::boost::bimaps::detail:: \ + const_set_view_iterator< \ + BOOST_DEDUCED_TYPENAME CORE_INDEX::const_iterator >, \ + ::boost::bimaps::detail:: \ + set_view_iterator< \ + BOOST_DEDUCED_TYPENAME CORE_INDEX::OTHER_ITER >, \ + ::boost::bimaps::detail:: \ + const_set_view_iterator< \ + BOOST_DEDUCED_TYPENAME CORE_INDEX::CONST_OTHER_ITER >, \ + ::boost::bimaps::container_adaptor::support::iterator_facade_to_base \ + < \ + ::boost::bimaps::detail:: set_view_iterator< \ + BOOST_DEDUCED_TYPENAME CORE_INDEX::iterator>, \ + ::boost::bimaps::detail::const_set_view_iterator< \ + BOOST_DEDUCED_TYPENAME CORE_INDEX::const_iterator> \ + \ + >, \ + ::boost::mpl::na, \ + ::boost::mpl::na, \ + ::boost::bimaps::relation::detail:: \ + get_mutable_relation_functor< \ + BOOST_DEDUCED_TYPENAME CORE_INDEX::value_type >, \ + ::boost::bimaps::relation::support:: \ + get_above_view_functor< \ + BOOST_DEDUCED_TYPENAME CORE_INDEX::value_type >, \ + ::boost::bimaps::detail::set_view_key_to_base< \ + BOOST_DEDUCED_TYPENAME CORE_INDEX::key_type, \ + BOOST_DEDUCED_TYPENAME CORE_INDEX::value_type, \ + BOOST_DEDUCED_TYPENAME CORE_INDEX::key_from_value \ + > \ +> +/*===========================================================================*/ + + +/*===========================================================================*/ +#define BOOST_BIMAP_SEQUENCED_SET_VIEW_CONTAINER_ADAPTOR( \ + CONTAINER_ADAPTOR, CORE_INDEX, OTHER_ITER, CONST_OTHER_ITER \ +) \ +::boost::bimaps::container_adaptor::CONTAINER_ADAPTOR \ +< \ + CORE_INDEX, \ + ::boost::bimaps::detail:: \ + set_view_iterator< \ + BOOST_DEDUCED_TYPENAME CORE_INDEX::iterator >, \ + ::boost::bimaps::detail:: \ + const_set_view_iterator< \ + BOOST_DEDUCED_TYPENAME CORE_INDEX::const_iterator >, \ + ::boost::bimaps::detail:: \ + set_view_iterator< \ + BOOST_DEDUCED_TYPENAME CORE_INDEX::OTHER_ITER >, \ + ::boost::bimaps::detail:: \ + const_set_view_iterator< \ + BOOST_DEDUCED_TYPENAME CORE_INDEX::CONST_OTHER_ITER >, \ + ::boost::bimaps::container_adaptor::support::iterator_facade_to_base \ + < \ + ::boost::bimaps::detail:: set_view_iterator< \ + BOOST_DEDUCED_TYPENAME CORE_INDEX::iterator>, \ + ::boost::bimaps::detail::const_set_view_iterator< \ + BOOST_DEDUCED_TYPENAME CORE_INDEX::const_iterator> \ + \ + >, \ + ::boost::mpl::na, \ + ::boost::mpl::na, \ + ::boost::bimaps::relation::detail:: \ + get_mutable_relation_functor< \ + BOOST_DEDUCED_TYPENAME CORE_INDEX::value_type >, \ + ::boost::bimaps::relation::support:: \ + get_above_view_functor< \ + BOOST_DEDUCED_TYPENAME CORE_INDEX::value_type > \ +> +/*===========================================================================*/ + + +#if defined(BOOST_MSVC) +/*===========================================================================*/ +#define BOOST_BIMAP_SET_VIEW_BASE_FRIEND(TYPE,INDEX_TYPE) \ + typedef ::boost::bimaps::detail::set_view_base< \ + TYPE< INDEX_TYPE >, INDEX_TYPE > template_class_friend; \ + friend class template_class_friend; +/*===========================================================================*/ +#else +/*===========================================================================*/ +#define BOOST_BIMAP_SET_VIEW_BASE_FRIEND(TYPE,INDEX_TYPE) \ + friend class ::boost::bimaps::detail::set_view_base< \ + TYPE< INDEX_TYPE >, INDEX_TYPE >; +/*===========================================================================*/ +#endif + + +/// \brief Common base for set views. + +template< class Derived, class Index > +class set_view_base +{ + typedef ::boost::bimaps::container_adaptor::support:: + iterator_facade_to_base + < + ::boost::bimaps::detail:: + set_view_iterator<BOOST_DEDUCED_TYPENAME Index:: iterator>, + ::boost::bimaps::detail:: + const_set_view_iterator<BOOST_DEDUCED_TYPENAME Index::const_iterator> + + > iterator_to_base_; + + typedef BOOST_DEDUCED_TYPENAME Index::value_type::left_value_type left_type_; + + typedef BOOST_DEDUCED_TYPENAME Index::value_type::right_value_type right_type_; + + typedef BOOST_DEDUCED_TYPENAME Index::value_type value_type_; + + typedef ::boost::bimaps::detail:: + set_view_iterator<BOOST_DEDUCED_TYPENAME Index::iterator> iterator_; + + public: + + bool replace(iterator_ position, + const value_type_ & x) + { + return derived().base().replace( + derived().template functor<iterator_to_base_>()(position),x + ); + } + + template< class CompatibleLeftType > + bool replace_left(iterator_ position, + const CompatibleLeftType & l) + { + return derived().base().replace( + derived().template functor<iterator_to_base_>()(position), + ::boost::bimaps::relation::detail::copy_with_left_replaced(*position,l) + ); + } + + template< class CompatibleRightType > + bool replace_right(iterator_ position, + const CompatibleRightType & r) + { + return derived().base().replace( + derived().template functor<iterator_to_base_>()(position), + ::boost::bimaps::relation::detail::copy_with_right_replaced(*position,r) + ); + } + + /* This function may be provided in the future + + template< class Modifier > + bool modify(iterator_ position, + Modifier mod) + { + return derived().base().modify( + + derived().template functor<iterator_to_base_>()(position), + + ::boost::bimaps::detail::relation_modifier_adaptor + < + Modifier, + BOOST_DEDUCED_TYPENAME Index::value_type, + BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support:: + data_extractor + < + ::boost::bimaps::relation::member_at::left, + BOOST_DEDUCED_TYPENAME Index::value_type + + >::type, + BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support:: + data_extractor + < + ::boost::bimaps::relation::member_at::right, + BOOST_DEDUCED_TYPENAME Index::value_type + + >::type + + >(mod) + ); + } + */ + /* + template< class Modifier > + bool modify_left(iterator_ position, Modifier mod) + { + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support:: + data_extractor + < + BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::member_at::right, + BOOST_DEDUCED_TYPENAME Index::value_type + + >::type left_data_extractor_; + + return derived().base().modify( + + derived().template functor<iterator_to_base_>()(position), + + // this may be replaced later by + // ::boost::bind( mod, ::boost::bind(data_extractor_(),_1) ) + + ::boost::bimaps::detail::unary_modifier_adaptor + < + Modifier, + BOOST_DEDUCED_TYPENAME Index::value_type, + left_data_extractor_ + + >(mod) + ); + } + + template< class Modifier > + bool modify_right(iterator_ position, Modifier mod) + { + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support:: + data_extractor + < + BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::member_at::right, + BOOST_DEDUCED_TYPENAME Index::value_type + + >::type right_data_extractor_; + + return derived().base().modify( + + derived().template functor<iterator_to_base_>()(position), + + // this may be replaced later by + // ::boost::bind( mod, ::boost::bind(data_extractor_(),_1) ) + + ::boost::bimaps::detail::unary_modifier_adaptor + < + Modifier, + BOOST_DEDUCED_TYPENAME Index::value_type, + right_data_extractor_ + + >(mod) + ); + } + */ + protected: + + typedef set_view_base set_view_base_; + + private: + + // Curiously Recurring Template interface. + + Derived& derived() + { + return *static_cast<Derived*>(this); + } + + Derived const& derived() const + { + return *static_cast<Derived const*>(this); + } +}; + + + +} // namespace detail +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_DETAIL_SET_VIEW_BASE_HPP diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/detail/set_view_iterator.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/detail/set_view_iterator.hpp new file mode 100644 index 0000000000..a8b2425b9b --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/detail/set_view_iterator.hpp @@ -0,0 +1,205 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file detail/set_view_iterator.hpp +/// \brief Iterator adaptors from multi-index to bimap. + +#ifndef BOOST_BIMAP_DETAIL_SET_VIEW_ITERATOR_HPP +#define BOOST_BIMAP_DETAIL_SET_VIEW_ITERATOR_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +// Boost + +#ifndef BOOST_BIMAP_DISABLE_SERIALIZATION + #include <boost/core/serialization.hpp> +#endif // BOOST_BIMAP_DISABLE_SERIALIZATION + +#include <boost/iterator/detail/enable_if.hpp> +#include <boost/iterator/iterator_adaptor.hpp> +#include <boost/bimap/relation/support/get_pair_functor.hpp> + +namespace boost { +namespace bimaps { +namespace detail { + + +/** \brief Set View Iterator adaptor from multi index to bimap. + +This is class is based on transform iterator from Boost.Iterator that is +modified to allow serialization. It has been specialized for this +library, and EBO optimization was applied to the functor. + + **/ + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +template< class CoreIterator > struct set_view_iterator; + +template< class CoreIterator > +struct set_view_iterator_base +{ + typedef iterator_adaptor + < + set_view_iterator< CoreIterator >, + CoreIterator, + BOOST_DEDUCED_TYPENAME CoreIterator::value_type::above_view + + > type; +}; + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +template< class CoreIterator > +struct set_view_iterator : public set_view_iterator_base<CoreIterator>::type +{ + typedef BOOST_DEDUCED_TYPENAME set_view_iterator_base<CoreIterator>::type base_; + + public: + + set_view_iterator() {} + + set_view_iterator(CoreIterator const& iter) + : base_(iter) {} + + set_view_iterator(set_view_iterator const & iter) + : base_(iter.base()) {} + + typename base_::reference dereference() const + { + return const_cast< + BOOST_DEDUCED_TYPENAME base_::base_type::value_type*>( + &(*this->base()) + )->get_view(); + } + + private: + + friend class boost::iterators::iterator_core_access; + + #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION + + // Serialization support + + template< class Archive > + void serialize(Archive & ar, const unsigned int v) + { + boost::core::split_member(ar, *this, v); + } + + friend class ::boost::serialization::access; + + template< class Archive > + void save(Archive & ar, const unsigned int) const + { + ar << ::boost::serialization::make_nvp("mi_iterator",this->base()); + } + + template< class Archive > + void load(Archive & ar, const unsigned int) + { + CoreIterator iter; + ar >> ::boost::serialization::make_nvp("mi_iterator",iter); + this->base_reference() = iter; + } + + #endif // BOOST_BIMAP_DISABLE_SERIALIZATION +}; + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +template< class CoreIterator > struct const_set_view_iterator; + +template< class CoreIterator > +struct const_set_view_iterator_base +{ + typedef iterator_adaptor + < + const_set_view_iterator< CoreIterator >, + CoreIterator, + const BOOST_DEDUCED_TYPENAME CoreIterator::value_type::above_view + + > type; +}; + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + + +/** \brief Const Set View Iterator adaptor from multi index to bimap. + +See also set_view_iterator. + **/ + +template< class CoreIterator > +struct const_set_view_iterator : public const_set_view_iterator_base<CoreIterator>::type +{ + typedef BOOST_DEDUCED_TYPENAME const_set_view_iterator_base<CoreIterator>::type base_; + + public: + + const_set_view_iterator() {} + + const_set_view_iterator(CoreIterator const& iter) + : base_(iter) {} + + const_set_view_iterator(const_set_view_iterator const & iter) + : base_(iter.base()) {} + + const_set_view_iterator(set_view_iterator<CoreIterator> i) + : base_(i.base()) {} + + BOOST_DEDUCED_TYPENAME base_::reference dereference() const + { + return this->base()->get_view(); + } + + private: + + friend class boost::iterators::iterator_core_access; + + #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION + + // Serialization support + + template< class Archive > + void serialize(Archive & ar, const unsigned int v) + { + boost::core::split_member(ar, *this, v); + } + + friend class ::boost::serialization::access; + + template< class Archive > + void save(Archive & ar, const unsigned int) const + { + ar << ::boost::serialization::make_nvp("mi_iterator",this->base()); + } + + template< class Archive > + void load(Archive & ar, const unsigned int) + { + CoreIterator iter; + ar >> ::boost::serialization::make_nvp("mi_iterator",iter); + this->base_reference() = iter; + } + + #endif // BOOST_BIMAP_DISABLE_SERIALIZATION +}; + + +} // namespace detail +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_DETAIL_MAP_VIEW_ITERATOR_HPP + + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/detail/test/check_metadata.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/detail/test/check_metadata.hpp new file mode 100644 index 0000000000..dee81f8ebb --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/detail/test/check_metadata.hpp @@ -0,0 +1,113 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_BIMAP_DETAIL_CHECK_METADATA_HPP +#define BOOST_BIMAP_DETAIL_CHECK_METADATA_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/mpl/assert.hpp> +#include <boost/type_traits/is_same.hpp> +#include <boost/preprocessor/cat.hpp> + + +// Easier way to call BOOST_MPL_ASSERT_MSG in class scope +/*===========================================================================*/ +#define BOOST_BIMAP_MPL_ASSERT_MSG_ACS(p1,p2,p3) \ + \ + struct p2 {}; \ + BOOST_MPL_ASSERT_MSG(p1,p2,p3); \ +/*===========================================================================*/ + + +// Build a descriptive name. +/*===========================================================================*/ +#define BOOST_BIMAP_WRONG_METADATA_MESSAGE( \ + \ + P_CLASS, \ + P_NAME, \ + P_CORRECT_TYPE \ + \ + ) \ + \ + BOOST_PP_CAT \ + ( \ + WRONG_METADATA__, \ + BOOST_PP_CAT \ + ( \ + P_CLASS, \ + BOOST_PP_CAT \ + ( \ + __AT__, \ + BOOST_PP_CAT \ + ( \ + P_NAME, \ + BOOST_PP_CAT \ + ( \ + __IS_DIFERENT_TO__, \ + P_CORRECT_TYPE \ + ) \ + ) \ + ) \ + ) \ + ) +/*===========================================================================*/ + + +// Check if the metadata have the correct type, and if not inform +// it with a useful compile time message. +/*===========================================================================*/ +#define BOOST_BIMAP_CHECK_METADATA( \ + \ + P_CLASS, \ + P_NAME, \ + P_CORRECT_TYPE \ + \ + ) \ + \ + BOOST_BIMAP_MPL_ASSERT_MSG_ACS \ + ( \ + ( \ + ::boost::is_same \ + < \ + P_CLASS::P_NAME, \ + P_CORRECT_TYPE \ + \ + >::value \ + ), \ + BOOST_BIMAP_WRONG_METADATA_MESSAGE \ + ( \ + P_CLASS, \ + P_NAME, \ + P_CORRECT_TYPE \ + ), \ + (P_CLASS::P_NAME,P_CORRECT_TYPE) \ + ) +/*===========================================================================*/ + + +// Just for autodocumment the test code +/*===========================================================================*/ +#define BOOST_BIMAP_TEST_STATIC_FUNCTION(NAME) \ + namespace NAME +/*===========================================================================*/ + + +// Just for autodocument the test code +/*===========================================================================*/ +#define BOOST_BIMAP_CALL_TEST_STATIC_FUNCTION(NAME) +/*===========================================================================*/ + + + +#endif // BOOST_BIMAP_DETAIL_CHECK_METADATA_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/detail/user_interface_config.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/detail/user_interface_config.hpp new file mode 100644 index 0000000000..5bdf41bf7e --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/detail/user_interface_config.hpp @@ -0,0 +1,24 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file detail/user_interface_config.hpp +/// \brief General configuration directives + + +#ifndef BOOST_BIMAP_DETAIL_USER_INTERFACE_CONFIG_HPP +#define BOOST_BIMAP_DETAIL_USER_INTERFACE_CONFIG_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#ifdef BOOST_BIMAP_DISABLE_SERIALIZATION + #define BOOST_MULTI_INDEX_DISABLE_SERIALIZATION +#endif + +#endif // BOOST_BIMAP_DETAIL_USER_INTERFACE_CONFIG_HPP diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/list_of.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/list_of.hpp new file mode 100644 index 0000000000..3bd6d379d6 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/list_of.hpp @@ -0,0 +1,181 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file list_of.hpp +/// \brief Include support for list constrains for the bimap container + +#ifndef BOOST_BIMAP_LIST_OF_HPP +#define BOOST_BIMAP_LIST_OF_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/detail/user_interface_config.hpp> + +#include <boost/mpl/bool.hpp> + +#include <boost/concept_check.hpp> + +#include <boost/bimap/detail/concept_tags.hpp> + +#include <boost/bimap/tags/support/value_type_of.hpp> + +#include <boost/bimap/detail/generate_index_binder.hpp> +#include <boost/bimap/detail/generate_view_binder.hpp> +#include <boost/bimap/detail/generate_relation_binder.hpp> + +#include <boost/multi_index/sequenced_index.hpp> + +#include <boost/bimap/views/list_map_view.hpp> +#include <boost/bimap/views/list_set_view.hpp> + +namespace boost { +namespace bimaps { + + +/// \brief Set Type Specification +/** +This struct is used to specify a set specification. +It is not a container, it is just a metaprogramming facility to +express the type of a set. Generally, this specification will +be used in other place to create a container. +It has the same syntax that an std::list instantiation, except +that the allocator cannot be specified. The rationale behind +this difference is that the allocator is not part of the set +type specification, rather it is a container configuration +parameter. + +\code +using namespace support; + +BOOST_STATIC_ASSERT( is_set_type_of< list_of<Type> >::value ) + +BOOST_STATIC_ASSERT +( + is_same + < + list_of<Type>::index_bind + < + KeyExtractor, + Tag + + >::type, + + sequenced< tag<Tag>, KeyExtractor > + + >::value +) + +typedef bimap +< + list_of<Type>, RightKeyType + +> bimap_with_left_type_as_list; + +BOOST_STATIC_ASSERT +( + is_same + < + list_of<Type>::map_view_bind + < + member_at::left, + bimap_with_left_type_as_list + + >::type, + list_map_view< member_at::left, bimap_with_left_type_as_list > + + >::value +) + +\endcode + +See also list_of_relation. + **/ + +template< class Type > +struct list_of : public ::boost::bimaps::detail::set_type_of_tag +{ + /// User type, can be tagged + typedef Type user_type; + + /// Type of the object that will be stored in the list + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::tags::support:: + value_type_of<user_type>::type value_type; + + + struct lazy_concept_checked + { + BOOST_CLASS_REQUIRE ( value_type, + boost, AssignableConcept ); + + typedef list_of type; + }; + + BOOST_BIMAP_GENERATE_INDEX_BINDER_0CP_NO_EXTRACTOR( + + // binds to + multi_index::sequenced + ) + + BOOST_BIMAP_GENERATE_MAP_VIEW_BINDER( + + // binds to + views::list_map_view + ) + + BOOST_BIMAP_GENERATE_SET_VIEW_BINDER( + + // binds to + views::list_set_view + ) + + typedef mpl::bool_<true> mutable_key; +}; + + +/// \brief List Of Relation Specification +/** +This struct is similar to list_of but it is bind logically to a +relation. It is used in the bimap instantiation to specify the +desired type of the main view. This struct implements internally +a metafunction named bind_to that manages the quite complicated +task of finding the right type of the set for the relation. + +\code +template<class Relation> +struct bind_to +{ + typedef -unspecified- type; +}; +\endcode + +See also list_of, is_set_type_of_relation. + **/ + +struct list_of_relation : public ::boost::bimaps::detail::set_type_of_relation_tag +{ + BOOST_BIMAP_GENERATE_RELATION_BINDER_0CP( + + // binds to + list_of + ) + + typedef mpl::bool_<true> left_mutable_key; + typedef mpl::bool_<true> right_mutable_key; +}; + + +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_LIST_OF_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/multiset_of.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/multiset_of.hpp new file mode 100644 index 0000000000..5124631994 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/multiset_of.hpp @@ -0,0 +1,205 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file multiset_of.hpp +/// \brief Include support for multiset constrains for the bimap container + +#ifndef BOOST_BIMAP_MULTISET_OF_HPP +#define BOOST_BIMAP_MULTISET_OF_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/detail/user_interface_config.hpp> + +#include <functional> +#include <boost/mpl/bool.hpp> + +#include <boost/concept_check.hpp> + +#include <boost/bimap/detail/concept_tags.hpp> + +#include <boost/bimap/tags/support/value_type_of.hpp> + +#include <boost/bimap/detail/generate_index_binder.hpp> +#include <boost/bimap/detail/generate_view_binder.hpp> +#include <boost/bimap/detail/generate_relation_binder.hpp> + +#include <boost/multi_index/ordered_index.hpp> + +#include <boost/bimap/views/multimap_view.hpp> +#include <boost/bimap/views/multiset_view.hpp> + +namespace boost { +namespace bimaps { + +/// \brief Set Type Specification +/** +This struct is used to specify a multiset specification. +It is not a container, it is just a metaprogramming facility to +express the type of a set. Generally, this specification will +be used in other place to create a container. +It has the same syntax that an std::set instantiation, except +that the allocator cannot be specified. The rationale behind +this difference is that the allocator is not part of the set +type specification, rather it is a container configuration +parameter. +The first parameter is the type of the objects in the multiset, +and the second one is a Functor that compares them. +Bimap binding metafunctions can be used with this class in +the following way: + +\code +using namespace support; + +BOOST_STATIC_ASSERT( is_set_type_of< multiset_of<Type> >::value ) + +BOOST_STATIC_ASSERT +( + is_same + < + compute_index_type + < + multiset_of<Type,KeyCompare>, + KeyExtractor, + Tag + + >::type + , + ordered_nonunique< tag<Tag>, KeyExtractor, KeyCompare > + + >::value +) + +typedef bimap +< + multiset_of<Type>, RightKeyType + +> bimap_with_left_type_as_multiset; + +BOOST_STATIC_ASSERT +( + is_same + < + compute_map_view_type + < + member_at::left, + bimap_with_left_type_as_multiset + + >::type, + multimap_view< member_at::left, bimap_with_left_type_as_multiset > + + >::value +) + +\endcode + +See also multiset_of_relation. + **/ + +template +< + class KeyType, + class KeyCompare = std::less< BOOST_DEDUCED_TYPENAME + ::boost::bimaps::tags::support::value_type_of<KeyType>::type > +> +struct multiset_of : public ::boost::bimaps::detail::set_type_of_tag +{ + /// User type, can be tagged + typedef KeyType user_type; + + /// Type of the object that will be stored in the multiset + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::tags::support:: + value_type_of<user_type>::type value_type; + + /// Functor that compare two keys + typedef KeyCompare key_compare; + + struct lazy_concept_checked + { + BOOST_CLASS_REQUIRE ( value_type, + boost, AssignableConcept ); + + BOOST_CLASS_REQUIRE4( key_compare, bool, value_type, value_type, + boost, BinaryFunctionConcept ); + + typedef multiset_of type; + }; + + BOOST_BIMAP_GENERATE_INDEX_BINDER_1CP( + + // binds to + multi_index::ordered_non_unique, + + // with + key_compare + ) + + BOOST_BIMAP_GENERATE_MAP_VIEW_BINDER( + + // binds to + views::multimap_view + ) + + BOOST_BIMAP_GENERATE_SET_VIEW_BINDER( + + // binds to + views::multiset_view + ) + + typedef mpl::bool_<false> mutable_key; +}; + + +/// \brief Set Of Relation Specification +/** +This struct is similar to multiset_of but it is bind logically to a +relation. It is used in the bimap instantiation to specify the +desired type of the main view. This struct implements internally +a metafunction named bind_to that manages the quite complicated +task of finding the right type of the set for the relation. + +\code +template<class Relation> +struct bind_to +{ + typedef -unspecified- type; +}; +\endcode + +See also multiset_of, is_set_type_of_relation. + **/ + +template< class KeyCompare = std::less< _relation > > +struct multiset_of_relation : public ::boost::bimaps::detail::set_type_of_relation_tag +{ + /// Functor that compare two keys + typedef KeyCompare key_compare; + + + BOOST_BIMAP_GENERATE_RELATION_BINDER_1CP( + + // binds to + multiset_of, + + // with + key_compare + ) + + typedef mpl::bool_<false> left_mutable_key; + typedef mpl::bool_<false> right_mutable_key; +}; + +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_MULTISET_OF_HPP diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/property_map/set_support.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/property_map/set_support.hpp new file mode 100644 index 0000000000..7e3f5a55a7 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/property_map/set_support.hpp @@ -0,0 +1,57 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file property_map/set_support.hpp +/// \brief Support for the property map concept. + +#ifndef BOOST_BIMAP_PROPERTY_MAP_SET_SUPPORT_HPP +#define BOOST_BIMAP_PROPERTY_MAP_SET_SUPPORT_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/set_of.hpp> +#include <boost/bimap/support/data_type_by.hpp> +#include <boost/bimap/support/key_type_by.hpp> + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +namespace boost { + +template <typename PA> struct property_traits; +struct readable_property_map_tag; + +template< class Tag, class Bimap > +struct property_traits< ::boost::bimaps::views::map_view<Tag,Bimap> > +{ + typedef BOOST_DEDUCED_TYPENAME + ::boost::bimaps::support::data_type_by<Tag,Bimap>::type value_type; + typedef BOOST_DEDUCED_TYPENAME + ::boost::bimaps::support:: key_type_by<Tag,Bimap>::type key_type; + + typedef readable_property_map_tag category; +}; + + +template< class Tag, class Bimap > +const BOOST_DEDUCED_TYPENAME ::boost::bimaps::support::data_type_by<Tag,Bimap>::type & + get(const ::boost::bimaps::views::map_view<Tag,Bimap> & m, + const BOOST_DEDUCED_TYPENAME + ::boost::bimaps::support::key_type_by<Tag,Bimap>::type & key) +{ + return m.at(key); +} + +} // namespace boost + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +#endif // BOOST_BIMAP_PROPERTY_MAP_SET_SUPPORT_HPP diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/property_map/unordered_set_support.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/property_map/unordered_set_support.hpp new file mode 100644 index 0000000000..85c533384a --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/property_map/unordered_set_support.hpp @@ -0,0 +1,57 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file property_map/unordered_set_support.hpp +/// \brief Support for the property map concept. + +#ifndef BOOST_BIMAP_PROPERTY_MAP_UNORDERED_SET_SUPPORT_HPP +#define BOOST_BIMAP_PROPERTY_MAP_UNORDERED_SET_SUPPORT_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/unordered_set_of.hpp> +#include <boost/bimap/support/data_type_by.hpp> +#include <boost/bimap/support/key_type_by.hpp> + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +namespace boost { + +template <typename PA> struct property_traits; +struct readable_property_map_tag; + +template< class Tag, class Bimap > +struct property_traits< ::boost::bimaps::views::unordered_map_view<Tag,Bimap> > +{ + typedef BOOST_DEDUCED_TYPENAME + ::boost::bimaps::support::data_type_by<Tag,Bimap>::type value_type; + typedef BOOST_DEDUCED_TYPENAME + ::boost::bimaps::support:: key_type_by<Tag,Bimap>::type key_type; + + typedef readable_property_map_tag category; +}; + + +template< class Tag, class Bimap > +const BOOST_DEDUCED_TYPENAME ::boost::bimaps::support::data_type_by<Tag,Bimap>::type & + get(const ::boost::bimaps::views::unordered_map_view<Tag,Bimap> & m, + const BOOST_DEDUCED_TYPENAME + ::boost::bimaps::support::key_type_by<Tag,Bimap>::type & key) +{ + return m.at(key); +} + +} // namespace boost + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +#endif // BOOST_BIMAP_PROPERTY_MAP_UNORDERED_SET_SUPPORT_HPP diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/relation/detail/access_builder.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/relation/detail/access_builder.hpp new file mode 100644 index 0000000000..fd707769f0 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/relation/detail/access_builder.hpp @@ -0,0 +1,170 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file relation/detail/access_builder.hpp +/// \brief Define macros to help building metafunctions + +#ifndef BOOST_BIMAP_RELATION_ACCESS_BUILDER_HPP +#define BOOST_BIMAP_RELATION_ACCESS_BUILDER_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/relation/support/member_with_tag.hpp> +#include <boost/bimap/relation/member_at.hpp> +#include <boost/call_traits.hpp> +#include <boost/type_traits/is_const.hpp> +#include <boost/mpl/if.hpp> +#include <boost/mpl/not.hpp> +#include <boost/core/enable_if.hpp> + + +/****************************************************************************** + BIMAP SYMMETRIC ACCESS RESULT OF +******************************************************************************* + +namespace result_of { + +template< class Tag, class SymmetricType > +struct NAME +{ + typedef -unspecified- type; +}; + +} // namespace result_of + +******************************************************************************/ + +/*===========================================================================*/ +#define BOOST_BIMAP_SYMMETRIC_ACCESS_RESULT_OF_BUILDER( \ + \ + NAME, \ + METAFUNCTION_BASE \ + ) \ + \ + namespace result_of { \ + \ + template< class Tag, class SymmetricType > \ + struct NAME \ + { \ + typedef BOOST_DEDUCED_TYPENAME METAFUNCTION_BASE \ + < \ + Tag,SymmetricType \ + \ + >::type value_type; \ + \ + typedef BOOST_DEDUCED_TYPENAME mpl::if_< is_const<SymmetricType>, \ + \ + BOOST_DEDUCED_TYPENAME call_traits<value_type>::const_reference, \ + \ + BOOST_DEDUCED_TYPENAME call_traits<value_type>::reference \ + \ + >::type type; \ + }; \ + \ + } +/*===========================================================================*/ + + + +/****************************************************************************** + BIMAP SYMMETRIC ACCESS IMPLEMENTATION +******************************************************************************* + +namespace detail { + +template< class Tag, class SymmetricType > +typename result_of::NAME<Tag,SymmetricType>::type + NAME( Tag , const Relation & ); + +} // namespace detail + +******************************************************************************/ + + +/*===========================================================================*/ +#define BOOST_BIMAP_SYMMETRIC_ACCESS_IMPLEMENTATION_BUILDER( \ + \ + NAME, \ + TP_SYMMETRIC, \ + PARAMETER_NAME, \ + LEFT_BODY, \ + RIGHT_BODY \ + ) \ + \ + namespace detail { \ + \ + \ + \ + template< class TP_SYMMETRIC > \ + BOOST_DEDUCED_TYPENAME result_of::NAME \ + < \ + ::boost::bimaps::relation::member_at::left,TP_SYMMETRIC \ + \ + >::type \ + \ + NAME( ::boost::bimaps::relation::member_at::left, \ + TP_SYMMETRIC & PARAMETER_NAME ) \ + { \ + LEFT_BODY; \ + } \ + \ + template< class TP_SYMMETRIC > \ + BOOST_DEDUCED_TYPENAME result_of::NAME \ + < \ + ::boost::bimaps::relation::member_at::right,TP_SYMMETRIC \ + \ + >::type \ + \ + NAME( ::boost::bimaps::relation::member_at::right, \ + TP_SYMMETRIC & PARAMETER_NAME ) \ + { \ + RIGHT_BODY; \ + } \ + \ + } +/*===========================================================================*/ + + +/****************************************************************************** + BIMAP RELATION ACCESS INTERFACE +******************************************************************************* + +template< class Tag, class SymmetricType > +typename result_of::NAME<Tag,SymmetricType>::type + NAME( const SymmetricType & ); + +******************************************************************************/ + +/*===========================================================================*/ +#define BOOST_BIMAP_SYMMETRIC_ACCESS_INTERFACE_BUILDER( \ + \ + NAME \ + ) \ + \ + template< class Tag, class SymmetricType > \ + BOOST_DEDUCED_TYPENAME result_of::NAME<Tag,SymmetricType>::type \ + NAME( SymmetricType & s ) \ + { \ + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support:: \ + member_with_tag \ + < \ + Tag,SymmetricType \ + \ + >::type member_at_tag; \ + \ + return detail::NAME(member_at_tag(),s); \ + } +/*===========================================================================*/ + + +#endif // BOOST_BIMAP_RELATION_ACCESS_BUILDER_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/relation/detail/metadata_access_builder.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/relation/detail/metadata_access_builder.hpp new file mode 100644 index 0000000000..d0cf6d0e15 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/relation/detail/metadata_access_builder.hpp @@ -0,0 +1,103 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file relation/detail/metadata_access_builder.hpp +/// \brief Define macros to help building metafunctions + +#ifndef BOOST_BIMAP_RELATION_DETAIL_METADATA_ACCESS_BUILDER_HPP +#define BOOST_BIMAP_RELATION_DETAIL_METADATA_ACCESS_BUILDER_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/relation/support/is_tag_of_member_at.hpp> +#include <boost/bimap/detail/debug/static_error.hpp> +#include <boost/core/enable_if.hpp> +#include <boost/preprocessor/cat.hpp> + + + +/****************************************************************************** + BIMAP SYMMETRIC METADATA ACCESS INTERFACE +******************************************************************************* + +template< class Tag, class SymmetricType > +struct NAME +{ + typedef -unspecified- type; +}; + +******************************************************************************/ + + +/*===========================================================================*/ +#define BOOST_BIMAP_SYMMETRIC_METADATA_ACCESS_BUILDER( \ + \ + NAME, \ + METADATA_BY_LEFT, \ + METADATA_BY_RIGHT \ + ) \ + \ + template \ + < \ + class Tag, \ + class SymmetricType, \ + class Enable = void \ + > \ + struct NAME \ + { \ + BOOST_BIMAP_STATIC_ERROR( \ + BOOST_PP_CAT(NAME,_FAILURE), \ + (SymmetricType,Tag) \ + ); \ + }; \ + \ + template< class Tag, class SymmetricType > \ + struct NAME \ + < \ + Tag, SymmetricType, \ + BOOST_DEDUCED_TYPENAME enable_if \ + < \ + ::boost::bimaps::relation::support::is_tag_of_member_at_left \ + < \ + Tag, \ + SymmetricType \ + > \ + \ + >::type \ + > \ + { \ + typedef BOOST_DEDUCED_TYPENAME SymmetricType::METADATA_BY_LEFT type; \ + }; \ + \ + template< class Tag, class SymmetricType > \ + struct NAME \ + < \ + Tag, SymmetricType, \ + BOOST_DEDUCED_TYPENAME enable_if \ + < \ + ::boost::bimaps::relation::support::is_tag_of_member_at_right \ + < \ + Tag, \ + SymmetricType \ + > \ + \ + >::type \ + > \ + { \ + typedef BOOST_DEDUCED_TYPENAME SymmetricType::METADATA_BY_RIGHT type; \ + }; +/*===========================================================================*/ + + +#endif // BOOST_BIMAP_RELATION_DETAIL_METADATA_ACCES_BUILDER_HPP + + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/relation/detail/mutant.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/relation/detail/mutant.hpp new file mode 100644 index 0000000000..22641ee58b --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/relation/detail/mutant.hpp @@ -0,0 +1,83 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file relation/detail/mutant.hpp +/// \brief Mutate functions to extract views of mutant classes. + +#ifndef BOOST_BIMAP_RELATION_DETAIL_MUTANT_HPP +#define BOOST_BIMAP_RELATION_DETAIL_MUTANT_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/detail/debug/static_error.hpp> +#include <boost/mpl/contains.hpp> +#include <boost/mpl/assert.hpp> +#include <boost/static_assert.hpp> +#include <boost/type_traits/is_const.hpp> +#include <boost/utility/addressof.hpp> +#include <boost/mpl/not.hpp> +#include <boost/core/enable_if.hpp> + +namespace boost { +namespace bimaps { +namespace relation { + +/// \brief Relation details, mutant idiom and symmetrical metafunctions builders. + +namespace detail { + +//@{ +/// \brief Converts a mutant class to a view with zero overhead. +/** + +This function is a safe wrapper around reinterpret_cast. It checks at +compile time that the desired view is supported by the mutant class. +See also mutant, can_mutate_in. +\ingroup mutant_group + **/ + + +template< class View, class Type > +BOOST_DEDUCED_TYPENAME enable_if< mpl::not_< is_const< Type > >, + +View& + +>::type mutate( Type & m ) +{ + BOOST_MPL_ASSERT(( + ::boost::mpl::contains<BOOST_DEDUCED_TYPENAME Type::mutant_views,View> + )); + return *reinterpret_cast< View* >(boost::addressof(m)); +} + +template< class View, class Type > +BOOST_DEDUCED_TYPENAME enable_if< is_const< Type >, + +const View& + +>::type mutate( Type & m ) +{ + BOOST_MPL_ASSERT(( + ::boost::mpl::contains<BOOST_DEDUCED_TYPENAME Type::mutant_views,View> + )); + return *reinterpret_cast< const View* >(boost::addressof(m)); +} + +//@} + +} // namespace detail +} // namespace relation +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_RELATION_DETAIL_MUTANT_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/relation/detail/static_access_builder.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/relation/detail/static_access_builder.hpp new file mode 100644 index 0000000000..66aeb2e897 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/relation/detail/static_access_builder.hpp @@ -0,0 +1,105 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + + +/// \file relation/detail/static_access_builder.hpp +/// \brief Define macros to help building metafunctions + +#ifndef BOOST_BIMAP_RELATION_DETAIL_STATIC_ACCESS_BUILDER_HPP +#define BOOST_BIMAP_RELATION_DETAIL_STATIC_ACCESS_BUILDER_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/relation/support/is_tag_of_member_at.hpp> +#include <boost/bimap/detail/debug/static_error.hpp> +#include <boost/core/enable_if.hpp> +#include <boost/preprocessor/cat.hpp> + + + +/****************************************************************************** + BIMAP SYMMETRIC STATIC ACCESS INTERFACE +******************************************************************************* + +template< class Tag, class SYMETRIC_TYPE > +struct NAME +{ + -UNDEFINED BODY-; +}; + +******************************************************************************/ + + +/*===========================================================================*/ +#define BOOST_BIMAP_SYMMETRIC_STATIC_ACCESS_BUILDER( \ + \ + NAME, \ + SYMMETRIC_TYPE, \ + LEFT_BODY, \ + RIGHT_BODY \ + ) \ + \ + template \ + < \ + class Tag, \ + class SYMMETRIC_TYPE, \ + class Enable = void \ + > \ + struct NAME \ + { \ + BOOST_BIMAP_STATIC_ERROR( \ + BOOST_PP_CAT(NAME,_FAILURE), \ + (SYMMETRIC_TYPE,Tag) \ + ); \ + }; \ + \ + template< class Tag, class SYMMETRIC_TYPE > \ + struct NAME \ + < \ + Tag, SYMMETRIC_TYPE, \ + BOOST_DEDUCED_TYPENAME enable_if \ + < \ + ::boost::bimaps::relation::support::is_tag_of_member_at_left \ + < \ + Tag, \ + SYMMETRIC_TYPE \ + > \ + \ + >::type \ + > \ + { \ + LEFT_BODY; \ + }; \ + \ + template< class Tag, class SYMMETRIC_TYPE > \ + struct NAME \ + < \ + Tag, SYMMETRIC_TYPE, \ + BOOST_DEDUCED_TYPENAME enable_if \ + < \ + ::boost::bimaps::relation::support::is_tag_of_member_at_right \ + < \ + Tag, \ + SYMMETRIC_TYPE \ + > \ + \ + >::type \ + > \ + { \ + RIGHT_BODY; \ + }; +/*===========================================================================*/ + + +#endif // BOOST_BIMAP_RELATION_DETAIL_STATIC_ACCES_BUILDER_HPP + + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/relation/detail/to_mutable_relation_functor.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/relation/detail/to_mutable_relation_functor.hpp new file mode 100644 index 0000000000..f484d45b4e --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/relation/detail/to_mutable_relation_functor.hpp @@ -0,0 +1,102 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file relation/detail/to_mutable_relation_functor.hpp +/// \brief functors to convert types to mutable relations + +#ifndef BOOST_BIMAP_RELATION_DETAIL_TO_MUTABLE_RELATION_FUNCTOR_HPP +#define BOOST_BIMAP_RELATION_DETAIL_TO_MUTABLE_RELATION_FUNCTOR_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/relation/support/pair_type_by.hpp> +#include <boost/bimap/relation/detail/mutant.hpp> +#include <boost/bimap/relation/mutant_relation.hpp> + +namespace boost { +namespace bimaps { +namespace relation { +namespace detail { + +/// \brief Functor used in map views + +template< class Tag, class Relation > +struct pair_to_relation_functor +{ + const Relation + operator()(const BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support:: + pair_type_by<Tag,Relation>::type & p) const + { + return Relation(p); + } +}; + +template< class Tag, class TA, class TB, class Info > +struct pair_to_relation_functor< + Tag,::boost::bimaps::relation::mutant_relation<TA,TB,Info,true> > +{ + typedef ::boost::bimaps::relation::mutant_relation<TA,TB,Info,true> Relation; + + Relation & + operator()( BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support:: + pair_type_by<Tag,Relation>::type & p ) const + { + return ::boost::bimaps::relation::detail::mutate<Relation>(p); + } + + const Relation & + operator()( const BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support:: + pair_type_by<Tag,Relation>::type & p) const + { + return ::boost::bimaps::relation::detail::mutate<Relation>(p); + } +}; + + +/// \brief Used in set views + +template< class Relation > +struct get_mutable_relation_functor +{ + const Relation + operator()( const BOOST_DEDUCED_TYPENAME Relation::above_view & r ) const + { + return Relation(r); + } +}; + +template< class TA, class TB, class Info > +struct get_mutable_relation_functor< ::boost::bimaps::relation::mutant_relation<TA,TB,Info,true> > +{ + typedef ::boost::bimaps::relation::mutant_relation<TA,TB,Info,true> Relation; + + Relation & + operator()( BOOST_DEDUCED_TYPENAME Relation::above_view & r ) const + { + return ::boost::bimaps::relation::detail::mutate<Relation>(r); + } + + const Relation & + operator()( const BOOST_DEDUCED_TYPENAME Relation::above_view & r ) const + { + return ::boost::bimaps::relation::detail::mutate<Relation>(r); + } +}; + +} // namespace detail +} // namespace relation +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_RELATION_DETAIL_TO_MUTABLE_RELATION_FUNCTOR_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/relation/member_at.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/relation/member_at.hpp new file mode 100644 index 0000000000..b7385da5b6 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/relation/member_at.hpp @@ -0,0 +1,72 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file relation/member_at.hpp +/// \brief Defines the tags for the member_at::side idiom + +#ifndef BOOST_BIMAP_RELATION_MEMBER_AT_HPP +#define BOOST_BIMAP_RELATION_MEMBER_AT_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +namespace boost { +namespace bimaps { +namespace relation { + +/// \brief member_at::side idiom to access relation values and types using metaprogramming. +/** + +This tags are used to specify which member you want to access when using a metafunction over +a symmetrical type. The idea is to be able to write code like: + +\code +result_of::get<member_at::left,relation>::type data = get<member_at::left>(rel); +\endcode + +The relation class supports this idiom even when the elements are tagged. This is useful +because a user can decide to start tagging in any moment of the development. + +See also member_with_tag, is_tag_of_member_at_left, is_tag_of_member_at_right, get +value_type_of, pair_by, pair_type_by. + +\ingroup relation_group + **/ +namespace member_at { + + /// \brief Member at left tag + /** + See also member_at, right. + **/ + + struct left {}; + + /// \brief Member at right tag + /** + See also member_at, left. + **/ + + struct right {}; + + /// \brief Member info tag + /** + See also member_at, left, right. + **/ + + struct info {}; + +} + +} // namespace relation +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_RELATION_MEMBER_AT_HPP diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/relation/mutant_relation.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/relation/mutant_relation.hpp new file mode 100644 index 0000000000..1681a9d04b --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/relation/mutant_relation.hpp @@ -0,0 +1,477 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file relation/mutant_relation.hpp +/// \brief Defines the mutant_relation class + +#ifndef BOOST_BIMAP_RELATION_MUTANT_RELATION_HPP +#define BOOST_BIMAP_RELATION_MUTANT_RELATION_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/mpl/vector.hpp> +#include <boost/operators.hpp> +#include <boost/call_traits.hpp> + +#ifndef BOOST_BIMAP_DISABLE_SERIALIZATION + #include <boost/core/serialization.hpp> +#endif // BOOST_BIMAP_DISABLE_SERIALIZATION + +#include <boost/functional/hash/hash.hpp> + +#include <boost/mpl/aux_/na.hpp> + +// Boost.Bimap +#include <boost/bimap/tags/tagged.hpp> +#include <boost/bimap/tags/support/default_tagged.hpp> +#include <boost/bimap/tags/support/tag_of.hpp> +#include <boost/bimap/tags/support/value_type_of.hpp> + +#include <boost/bimap/relation/member_at.hpp> +#include <boost/bimap/relation/detail/mutant.hpp> +#include <boost/bimap/relation/structured_pair.hpp> +#include <boost/bimap/relation/symmetrical_base.hpp> +#include <boost/bimap/relation/support/get.hpp> + +namespace boost { +namespace bimaps { +namespace relation { + +namespace detail { + +// This class is included so structured_pair and mutant_relation share +// exactly the same class layout + +template< class LeftType, class RightType, bool force_mutable > +class relation_storage : + public symmetrical_base<LeftType,RightType,force_mutable> +{ + typedef symmetrical_base<LeftType,RightType,force_mutable> base_; + + typedef relation_storage storage_; + + public: + + typedef relation_storage<LeftType,RightType,false> non_mutable_storage; + + typedef ::boost::mpl::vector2 + < + relation_storage< LeftType, RightType, true >, + relation_storage< LeftType, RightType, false > + + > mutant_views; + + //@{ + /// data + BOOST_DEDUCED_TYPENAME base_::left_value_type left; + BOOST_DEDUCED_TYPENAME base_::right_value_type right; + //@} + + relation_storage() {} + + relation_storage(BOOST_DEDUCED_TYPENAME ::boost::call_traits< + BOOST_DEDUCED_TYPENAME base_::left_value_type + >::param_type l, + BOOST_DEDUCED_TYPENAME ::boost::call_traits< + BOOST_DEDUCED_TYPENAME base_::right_value_type + >::param_type r) + + : left(l), right(r) {} + + BOOST_DEDUCED_TYPENAME base_:: left_value_type & get_left() { return left; } + const BOOST_DEDUCED_TYPENAME base_:: left_value_type & get_left()const { return left; } + BOOST_DEDUCED_TYPENAME base_::right_value_type & get_right() { return right; } + const BOOST_DEDUCED_TYPENAME base_::right_value_type & get_right()const { return right; } +}; + + + +template< class TA, class TB, class Info, bool force_mutable > +class relation_info_hook : public + ::boost::bimaps::relation::detail::relation_storage<TA,TB,force_mutable> +{ + typedef ::boost::bimaps::relation::detail:: + relation_storage<TA,TB,force_mutable> base_; + + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::tags::support:: + default_tagged<Info,member_at::info>::type tagged_info_type; + + public: + typedef BOOST_DEDUCED_TYPENAME tagged_info_type::value_type info_type; + typedef BOOST_DEDUCED_TYPENAME tagged_info_type::tag info_tag; + + info_type info; + + protected: + + relation_info_hook() {} + + relation_info_hook( BOOST_DEDUCED_TYPENAME ::boost::call_traits< + BOOST_DEDUCED_TYPENAME base_::left_value_type + >::param_type l, + BOOST_DEDUCED_TYPENAME ::boost::call_traits< + BOOST_DEDUCED_TYPENAME base_::right_value_type + >::param_type r, + BOOST_DEDUCED_TYPENAME ::boost::call_traits< + info_type + >::param_type i = info_type() ) + + : base_(l,r), info(i) {} + + template< class Relation > + relation_info_hook( const Relation & rel ) : + base_(rel.left,rel.right), + info(rel.info) {} + + template< class Relation > + void change_to( const Relation & rel ) + { + base_::left = rel.left ; + base_::right = rel.right; + info = rel.info ; + } + + #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION + template< class Archive > + void serialize(Archive & ar, const unsigned int) + { + ar & ::boost::serialization::make_nvp("left" , base_::left ); + ar & ::boost::serialization::make_nvp("right", base_::right); + ar & ::boost::serialization::make_nvp("info" , info ); + } + #endif // BOOST_BIMAP_DISABLE_SERIALIZATION +}; + +template< class TA, class TB, bool force_mutable> +class relation_info_hook<TA,TB,::boost::mpl::na,force_mutable> : + public ::boost::bimaps::relation::detail::relation_storage<TA,TB,force_mutable> +{ + typedef ::boost::bimaps::relation::detail:: + relation_storage<TA,TB,force_mutable> base_; + + public: + typedef ::boost::mpl::na info_type; + typedef member_at::info info_tag; + + protected: + + relation_info_hook() {} + + relation_info_hook( BOOST_DEDUCED_TYPENAME ::boost::call_traits< + BOOST_DEDUCED_TYPENAME base_::left_value_type + >::param_type l, + BOOST_DEDUCED_TYPENAME ::boost::call_traits< + BOOST_DEDUCED_TYPENAME base_::right_value_type + >::param_type r) + + : base_(l,r) {} + + template< class Relation > + relation_info_hook( const Relation & rel ) : + base_(rel.left,rel.right) {} + + template< class Relation > + void change_to( const Relation & rel ) + { + base_::left = rel.left ; + base_::right = rel.right; + } + + #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION + template< class Archive > + void serialize(Archive & ar, const unsigned int) + { + ar & ::boost::serialization::make_nvp("left" , base_::left ); + ar & ::boost::serialization::make_nvp("right", base_::right); + } + #endif // BOOST_BIMAP_DISABLE_SERIALIZATION +}; + + +} // namespace detail + +/// \brief Abstraction of a related pair of values, that extends the std::pair class. +/** +The mutant_relation is a mutant class. A mutant class can mutate +with zero overhead in other classes that are called views. +Each view has to be StorageCompatible with the base class +of the mutant. Note that all the views have the following +storage structure: + +\verbatim + __________ + | | + | TA | + |__________| + | | + | TB | + |__________| + +\endverbatim + +See also select_relation, standard_relation. +\ingroup relation_group + **/ + + +template< class TA, class TB, class Info = ::boost::mpl::na, bool force_mutable = false > +class mutant_relation : public + ::boost::bimaps::relation::detail:: + relation_info_hook<TA,TB,Info,force_mutable> +{ + typedef ::boost::bimaps::relation::detail:: + relation_info_hook<TA,TB,Info,force_mutable> base_; + + public: + + // We have to know the type of the base where the types are + // defined because Boost.MultiIndex requires it. + + typedef ::boost::bimaps::relation::detail:: + relation_storage<TA,TB,force_mutable> storage_base; + + /// Above view, non mutable view of the relation + + typedef mutant_relation<TA,TB,Info,false> above_view; + + //@{ + /// A signature compatible std::pair that is a view of the relation. + + typedef structured_pair< TA, TB, Info, normal_layout > left_pair; + typedef structured_pair< TB, TA, Info, mirror_layout > right_pair; + //@} + + typedef ::boost::mpl::vector4 + < + left_pair, + right_pair, + + mutant_relation< TA, TB, Info, true >, + mutant_relation< TA, TB, Info, false > + + > mutant_views; + + mutant_relation() {} + + mutant_relation(BOOST_DEDUCED_TYPENAME ::boost::call_traits< + BOOST_DEDUCED_TYPENAME base_:: left_value_type + >::param_type l, + BOOST_DEDUCED_TYPENAME ::boost::call_traits< + BOOST_DEDUCED_TYPENAME base_::right_value_type + >::param_type r) : + base_(l,r) {} + + mutant_relation(BOOST_DEDUCED_TYPENAME ::boost::call_traits< + BOOST_DEDUCED_TYPENAME base_:: left_value_type + >::param_type l, + BOOST_DEDUCED_TYPENAME ::boost::call_traits< + BOOST_DEDUCED_TYPENAME base_::right_value_type + >::param_type r, + BOOST_DEDUCED_TYPENAME ::boost::call_traits< + BOOST_DEDUCED_TYPENAME base_::info_type + >::param_type i) : + base_(l,r,i) {} + + mutant_relation(const mutant_relation<TA,TB,Info,false> & rel) : + base_(rel) {} + + mutant_relation(const mutant_relation<TA,TB,Info,true> & rel) : + base_(rel) {} + + // Operators + + template< bool FM > + mutant_relation& operator=(const mutant_relation<TA,TB,Info,FM> & rel) + { + base_::change_to(rel); + return *this; + } + + // The following functions are redundant if you only consider this class. + // They are included to make easier the construction of the get and the + // pair_by metafunction. Remember that not all compiler supports the mutant + // idiom. + + left_pair & get_left_pair() + { + return ::boost::bimaps::relation::detail::mutate<left_pair>(*this); + } + + const left_pair & get_left_pair() const + { + return ::boost::bimaps::relation::detail::mutate<left_pair>(*this); + } + + right_pair & get_right_pair() + { + return ::boost::bimaps::relation::detail::mutate<right_pair>(*this); + } + + const right_pair & get_right_pair() const + { + return ::boost::bimaps::relation::detail::mutate<right_pair>(*this); + } + + above_view & get_view() + { + return ::boost::bimaps::relation::detail::mutate<above_view>(*this); + } + + const above_view & get_view() const + { + return ::boost::bimaps::relation::detail::mutate<above_view>(*this); + } + + template< class Tag > + const BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support:: + result_of::get<Tag,const mutant_relation>::type + get() const + { + return ::boost::bimaps::relation::support::get<Tag>(*this); + } + + template< class Tag > + BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support:: + result_of::get<Tag,mutant_relation>::type + get() + { + return ::boost::bimaps::relation::support::get<Tag>(*this); + } + + #ifndef BOOST_BIMAP_DISABLE_SERIALIZATION + + private: + friend class ::boost::serialization::access; + + template<class Archive> + void serialize(Archive & ar, const unsigned int version) + { + base_::serialize(ar,version); + } + + #endif // BOOST_BIMAP_DISABLE_SERIALIZATION +}; + +// hash value + +template< class FirstType, class SecondType, bool FM > +std::size_t hash_value(const detail::relation_storage<FirstType,SecondType,FM> & r) +{ + std::size_t seed = 0; + ::boost::hash_combine(seed, r. left ); + ::boost::hash_combine(seed, r.right ); + + return seed; +} + +// mutant_relation - mutant_relation + +template< class FirstType, class SecondType, bool FM1, bool FM2 > +bool operator==(const detail::relation_storage<FirstType,SecondType,FM1> & a, + const detail::relation_storage<FirstType,SecondType,FM2> & b) +{ + return ( ( a.left == b.left ) && + ( a.right == b.right ) ); +} + +template< class FirstType, class SecondType, bool FM1, bool FM2 > +bool operator!=(const detail::relation_storage<FirstType,SecondType,FM1> & a, + const detail::relation_storage<FirstType,SecondType,FM2> & b) +{ + return ! ( a == b ); +} + +template< class FirstType, class SecondType, bool FM1, bool FM2 > +bool operator<(const detail::relation_storage<FirstType,SecondType,FM1> & a, + const detail::relation_storage<FirstType,SecondType,FM2> & b) +{ + return ( ( a.left < b.left ) || + (( a.left == b.left ) && ( a.right < b.right ))); +} + +template< class FirstType, class SecondType, bool FM1, bool FM2 > +bool operator<=(const detail::relation_storage<FirstType,SecondType,FM1> & a, + const detail::relation_storage<FirstType,SecondType,FM2> & b) +{ + return ( ( a.left < b.left ) || + (( a.left == b.left ) && ( a.right <= b.right ))); +} + +template< class FirstType, class SecondType, bool FM1, bool FM2 > +bool operator>(const detail::relation_storage<FirstType,SecondType,FM1> & a, + const detail::relation_storage<FirstType,SecondType,FM2> & b) +{ + return ( ( a.left > b.left ) || + (( a.left == b.left ) && ( a.right > b.right ))); +} + +template< class FirstType, class SecondType, bool FM1, bool FM2 > +bool operator>=(const detail::relation_storage<FirstType,SecondType,FM1> & a, + const detail::relation_storage<FirstType,SecondType,FM2> & b) +{ + return ( ( a.left > b.left ) || + (( a.left == b.left ) && ( a.right >= b.right ))); +} + +namespace detail { + +template< class TA, class TB, class Info, bool force_mutable> +mutant_relation<TA,TB,Info,force_mutable> + copy_with_left_replaced(mutant_relation<TA,TB,Info,force_mutable> const& rel, + BOOST_DEDUCED_TYPENAME ::boost::call_traits< BOOST_DEDUCED_TYPENAME + mutant_relation<TA,TB,Info,force_mutable>::left_value_type> + ::param_type l) +{ + return mutant_relation<TA,TB,Info,force_mutable>(l,rel.right,rel.info); +} + +template< class TA, class TB, bool force_mutable> +mutant_relation<TA,TB,::boost::mpl::na,force_mutable> + copy_with_left_replaced(mutant_relation<TA,TB,::boost::mpl::na,force_mutable> const& rel, + BOOST_DEDUCED_TYPENAME ::boost::call_traits< BOOST_DEDUCED_TYPENAME + mutant_relation<TA,TB,::boost::mpl::na,force_mutable>::left_value_type> + ::param_type l) +{ + return mutant_relation<TA,TB,::boost::mpl::na,force_mutable>(l,rel.right); +} + +template< class TA, class TB, class Info, bool force_mutable> +mutant_relation<TA,TB,Info,force_mutable> + copy_with_right_replaced(mutant_relation<TA,TB,Info,force_mutable> const& rel, + BOOST_DEDUCED_TYPENAME ::boost::call_traits< BOOST_DEDUCED_TYPENAME + mutant_relation<TA,TB,Info,force_mutable>::right_value_type> + ::param_type r) +{ + return mutant_relation<TA,TB,Info,force_mutable>(rel.left,r,rel.info); +} + +template< class TA, class TB, bool force_mutable> +mutant_relation<TA,TB,::boost::mpl::na,force_mutable> + copy_with_right_replaced(mutant_relation<TA,TB,::boost::mpl::na,force_mutable> const& rel, + BOOST_DEDUCED_TYPENAME ::boost::call_traits< BOOST_DEDUCED_TYPENAME + mutant_relation<TA,TB,::boost::mpl::na,force_mutable>::right_value_type> + ::param_type r) +{ + return mutant_relation<TA,TB,::boost::mpl::na,force_mutable>(rel.left,r); +} + +} // namespace detail + +} // namespace relation +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_RELATION_MUTANT_RELATION_HPP + + + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/relation/pair_layout.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/relation/pair_layout.hpp new file mode 100644 index 0000000000..d012b9f455 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/relation/pair_layout.hpp @@ -0,0 +1,72 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file relation/pair_layout.hpp +/// \brief Tags for pair layouts + +#ifndef BOOST_BIMAP_RELATION_PAIR_LAYOUT_HPP +#define BOOST_BIMAP_RELATION_PAIR_LAYOUT_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +namespace boost { +namespace bimaps { +namespace relation { + +//@{ + +/// \brief Tag for normal layout. ( A,B -> A,B ) + +struct normal_layout {}; + +/// \brief Tag for mirror layout. ( A,B -> B,A ) + +struct mirror_layout {}; + +//@} + +/** \struct boost::bimaps::relation::inverse_layout +\brief Metafunction to obtain the inverse of a layout. + +\code +template< class Layout > +struct inverse_layout +{ + typedef {InverseLayout} type; +}; +\endcode + +See also normal_layout, mirror_layout. + **/ + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +template< class Layout > +struct inverse_layout +{ + typedef normal_layout type; +}; + +template<> +struct inverse_layout< normal_layout > +{ + typedef mirror_layout type; +}; + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +} // namespace relation +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_RELATION_DETAIL_PAIR_LAYOUT_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/relation/structured_pair.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/relation/structured_pair.hpp new file mode 100644 index 0000000000..4ccd56f14d --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/relation/structured_pair.hpp @@ -0,0 +1,552 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file relation/structured_pair.hpp +/// \brief Defines the structured_pair class. + +#ifndef BOOST_BIMAP_RELATION_STRUCTURED_PAIR_HPP +#define BOOST_BIMAP_RELATION_STRUCTURED_PAIR_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <utility> + +#include <boost/type_traits/remove_const.hpp> + +#include <boost/mpl/aux_/na.hpp> + +#include <boost/call_traits.hpp> + +#include <boost/core/enable_if.hpp> +#include <boost/type_traits/is_same.hpp> +#include <boost/mpl/if.hpp> +#include <boost/mpl/vector.hpp> + +#include <boost/bimap/detail/debug/static_error.hpp> +#include <boost/bimap/relation/pair_layout.hpp> +#include <boost/bimap/relation/symmetrical_base.hpp> +#include <boost/bimap/relation/support/get.hpp> +#include <boost/bimap/tags/support/value_type_of.hpp> + + + +namespace boost { +namespace bimaps { +namespace relation { + +namespace detail { + +/// \brief Storage definition of the left view of a mutant relation. +/** + +See also storage_finder, mirror_storage. + **/ + +template< class FirstType, class SecondType > +class normal_storage : + public symmetrical_base<FirstType,SecondType> +{ + typedef symmetrical_base<FirstType,SecondType> base_; + + public: + + typedef normal_storage storage_; + + typedef BOOST_DEDUCED_TYPENAME base_::left_value_type first_type; + typedef BOOST_DEDUCED_TYPENAME base_::right_value_type second_type; + + first_type first; + second_type second; + + normal_storage() {} + + normal_storage(BOOST_DEDUCED_TYPENAME ::boost::call_traits< + first_type >::param_type f, + BOOST_DEDUCED_TYPENAME ::boost::call_traits< + second_type>::param_type s) + + : first(f), second(s) {} + + BOOST_DEDUCED_TYPENAME base_:: left_value_type & get_left() { return first; } + const BOOST_DEDUCED_TYPENAME base_:: left_value_type & get_left()const { return first; } + BOOST_DEDUCED_TYPENAME base_::right_value_type & get_right() { return second; } + const BOOST_DEDUCED_TYPENAME base_::right_value_type & get_right()const { return second; } +}; + +/// \brief Storage definition of the right view of a mutant relation. +/** + +See also storage_finder, normal_storage. + **/ + +template< class FirstType, class SecondType > +class mirror_storage : + public symmetrical_base<SecondType,FirstType> +{ + typedef symmetrical_base<SecondType,FirstType> base_; + + public: + + typedef mirror_storage storage_; + + typedef BOOST_DEDUCED_TYPENAME base_::left_value_type second_type; + typedef BOOST_DEDUCED_TYPENAME base_::right_value_type first_type; + + second_type second; + first_type first; + + mirror_storage() {} + + mirror_storage(BOOST_DEDUCED_TYPENAME ::boost::call_traits<first_type >::param_type f, + BOOST_DEDUCED_TYPENAME ::boost::call_traits<second_type >::param_type s) + + : second(s), first(f) {} + + BOOST_DEDUCED_TYPENAME base_:: left_value_type & get_left() { return second; } + const BOOST_DEDUCED_TYPENAME base_:: left_value_type & get_left()const { return second; } + BOOST_DEDUCED_TYPENAME base_::right_value_type & get_right() { return first; } + const BOOST_DEDUCED_TYPENAME base_::right_value_type & get_right()const { return first; } +}; + +/** \struct boost::bimaps::relation::storage_finder +\brief Obtain the a storage with the correct layout. + +\code +template< class FirstType, class SecondType, class Layout > +struct storage_finder +{ + typedef {normal/mirror}_storage<FirstType,SecondType> type; +}; +\endcode + +See also normal_storage, mirror_storage. + **/ + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +template +< + class FirstType, + class SecondType, + class Layout +> +struct storage_finder +{ + typedef normal_storage<FirstType,SecondType> type; +}; + +template +< + class FirstType, + class SecondType +> +struct storage_finder<FirstType,SecondType,mirror_layout> +{ + typedef mirror_storage<FirstType,SecondType> type; +}; + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + + +template< class TA, class TB, class Info, class Layout > +class pair_info_hook : + public ::boost::bimaps::relation::detail::storage_finder<TA,TB,Layout>::type +{ + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::detail::storage_finder<TA,TB,Layout>::type base_; + + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::tags::support:: + default_tagged<Info,member_at::info>::type tagged_info_type; + + public: + typedef BOOST_DEDUCED_TYPENAME tagged_info_type::value_type info_type; + typedef BOOST_DEDUCED_TYPENAME tagged_info_type::tag info_tag; + + info_type info; + + protected: + + pair_info_hook() {} + + pair_info_hook( BOOST_DEDUCED_TYPENAME ::boost::call_traits< + BOOST_DEDUCED_TYPENAME base_::first_type + >::param_type f, + BOOST_DEDUCED_TYPENAME ::boost::call_traits< + BOOST_DEDUCED_TYPENAME base_::second_type + >::param_type s, + BOOST_DEDUCED_TYPENAME ::boost::call_traits< + info_type + >::param_type i = info_type() ) + : base_(f,s), info(i) {} + + template< class Pair > + pair_info_hook( const Pair & p) : + base_(p.first,p.second), + info(p.info) {} + + template< class Pair > + void change_to( const Pair & p ) + { + base_::first = p.first ; + base_::second = p.second; + info = p.info ; + } + + void clear_info() + { + info = info_type(); + }; +}; + +template< class TA, class TB, class Layout> +class pair_info_hook<TA,TB,::boost::mpl::na,Layout> : + public ::boost::bimaps::relation::detail::storage_finder<TA,TB,Layout>::type +{ + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::detail::storage_finder<TA,TB,Layout>::type base_; + + public: + typedef ::boost::mpl::na info_type; + typedef member_at::info info_tag; + + protected: + + pair_info_hook() {} + + pair_info_hook( BOOST_DEDUCED_TYPENAME ::boost::call_traits< + BOOST_DEDUCED_TYPENAME base_::first_type + >::param_type f, + BOOST_DEDUCED_TYPENAME ::boost::call_traits< + BOOST_DEDUCED_TYPENAME base_::second_type + >::param_type s) + + : base_(f,s) {} + + template< class Pair > + pair_info_hook( const Pair & p ) : + base_(p.first,p.second) {} + + template< class Pair > + void change_to( const Pair & p ) + { + base_::first = p.first ; + base_::second = p.second; + } + + void clear_info() {}; +}; + + + +} // namespace detail + +template< class TA, class TB, class Info, bool FM > +class mutant_relation; + + +/// \brief A std::pair signature compatible class that allows you to control +/// the internal structure of the data. +/** +This class allows you to specify the order in which the two data types will be +in the layout of the class. + **/ + +template< class FirstType, class SecondType, class Info, class Layout = normal_layout > +class structured_pair : + + public ::boost::bimaps::relation::detail::pair_info_hook + < + FirstType, SecondType, + Info, + Layout + + > + +{ + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::detail::pair_info_hook + < + FirstType, SecondType, + Info, + Layout + + > base_; + + public: + + typedef ::boost::mpl::vector3< + structured_pair< FirstType, SecondType, Info, normal_layout >, + structured_pair< FirstType, SecondType, Info, mirror_layout >, + BOOST_DEDUCED_TYPENAME ::boost::mpl::if_< + BOOST_DEDUCED_TYPENAME ::boost::is_same<Layout, normal_layout>::type, + mutant_relation< FirstType, SecondType, Info, true >, + mutant_relation< SecondType, FirstType, Info, true > + >::type + + > mutant_views; + + structured_pair() {} + + structured_pair(BOOST_DEDUCED_TYPENAME boost::call_traits< + BOOST_DEDUCED_TYPENAME base_::first_type >::param_type f, + BOOST_DEDUCED_TYPENAME boost::call_traits< + BOOST_DEDUCED_TYPENAME base_::second_type >::param_type s) + : base_(f,s) {} + + structured_pair(BOOST_DEDUCED_TYPENAME boost::call_traits< + BOOST_DEDUCED_TYPENAME base_::first_type >::param_type f, + BOOST_DEDUCED_TYPENAME boost::call_traits< + BOOST_DEDUCED_TYPENAME base_::second_type >::param_type s, + BOOST_DEDUCED_TYPENAME boost::call_traits< + BOOST_DEDUCED_TYPENAME base_::info_type >::param_type i) + : base_(f,s,i) {} + + template< class OtherLayout > + structured_pair( + const structured_pair<FirstType,SecondType,Info,OtherLayout> & p) + : base_(p) {} + + template< class OtherLayout > + structured_pair& operator=( + const structured_pair<FirstType,SecondType,OtherLayout> & p) + { + base_::change_to(p); + return *this; + } + + template< class First, class Second > + structured_pair(const std::pair<First,Second> & p) : + base_(p.first,p.second) + {} + + template< class First, class Second > + structured_pair& operator=(const std::pair<First,Second> & p) + { + base_::first = p.first; + base_::second = p.second; + base_::clear_info(); + return *this; + } + + template< class Tag > + const BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support:: + result_of::get<Tag,const structured_pair>::type + get() const + { + return ::boost::bimaps::relation::support::get<Tag>(*this); + } + + template< class Tag > + BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support:: + result_of::get<Tag,structured_pair>::type + get() + { + return ::boost::bimaps::relation::support::get<Tag>(*this); + } +}; + +// structured_pair - structured_pair + +template< class FirstType, class SecondType, class Info, class Layout1, class Layout2 > +bool operator==(const structured_pair<FirstType,SecondType,Info,Layout1> & a, + const structured_pair<FirstType,SecondType,Info,Layout2> & b) +{ + return ( ( a.first == b.first ) && + ( a.second == b.second ) ); +} + +template< class FirstType, class SecondType, class Info, class Layout1, class Layout2 > +bool operator!=(const structured_pair<FirstType,SecondType,Info,Layout1> & a, + const structured_pair<FirstType,SecondType,Info,Layout2> & b) +{ + return ! ( a == b ); +} + +template< class FirstType, class SecondType, class Info, class Layout1, class Layout2 > +bool operator<(const structured_pair<FirstType,SecondType,Info,Layout1> & a, + const structured_pair<FirstType,SecondType,Info,Layout2> & b) +{ + return ( ( a.first < b.first ) || + (( a.first == b.first ) && ( a.second < b.second ))); +} + +template< class FirstType, class SecondType, class Info, class Layout1, class Layout2 > +bool operator<=(const structured_pair<FirstType,SecondType,Info,Layout1> & a, + const structured_pair<FirstType,SecondType,Info,Layout2> & b) +{ + return ( ( a.first < b.first ) || + (( a.first == b.first ) && ( a.second <= b.second ))); +} + +template< class FirstType, class SecondType, class Info, class Layout1, class Layout2 > +bool operator>(const structured_pair<FirstType,SecondType,Info,Layout1> & a, + const structured_pair<FirstType,SecondType,Info,Layout2> & b) +{ + return ( ( a.first > b.first ) || + (( a.first == b.first ) && ( a.second > b.second ))); +} + +template< class FirstType, class SecondType, class Info, class Layout1, class Layout2 > +bool operator>=(const structured_pair<FirstType,SecondType,Info,Layout1> & a, + const structured_pair<FirstType,SecondType,Info,Layout2> & b) +{ + return ( ( a.first > b.first ) || + (( a.first == b.first ) && ( a.second >= b.second ))); +} + +// structured_pair - std::pair + +template< class FirstType, class SecondType, class Info, class Layout, class F, class S > +bool operator==(const structured_pair<FirstType,SecondType,Info,Layout> & a, + const std::pair<F,S> & b) +{ + return ( ( a.first == b.first ) && + ( a.second == b.second ) ); +} + +template< class FirstType, class SecondType, class Info, class Layout, class F, class S > +bool operator!=(const structured_pair<FirstType,SecondType,Info,Layout> & a, + const std::pair<F,S> & b) +{ + return ! ( a == b ); +} + +template< class FirstType, class SecondType, class Info, class Layout, class F, class S > +bool operator<(const structured_pair<FirstType,SecondType,Info,Layout> & a, + const std::pair<F,S> & b) +{ + return ( ( a.first < b.first ) || + (( a.first == b.first ) && ( a.second < b.second ))); +} + +template< class FirstType, class SecondType, class Info, class Layout, class F, class S > +bool operator<=(const structured_pair<FirstType,SecondType,Info,Layout> & a, + const std::pair<F,S> & b) +{ + return ( ( a.first < b.first ) || + (( a.first == b.first ) && ( a.second <= b.second ))); +} + +template< class FirstType, class SecondType, class Info, class Layout, class F, class S > +bool operator>(const structured_pair<FirstType,SecondType,Info,Layout> & a, + const std::pair<F,S> & b) +{ + return ( ( a.first > b.first ) || + (( a.first == b.first ) && ( a.second > b.second ))); +} + +template< class FirstType, class SecondType, class Info, class Layout, class F, class S > +bool operator>=(const structured_pair<FirstType,SecondType,Info,Layout> & a, + const std::pair<F,S> & b) +{ + return ( ( a.first > b.first ) || + (( a.first == b.first ) && ( a.second >= b.second ))); +} + +// std::pair - sturctured_pair + +template< class FirstType, class SecondType, class Info, class Layout, class F, class S > +bool operator==(const std::pair<F,S> & a, + const structured_pair<FirstType,SecondType,Info,Layout> & b) +{ + return ( ( a.first == b.first ) && + ( a.second == b.second ) ); +} + +template< class FirstType, class SecondType, class Info, class Layout, class F, class S > +bool operator!=(const std::pair<F,S> & a, + const structured_pair<FirstType,SecondType,Info,Layout> & b) +{ + return ! ( a == b ); +} + +template< class FirstType, class SecondType, class Info, class Layout, class F, class S > +bool operator<(const std::pair<F,S> & a, + const structured_pair<FirstType,SecondType,Info,Layout> & b) +{ + return ( ( a.first < b.first ) || + (( a.first == b.first ) && ( a.second < b.second ))); +} + +template< class FirstType, class SecondType, class Info, class Layout, class F, class S > +bool operator<=(const std::pair<F,S> & a, + const structured_pair<FirstType,SecondType,Info,Layout> & b) +{ + return ( ( a.first < b.first ) || + (( a.first == b.first ) && ( a.second <= b.second ))); +} + +template< class FirstType, class SecondType, class Info, class Layout, class F, class S > +bool operator>(const std::pair<F,S> & a, + const structured_pair<FirstType,SecondType,Info,Layout> & b) +{ + return ( ( a.first > b.first ) || + (( a.first == b.first ) && ( a.second > b.second ))); +} + +template< class FirstType, class SecondType, class Info, class Layout, class F, class S > +bool operator>=(const std::pair<F,S> & a, + const structured_pair<FirstType,SecondType,Info,Layout> & b) +{ + return ( ( a.first > b.first ) || + (( a.first == b.first ) && ( a.second >= b.second ))); +} + + +namespace detail { + +template< class FirstType, class SecondType, class Info, class Layout> +structured_pair<FirstType,SecondType,Info,Layout> + copy_with_first_replaced(structured_pair<FirstType,SecondType,Info,Layout> const& p, + BOOST_DEDUCED_TYPENAME ::boost::call_traits< BOOST_DEDUCED_TYPENAME + structured_pair<FirstType,SecondType,Info,Layout>::first_type> + ::param_type f) +{ + return structured_pair<FirstType,SecondType,Info,Layout>(f,p.second,p.info); +} + +template< class FirstType, class SecondType, class Layout> +structured_pair<FirstType,SecondType,::boost::mpl::na,Layout> + copy_with_first_replaced(structured_pair<FirstType,SecondType,::boost::mpl::na,Layout> const& p, + BOOST_DEDUCED_TYPENAME ::boost::call_traits< BOOST_DEDUCED_TYPENAME + structured_pair<FirstType,SecondType,::boost::mpl::na,Layout>::first_type> + ::param_type f) +{ + return structured_pair<FirstType,SecondType,::boost::mpl::na,Layout>(f,p.second); +} + +template< class FirstType, class SecondType, class Info, class Layout> +structured_pair<FirstType,SecondType,Info,Layout> + copy_with_second_replaced(structured_pair<FirstType,SecondType,Info,Layout> const& p, + BOOST_DEDUCED_TYPENAME ::boost::call_traits< BOOST_DEDUCED_TYPENAME + structured_pair<FirstType,SecondType,Info,Layout>::second_type> + ::param_type s) +{ + return structured_pair<FirstType,SecondType,Info,Layout>(p.first,s,p.info); +} + +template< class FirstType, class SecondType, class Layout> +structured_pair<FirstType,SecondType,::boost::mpl::na,Layout> + copy_with_second_replaced(structured_pair<FirstType,SecondType,::boost::mpl::na,Layout> const& p, + BOOST_DEDUCED_TYPENAME ::boost::call_traits< BOOST_DEDUCED_TYPENAME + structured_pair<FirstType,SecondType,::boost::mpl::na,Layout>::second_type> + ::param_type s) +{ + return structured_pair<FirstType,SecondType,::boost::mpl::na,Layout>(p.first,s); +} + +} // namespace detail + + +} // namespace relation +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_RELATION_STRUCTURED_PAIR_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/relation/support/data_extractor.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/relation/support/data_extractor.hpp new file mode 100644 index 0000000000..a7e7f32d5d --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/relation/support/data_extractor.hpp @@ -0,0 +1,113 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file relation/support/data_extractor.hpp +/// \brief Data extraction functor. + +#ifndef BOOST_BIMAP_RELATION_SUPPORT_DATA_EXTRACTOR_HPP +#define BOOST_BIMAP_RELATION_SUPPORT_DATA_EXTRACTOR_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/relation/detail/metadata_access_builder.hpp> + +/** \struct boost::bimaps::relation::support::data_extractor + +\brief Data extraction functor. + +\ingroup relation_group + **/ + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +namespace boost { +namespace bimaps { +namespace relation { +namespace support { + +template< class Tag, class Relation > +struct data_extractor_implementation; + +template< class Relation > +struct data_extractor_implementation< member_at::left, Relation > +{ + typedef Relation argument_type; + typedef BOOST_DEDUCED_TYPENAME Relation::left_value_type result_type; + + BOOST_DEDUCED_TYPENAME Relation::left_value_type const & + operator()(Relation const & rel) const + { + return rel.left; + } + + BOOST_DEDUCED_TYPENAME Relation::left_value_type & + operator()(Relation & rel) const + { + return rel.left; + } +}; + +template< class Relation > +struct data_extractor_implementation< member_at::right, Relation > +{ + typedef Relation argument_type; + typedef BOOST_DEDUCED_TYPENAME Relation::right_value_type result_type; + + BOOST_DEDUCED_TYPENAME Relation::right_value_type const & + operator()(Relation const & rel) const + { + return rel.right; + } + + BOOST_DEDUCED_TYPENAME Relation::right_value_type & + operator()(Relation & rel) const + { + return rel.right; + } +}; + +template< class Tag, class Relation > +struct data_extractor +{ + typedef data_extractor_implementation + < + BOOST_DEDUCED_TYPENAME member_with_tag<Tag,Relation>::type, + Relation + + > type; +}; + +template< class Relation > +struct both_keys_extractor +{ + typedef BOOST_DEDUCED_TYPENAME Relation::storage_base result_type; + + const result_type & operator()(const Relation & rel) const + { + return rel; + } + + result_type & operator()( Relation & rel) const + { + return rel; + } +}; + +} // namespace support +} // namespace relation +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +#endif // BOOST_BIMAP_RELATION_SUPPORT_DATA_EXTRACTOR_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/relation/support/get.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/relation/support/get.hpp new file mode 100644 index 0000000000..e205beb75a --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/relation/support/get.hpp @@ -0,0 +1,140 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file relation/support/get.hpp +/// \brief get<tag>(r) function + +#ifndef BOOST_BIMAP_RELATION_SUPPORT_GET_HPP +#define BOOST_BIMAP_RELATION_SUPPORT_GET_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/relation/support/value_type_of.hpp> + +#include <boost/bimap/relation/detail/access_builder.hpp> + +#include <boost/mpl/if.hpp> +#include <boost/type_traits/is_same.hpp> +#include <boost/type_traits/is_const.hpp> + +#ifdef BOOST_BIMAP_ONLY_DOXYGEN_WILL_PROCESS_THE_FOLLOWING_LINES + + +namespace boost { +namespace bimaps { +namespace relation { +namespace support { + +/** \brief Gets a pair view of the relation. + +\ingroup relation_group + **/ + +template< class Tag, class SymmetricType > +BOOST_DEDUCED_TYPENAME result_of::get<Tag,SymmetricType>::type + get( SymmetricType & ); + +} // namespace support +} // namespace relation +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_ONLY_DOXYGEN_WILL_PROCESS_THE_FOLLOWING_LINES + + + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +namespace boost { +namespace bimaps { +namespace relation { +namespace support { + +// Since it is very error-prone to directly write the hole bunch +// of relation accesor. They are built from little macro blocks that +// are both more readable, leading to self docummenting code and a +// lot more easier to understand and maintain. +// It is very important to note that the three building blocks have +// to laid in the same namespace in order to work. There is also +// important to keep them in order. +// The forward declaration are not necessary but they help a lot to +// the reader, as they undercover what is the signature of the +// result code. +// In the end, it is not quicker to do it in this way because you +// write a lot. But this code has no complexity at all and almost +// every word writed is for documentation. + +// Result of +// ------------------------------------------------------------------------- +/* + namespace result_of { + + template< class Tag, class Relation > + struct get<Tag,Relation>; + { + typedef -unspecified- type; + }; + + } // namespace result_of + +*/ + +BOOST_BIMAP_SYMMETRIC_ACCESS_RESULT_OF_BUILDER +( + get, + value_type_of +) + + + +// Implementation +// ------------------------------------------------------------------------- + +BOOST_BIMAP_SYMMETRIC_ACCESS_IMPLEMENTATION_BUILDER +( + get, + SymmetricType, + st, + return st.get_left(), + return st.get_right() +) + +namespace detail { + +template< class SymmetricType > +BOOST_DEDUCED_TYPENAME result_of::get< + ::boost::bimaps::relation::member_at::info, SymmetricType >::type +get(::boost::bimaps::relation::member_at::info, SymmetricType & rel) +{ + return rel.info; +} + +} // namespace detail + +// Interface +//---------------------------------------------------------------------------- + +BOOST_BIMAP_SYMMETRIC_ACCESS_INTERFACE_BUILDER +( + get +) + + +} // namespace support +} // namespace relation +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +#endif // BOOST_BIMAP_RELATION_SUPPORT_GET_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/relation/support/get_pair_functor.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/relation/support/get_pair_functor.hpp new file mode 100644 index 0000000000..c3236279de --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/relation/support/get_pair_functor.hpp @@ -0,0 +1,85 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file relation/support/get_pair_functor.hpp +/// \brief get_pair_functor definition + +#ifndef BOOST_BIMAP_RELATION_SUPPORT_GET_PAIR_FUNCTOR_HPP +#define BOOST_BIMAP_RELATION_SUPPORT_GET_PAIR_FUNCTOR_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/relation/support/pair_by.hpp> + +namespace boost { +namespace bimaps { +namespace relation { +namespace support { + +/// \brief A Functor that takes a relation as a parameter an return the desired view. +/** + +This functor is included to help users of the relation class when using +stl algorithms. + +See also member_at, pair_by(). +\ingroup relation_group + + **/ + +template< class Tag, class Relation > +struct get_pair_functor +{ + BOOST_DEDUCED_TYPENAME result_of::pair_by<Tag,Relation>::type + operator()( Relation & r ) const + { + return pair_by<Tag>(r); + } + + BOOST_DEDUCED_TYPENAME result_of::pair_by<Tag,const Relation>::type + operator()( const Relation & r ) const + { + return pair_by<Tag>(r); + } +}; + + +/// \brief A Functor that takes a relation as a parameter an return the above view. +/** + +\ingroup relation_group + **/ + +template< class Relation > +struct get_above_view_functor +{ + BOOST_DEDUCED_TYPENAME Relation::above_view & + operator()( Relation & r ) const + { + return r.get_view(); + } + + const BOOST_DEDUCED_TYPENAME Relation::above_view & + operator()( const Relation & r ) const + { + return r.get_view(); + } +}; + +} // namespace support +} // namespace relation +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_RELATION_SUPPORT_GET_PAIR_FUNCTOR_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/relation/support/is_tag_of_member_at.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/relation/support/is_tag_of_member_at.hpp new file mode 100644 index 0000000000..c6ff1173fb --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/relation/support/is_tag_of_member_at.hpp @@ -0,0 +1,181 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file relation/support/is_tag_of_member_at.hpp +/// \brief is_tag_of_member_at<tag,relation> metafunction + +#ifndef BOOST_BIMAP_RELATION_SUPPORT_IS_TAG_OF_MEMBER_AT_HPP +#define BOOST_BIMAP_RELATION_SUPPORT_IS_TAG_OF_MEMBER_AT_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/relation/member_at.hpp> +#include <boost/type_traits/is_same.hpp> + +#include <boost/mpl/bool.hpp> +#include <boost/core/enable_if.hpp> +#include <boost/bimap/relation/support/member_with_tag.hpp> + +/** \struct boost::bimaps::relation::support::is_tag_of_member_at_left + +\brief Metafunction to test if a user tag is referring to the left member. + +\code + +template< class Tag, class Relation > +struct is_tag_of_member_at_left : {true_|false_} {}; + +\endcode + +This metafunction is somewhat redundant with member_with_tag, but it is included +because it is a lot easier to metaprogram with it. The result type is the +same that: + +\code + + is_same< member_with_tag<Tag,Relation>::type , member_at::left >::type + +\endcode + +See also member_with_tag, member_at, is_tag_of_member_at_right. +\ingroup relation_group + **/ + + +/** \struct boost::bimaps::relation::support::is_tag_of_member_at_right + +\brief Metafunction to test if a user tag is referring to the left member. + +\code + +template< class Tag, class Relation > +struct is_tag_of_member_at_right : {true_|false_} {}; + +\endcode + +This metafunction is somewhat redundat with member_with_tag, but it is included +because it is a lot easier to metaprogram with it. The result type is the +same that: + +\code + + is_same< member_with_tag<Tag,Relation>::type , member_at::right >::type + +\endcode + +See also member_with_tag, member_at, is_tag_of_member_at_left. +\ingroup relation_group + **/ + + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +namespace boost { +namespace bimaps { +namespace relation { +namespace support { + +// Metafunction is_tag_of_member_at_left +// Easiear metaprogramming + +template +< + class Tag, + class Relation, + class Enable = void +> +struct is_tag_of_member_at_left : + ::boost::mpl::false_ {}; + +template< class Tag, class Relation > +struct is_tag_of_member_at_left +< + Tag, Relation, + BOOST_DEDUCED_TYPENAME enable_if + < + is_same + < + BOOST_DEDUCED_TYPENAME member_with_tag<Tag,Relation>::type, + member_at::left + > + + >::type +> : + ::boost::mpl::true_ {}; + +// Metafunction is_tag_of_member_at_right +// Easiear metaprogramming + +template +< + class Tag, + class Relation, + class Enable = void +> +struct is_tag_of_member_at_right : + ::boost::mpl::false_ {}; + +template< class Tag, class Relation > +struct is_tag_of_member_at_right +< + Tag, Relation, + BOOST_DEDUCED_TYPENAME enable_if + < + is_same + < + BOOST_DEDUCED_TYPENAME member_with_tag<Tag,Relation>::type, + member_at::right + > + + >::type +> : + ::boost::mpl::true_ {}; + + +// Metafunction is_tag_of_member_at_info +// Easiear metaprogramming + +template +< + class Tag, + class Relation, + class Enable = void +> +struct is_tag_of_member_at_info : + ::boost::mpl::false_ {}; + +template< class Tag, class Relation > +struct is_tag_of_member_at_info +< + Tag, Relation, + BOOST_DEDUCED_TYPENAME enable_if + < + is_same + < + BOOST_DEDUCED_TYPENAME member_with_tag<Tag,Relation>::type, + member_at::info + > + + >::type +> : + ::boost::mpl::true_ {}; + +} // namespace support +} // namespace relation +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +#endif // BOOST_BIMAP_RELATION_SUPPORT_IS_TAG_OF_MEMBER_AT_HPP + + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/relation/support/member_with_tag.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/relation/support/member_with_tag.hpp new file mode 100644 index 0000000000..4a509370da --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/relation/support/member_with_tag.hpp @@ -0,0 +1,180 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file relation/support/member_with_tag.hpp +/// \brief member_with_tag<tag,relation> metafunction + +#ifndef BOOST_BIMAP_RELATION_SUPPORT_MEMBER_WITH_TAG_HPP +#define BOOST_BIMAP_RELATION_SUPPORT_MEMBER_WITH_TAG_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/relation/member_at.hpp> +#include <boost/bimap/detail/debug/static_error.hpp> +#include <boost/core/enable_if.hpp> +#include <boost/type_traits/is_same.hpp> +#include <boost/mpl/bool.hpp> +#include <boost/mpl/not.hpp> +#include <boost/mpl/and.hpp> + +/** \struct boost::bimaps::relation::support::member_with_tag + +\brief Metafunction to convert user tags to the member_at idiom. + +\code + +template< class Tag, class Relation > +struct member_with_tag +{ + typedef member_at::{side} type; +}; + +\endcode + +We have to allow that all the metafunctions that works with tags +and retrieves data from a Relation will work with member_at idiom +even if the type was tagged. This will be great for the user, +because he can choose to tag a member after he is using the +relation and the code will still work. + +If we perform this check in every metafunction it will be very +tedious and error prone, so instead of that all metafunctions +that works with relations first call this metafunction that +convert the tag to a member_at tag. + +See also member_at, is_tag_of_member_at_left, is_tag_of_member_at_right. +\ingroup relation_group + **/ + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +namespace boost { +namespace bimaps { +namespace relation { +namespace support { + +template +< + class Tag, + class Relation, + class Enable = void +> +struct member_with_tag +{ + BOOST_BIMAP_STATIC_ERROR( MEMBER_WITH_TAG_FAILURE, (Relation,Tag) ); +}; + +template< class Relation > +struct member_with_tag +< + member_at::left, Relation, void +> +{ + typedef member_at::left type; +}; + +template< class Relation > +struct member_with_tag +< + member_at::right, Relation, void +> +{ + typedef member_at::right type; +}; + +template< class Relation > +struct member_with_tag +< + member_at::info, Relation, void +> +{ + typedef member_at::info type; +}; + + +template< class Tag, class Relation > +struct member_with_tag +< + Tag, Relation, + BOOST_DEDUCED_TYPENAME enable_if + < + mpl::and_ + < + mpl::not_< is_same<Tag,member_at::left> >, + is_same + < + Tag, + BOOST_DEDUCED_TYPENAME Relation::left_tag + > + > + + >::type +> +{ + typedef member_at::left type; +}; + +template< class Tag, class Relation > +struct member_with_tag +< + Tag, + Relation, + BOOST_DEDUCED_TYPENAME enable_if + < + mpl::and_ + < + mpl::not_< is_same<Tag,member_at::right> >, + is_same + < + Tag, + BOOST_DEDUCED_TYPENAME Relation::right_tag + > + > + + >::type +> +{ + typedef member_at::right type; +}; + +template< class Tag, class Relation > +struct member_with_tag +< + Tag, Relation, + BOOST_DEDUCED_TYPENAME enable_if + < + mpl::and_ + < + mpl::not_< is_same<Tag,member_at::info> >, + is_same + < + Tag, + BOOST_DEDUCED_TYPENAME Relation::info_tag + > + > + + >::type +> +{ + typedef member_at::info type; +}; + +} // namespace support +} // namespace relation +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +#endif // BOOST_BIMAP_RELATION_SUPPORT_MEMBER_WITH_TAG_HPP + + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/relation/support/opposite_tag.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/relation/support/opposite_tag.hpp new file mode 100644 index 0000000000..df30059995 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/relation/support/opposite_tag.hpp @@ -0,0 +1,61 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file relation/support/opposite_tag.hpp +/// \brief Metafunction to obtain the opposite tag in a relation. + +#ifndef BOOST_BIMAP_RELATION_SUPPORT_OPPOSITE_TAG_HPP +#define BOOST_BIMAP_RELATION_SUPPORT_OPPOSITE_TAG_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/relation/detail/metadata_access_builder.hpp> + +/** \struct boost::bimaps::relation::support::opposite_tag + +\brief Metafunction to obtain the opposite tag in a relation. + +\code + +template< class Tag, class Relation > +struct opposite_tag +{ + typedef {OppositeTag} type; +}; + +\endcode + +\ingroup relation_group + **/ + +namespace boost { +namespace bimaps { +namespace relation { +namespace support { + +// Implementation of const pair reference type by metafunction + +BOOST_BIMAP_SYMMETRIC_METADATA_ACCESS_BUILDER +( + opossite_tag, + right_tag, + left_tag +) + +} // namespace support +} // namespace relation +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_RELATION_SUPPORT_OPPOSITE_TAG_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/relation/support/pair_by.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/relation/support/pair_by.hpp new file mode 100644 index 0000000000..e1bfc7906b --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/relation/support/pair_by.hpp @@ -0,0 +1,120 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file relation/support/pair_by.hpp +/// \brief pair_by<member>(r) function + +#ifndef BOOST_BIMAP_RELATION_SUPPORT_PAIR_BY_HPP +#define BOOST_BIMAP_RELATION_SUPPORT_PAIR_BY_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/relation/support/pair_type_by.hpp> +#include <boost/bimap/relation/detail/access_builder.hpp> + +#ifdef BOOST_BIMAP_ONLY_DOXYGEN_WILL_PROCESS_THE_FOLLOWING_LINES + +namespace boost { +namespace bimaps { +namespace relation { +namespace support { + +/** \brief Gets a pair view of the relation. + +\ingroup relation_group + **/ + +template< class Tag, class Relation > +BOOST_DEDUCED_TYPENAME result_of::pair_by<Tag,Relation>::type + pair_by( Relation & rel ); + +} // namespace support +} // namespace relation +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_ONLY_DOXYGEN_WILL_PROCESS_THE_FOLLOWING_LINES + + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +namespace boost { +namespace bimaps { +namespace relation { +namespace support { + + +// Since it is very error-prone to directly write the hole bunch +// of relation accesor. They are built from little macro blocks that +// are both more readable, leading to self docummenting code and a +// lot more easier to understand and maintain. +// It is very important to note that the three building blocks have +// to laid in the same namespace in order to work. There is also +// important to keep them in order. +// The forward declaration are not necessary but they help a lot to +// the reader, as they undercover what is the signature of the +// result code. +// In the end, it is not quicker to do it in this way because you +// write a lot. But this code has no complexity at all and almost +// every word writed is for documentation. + +// Result of +// ------------------------------------------------------------------------- +/* + namespace result_of { + + template< class Tag, class Relation > + struct pair_by<Tag,Relation>; + { + typedef -unspecified- type; + }; + + } // namespace result_of +*/ + +BOOST_BIMAP_SYMMETRIC_ACCESS_RESULT_OF_BUILDER +( + pair_by, + pair_type_by +) + + + +// Implementation +// ------------------------------------------------------------------------- + +BOOST_BIMAP_SYMMETRIC_ACCESS_IMPLEMENTATION_BUILDER +( + pair_by, + Relation, + rel, + return rel.get_left_pair(), + return rel.get_right_pair() +) + +// Interface +// -------------------------------------------------------------------------- + +BOOST_BIMAP_SYMMETRIC_ACCESS_INTERFACE_BUILDER +( + pair_by +) + +} // namespace support +} // namespace relation +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_DOXIGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +#endif // BOOST_BIMAP_RELATION_SUPPORT_PAIR_BY_HPP diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/relation/support/pair_type_by.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/relation/support/pair_type_by.hpp new file mode 100644 index 0000000000..9d9c1188ed --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/relation/support/pair_type_by.hpp @@ -0,0 +1,62 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file relation/support/pair_type_by.hpp +/// \brief pair_type_by<tag,relation> metafunction + +#ifndef BOOST_BIMAP_RELATION_SUPPORT_PAIR_TYPE_BY_HPP +#define BOOST_BIMAP_RELATION_SUPPORT_PAIR_TYPE_BY_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/relation/detail/metadata_access_builder.hpp> + +/** \struct boost::bimaps::relation::support::pair_type_by + +\brief Metafunction to obtain the view type indexed by one of the sides. + +\code + +template< class Tag, class Relation > +struct pair_type_by +{ + typedef {signature-compatible with std::pair} type; +}; + +\endcode + +See also member_at, pair_by(). +\ingroup relation_group + **/ + +namespace boost { +namespace bimaps { +namespace relation { +namespace support { + +// Implementation of pair type by metafunction + +BOOST_BIMAP_SYMMETRIC_METADATA_ACCESS_BUILDER +( + pair_type_by, + left_pair, + right_pair +) + +} // namespace support +} // namespace relation +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_RELATION_SUPPORT_PAIR_BY_TYPE_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/relation/support/value_type_of.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/relation/support/value_type_of.hpp new file mode 100644 index 0000000000..24ec2392e0 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/relation/support/value_type_of.hpp @@ -0,0 +1,91 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file relation/support/value_type_of.hpp +/// \brief value_type_of<tag,relation> metafunction + +#ifndef BOOST_BIMAP_RELATION_SUPPORT_VALUE_TYPE_OF_HPP +#define BOOST_BIMAP_RELATION_SUPPORT_VALUE_TYPE_OF_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/relation/detail/metadata_access_builder.hpp> + +/** \struct boost::bimaps::relation::support::value_type_of + +\brief Metafunction to obtain the value type of one of the sides. + +\code + +template< class Tag, class Relation > +struct value_type_of +{ + typedef typename Relation::{side}_type type; +}; + +\endcode + +See also member_at, get(). +\ingroup relation_group + **/ + +namespace boost { +namespace bimaps { +namespace relation { +namespace support { + +// Metafunction value_type_of +/* + + template< class Tag, class Relation > + struct value_type_of + { + typedef -unspecified- type; + }; + +*/ + +BOOST_BIMAP_SYMMETRIC_METADATA_ACCESS_BUILDER +( + value_type_of, + left_value_type, + right_value_type +) + +// Add support for info tags to value_type_of + +template< class Tag, class SymmetricType > +struct value_type_of +< + Tag, SymmetricType, + BOOST_DEDUCED_TYPENAME enable_if + < + ::boost::bimaps::relation::support::is_tag_of_member_at_info + < + Tag, + SymmetricType + > + + >::type +> +{ + typedef BOOST_DEDUCED_TYPENAME SymmetricType::info_type type; +}; + +} // namespace support +} // namespace relation +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_RELATION_SUPPORT_VALUE_TYPE_OF_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/relation/symmetrical_base.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/relation/symmetrical_base.hpp new file mode 100644 index 0000000000..cd1330651f --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/relation/symmetrical_base.hpp @@ -0,0 +1,97 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file relation/symmetrical_base.hpp +/// \brief Base class for symmetrical types + +#ifndef BOOST_BIMAP_RELATION_SYMMETRICAL_BASE_HPP +#define BOOST_BIMAP_RELATION_SYMMETRICAL_BASE_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/mpl/if.hpp> +#include <boost/type_traits/remove_const.hpp> + +// Boost.Bimap +#include <boost/bimap/tags/tagged.hpp> +#include <boost/bimap/tags/support/default_tagged.hpp> + +#include <boost/bimap/relation/member_at.hpp> + + +namespace boost { +namespace bimaps { +namespace relation { + +/// \brief Base of symmetrical tagged types. +/** + + **/ + +template< class TA, class TB, bool force_mutable = false > +class symmetrical_base +{ + + public: + + typedef BOOST_DEDUCED_TYPENAME tags::support::default_tagged + < + TA, + member_at::left + + >::type tagged_left_type; + + typedef BOOST_DEDUCED_TYPENAME tags::support::default_tagged + < + TB, + member_at::right + + >::type tagged_right_type; + + public: + + //@{ + /// The type stored in the relation + + typedef BOOST_DEDUCED_TYPENAME ::boost::mpl::if_c< force_mutable, + + BOOST_DEDUCED_TYPENAME ::boost::remove_const< + BOOST_DEDUCED_TYPENAME tagged_left_type::value_type >::type, + BOOST_DEDUCED_TYPENAME tagged_left_type::value_type + + >::type left_value_type; + + typedef BOOST_DEDUCED_TYPENAME ::boost::mpl::if_c< force_mutable, + + BOOST_DEDUCED_TYPENAME ::boost::remove_const< + BOOST_DEDUCED_TYPENAME tagged_right_type::value_type >::type, + BOOST_DEDUCED_TYPENAME tagged_right_type::value_type + + >::type right_value_type; + //@} + + //@{ + /// The tag of the member. By default it is \c member_at::{side} + typedef BOOST_DEDUCED_TYPENAME tagged_left_type ::tag left_tag; + typedef BOOST_DEDUCED_TYPENAME tagged_right_type::tag right_tag; + //@} +}; + + + +} // namespace relation +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_RELATION_SYMMETRICAL_BASE_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/set_of.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/set_of.hpp new file mode 100644 index 0000000000..e8ca09dd2c --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/set_of.hpp @@ -0,0 +1,206 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file set_of.hpp +/// \brief Include support for set constrains for the bimap container + +#ifndef BOOST_BIMAP_SET_OF_HPP +#define BOOST_BIMAP_SET_OF_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/detail/user_interface_config.hpp> + +#include <functional> +#include <boost/mpl/bool.hpp> +#include <boost/mpl/aux_/na.hpp> + +#include <boost/concept_check.hpp> + +#include <boost/bimap/detail/concept_tags.hpp> + +#include <boost/bimap/detail/generate_index_binder.hpp> +#include <boost/bimap/detail/generate_view_binder.hpp> +#include <boost/bimap/detail/generate_relation_binder.hpp> + +#include <boost/bimap/tags/support/value_type_of.hpp> + +#include <boost/multi_index/ordered_index.hpp> + +#include <boost/bimap/views/map_view.hpp> +#include <boost/bimap/views/set_view.hpp> + +namespace boost { +namespace bimaps { + +/// \brief Set Type Specification +/** +This struct is used to specify a set specification. +It is not a container, it is just a metaprogramming facility to +express the type of a set. Generally, this specification will +be used in other place to create a container. +It has the same syntax that an std::set instantiation, except +that the allocator cannot be specified. The rationale behind +this difference is that the allocator is not part of the set +type specification, rather it is a container configuration +parameter. +The first parameter is the type of the objects in the set, and +the second one is a Functor that compares them. +Bimap binding metafunctions can be used with this class in +the following way: + +\code +using namespace support; + +BOOST_STATIC_ASSERT( is_set_type_of< set_of<Type> >::value ) + +BOOST_STATIC_ASSERT +( + is_same + < + set_of<Type,KeyCompare>::index_bind + < + KeyExtractor, + Tag + + >::type, + + ordered_unique< tag<Tag>, KeyExtractor, KeyCompare > + + >::value +) + +typedef bimap +< + set_of<Type>, RightKeyType + +> bimap_with_left_type_as_set; + +BOOST_STATIC_ASSERT +( + is_same + < + set_of<Type>::map_view_bind + < + member_at::left, + bimap_with_left_type_as_set + + >::type, + + map_view< member_at::left, bimap_with_left_type_as_set > + + >::value +) + +\endcode + +See also set_of_relation. + **/ + +template +< + class KeyType, + class KeyCompare = std::less< BOOST_DEDUCED_TYPENAME + ::boost::bimaps::tags::support::value_type_of<KeyType>::type > +> +struct set_of : public ::boost::bimaps::detail::set_type_of_tag +{ + /// User type, can be tagged + typedef KeyType user_type; + + /// Type of the object that will be stored in the set + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::tags::support:: + value_type_of<user_type>::type value_type; + + /// Functor that compare two keys + typedef KeyCompare key_compare; + + struct lazy_concept_checked + { + BOOST_CLASS_REQUIRE ( value_type, + boost, AssignableConcept ); + + BOOST_CLASS_REQUIRE4( key_compare, bool, value_type, value_type, + boost, BinaryFunctionConcept ); + + typedef set_of type; + }; + + BOOST_BIMAP_GENERATE_INDEX_BINDER_1CP( + + // binds to + multi_index::ordered_unique, + + // with + key_compare + ) + + BOOST_BIMAP_GENERATE_MAP_VIEW_BINDER( + + // binds to + views::map_view + ) + + BOOST_BIMAP_GENERATE_SET_VIEW_BINDER( + + // binds to + views::set_view + ) + + typedef mpl::bool_<false> mutable_key; +}; + + +/// \brief Set Of Relation Specification +/** +This struct is similar to set_of but it is bind logically to a +relation. It is used in the bimap instantiation to specify the +desired type of the main view. This struct implements internally +a metafunction named bind_to that manages the quite complicated +task of finding the right type of the set for the relation. + +\code +template<class Relation> +struct bind_to +{ + typedef -unspecified- type; +}; +\endcode + +See also set_of, is_set_type_of_relation. + **/ + +template< class KeyCompare = std::less< _relation > > +struct set_of_relation : public ::boost::bimaps::detail::set_type_of_relation_tag +{ + /// Functor that compare two keys + typedef KeyCompare key_compare; + + BOOST_BIMAP_GENERATE_RELATION_BINDER_1CP( + + // binds to + set_of, + + // with + key_compare + ) + + typedef mpl::bool_<false> left_mutable_key; + typedef mpl::bool_<false> right_mutable_key; +}; + +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_SET_OF_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/support/data_type_by.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/support/data_type_by.hpp new file mode 100644 index 0000000000..304597dbab --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/support/data_type_by.hpp @@ -0,0 +1,73 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file support/data_type_by.hpp +/// \brief Metafunction to access the data types of a bimap + +#ifndef BOOST_BIMAP_SUPPORT_DATA_TYPE_BY_HPP +#define BOOST_BIMAP_SUPPORT_DATA_TYPE_BY_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/relation/detail/metadata_access_builder.hpp> + +/** \struct boost::bimaps::support::data_type_by + +\brief Metafunction to obtain the data type of one of the sides in a bimap + +The tag parameter can be either a user defined tag or \c member_at::{side}. +This is the actual data type stored in the bimap. +\code + +template< class Tag, class Bimap > +struct data_type_by +{ + typedef typename Bimap::{side}_data_type type; +}; + +\endcode + +The following holds: + +\code + +BOOST_STATIC_ASSERT +( + is_same< data_type_by< member_at::left, bimap<A,B> >::type, A >::value +) + +\endcode + +See also member_at. +\ingroup bimap_group + **/ + +namespace boost { +namespace bimaps { +namespace support { + +// Implementation of data type of metafunction + +BOOST_BIMAP_SYMMETRIC_METADATA_ACCESS_BUILDER +( + data_type_by, + left_data_type, + right_data_type +) + +} // namespace support +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_SUPPORT_DATA_TYPE_BY_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/support/iterator_type_by.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/support/iterator_type_by.hpp new file mode 100644 index 0000000000..e7cdb484b2 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/support/iterator_type_by.hpp @@ -0,0 +1,142 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file support/iterator_type_by.hpp +/// \brief Metafunctions to access the iterator types of a bimap + +#ifndef BOOST_BIMAP_SUPPORT_ITERATOR_TYPE_BY_HPP +#define BOOST_BIMAP_SUPPORT_ITERATOR_TYPE_BY_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/relation/detail/metadata_access_builder.hpp> +#include <boost/bimap/relation/detail/static_access_builder.hpp> + +/** \struct boost::bimaps::support::iterator_type_by + +\brief Metafunction to obtain the iterator type of the map view by one of the sides. +These metafunctions can be used outside the bimap framework for other bimap +signature compatible classes. +\code + +template< class Tag, class Bimap > +struct iterator_type_by +{ + typedef -unspecified- type; +}; + +template< class Tag, class Bimap > +struct const_iterator_type_by +{ + typedef -unspecified- type; +}; + +template< class Tag, class Bimap > +struct reverse_iterator_type_by +{ + typedef -unspecified- type; +}; + +template< class Tag, class Bimap > +struct const_reverse_iterator_type_by +{ + typedef -unspecified- type; +}; + +template< class Tag, class Bimap > +struct local_iterator_type_by +{ + typedef -unspecified- type; +}; + +template< class Tag, class Bimap > +struct const_local_iterator_type_by +{ + typedef -unspecified- type; +}; + +\endcode + +See also member_at. +\ingroup bimap_group + **/ + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +namespace boost { +namespace bimaps { +namespace support { + +// Implementation of iterator type by metafunction + +BOOST_BIMAP_SYMMETRIC_METADATA_ACCESS_BUILDER +( + iterator_type_by, + left_iterator, + right_iterator +) + +// Implementation of const iterator type by metafunction + +BOOST_BIMAP_SYMMETRIC_METADATA_ACCESS_BUILDER +( + const_iterator_type_by, + left_const_iterator, + right_const_iterator +) + + +// Implementation of reverse iterator type by metafunction + +BOOST_BIMAP_SYMMETRIC_METADATA_ACCESS_BUILDER +( + reverse_iterator_type_by, + left_reverse_iterator, + right_reverse_iterator +) + +// Implementation of const reverse iterator type by metafunction + +BOOST_BIMAP_SYMMETRIC_METADATA_ACCESS_BUILDER +( + const_reverse_iterator_type_by, + left_const_reverse_iterator, + right_const_reverse_iterator +) + + +// Implementation of local iterator type by metafunction + +BOOST_BIMAP_SYMMETRIC_METADATA_ACCESS_BUILDER +( + local_iterator_type_by, + left_local_iterator, + right_local_iterator +) + +// Implementation of const local iterator type by metafunction + +BOOST_BIMAP_SYMMETRIC_METADATA_ACCESS_BUILDER +( + const_local_iterator_type_by, + left_const_local_iterator, + right_const_local_iterator +) + +} // namespace support +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +#endif // BOOST_BIMAP_SUPPORT_ITERATOR_TYPE_BY_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/support/key_type_by.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/support/key_type_by.hpp new file mode 100644 index 0000000000..581f3b221d --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/support/key_type_by.hpp @@ -0,0 +1,64 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file support/key_type_by.hpp +/// \brief Metafunction to access the set types of a bimap + +#ifndef BOOST_BIMAP_SUPPORT_KEY_TYPE_BY_HPP +#define BOOST_BIMAP_SUPPORT_KEY_TYPE_BY_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/relation/detail/metadata_access_builder.hpp> + +/** \struct boost::bimaps::support::key_type_by + +\brief Metafunction to obtain the key type of one of the sides in a bimap + +The tag parameter can be either a user defined tag or \c member_at::{side}. +The returned type is one of the {SetType}_of definition classes. + +\code + +template< class Tag, class Bimap > +struct key_type_by +{ + typedef typename Bimap::{side}_key_type type; +}; + +\endcode + +See also member_at. +\ingroup bimap_group + **/ + + +namespace boost { +namespace bimaps { +namespace support { + +// Implementation of key type type of metafunction + +BOOST_BIMAP_SYMMETRIC_METADATA_ACCESS_BUILDER +( + key_type_by, + left_key_type, + right_key_type +) + + +} // namespace support +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_SUPPORT_KEY_TYPE_BY_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/support/lambda.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/support/lambda.hpp new file mode 100644 index 0000000000..c8c44ecc2e --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/support/lambda.hpp @@ -0,0 +1,46 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file support/lambda.hpp +/// \brief Placeholders definition to help in bimap modify function + +#ifndef BOOST_BIMAP_SUPPORT_LAMBDA_HPP +#define BOOST_BIMAP_SUPPORT_LAMBDA_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/lambda/lambda.hpp> + +namespace boost { +namespace bimaps { + +namespace { + +/* +boost::lambda::placeholder1_type & _first = boost::lambda::_1; +boost::lambda::placeholder2_type & _second = boost::lambda::_2; + +boost::lambda::placeholder1_type & _left = boost::lambda::_1; +boost::lambda::placeholder2_type & _right = boost::lambda::_2; +*/ + +boost::lambda::placeholder1_type & _key = boost::lambda::_1; +boost::lambda::placeholder1_type & _data = boost::lambda::_1; + +} + +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_SUPPORT_LAMBDA_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/support/map_by.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/support/map_by.hpp new file mode 100644 index 0000000000..360f05f15d --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/support/map_by.hpp @@ -0,0 +1,132 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file support/map_by.hpp +/// \brief map_by<tag>(b) function + +#ifndef BOOST_BIMAP_SUPPORT_MAP_BY_HPP +#define BOOST_BIMAP_SUPPORT_MAP_BY_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/support/map_type_by.hpp> +#include <boost/bimap/relation/detail/access_builder.hpp> + + +#ifdef BOOST_BIMAP_ONLY_DOXYGEN_WILL_PROCESS_THE_FOLLOWING_LINES + +namespace boost { +namespace bimaps { +namespace support { + +/** \brief Gets a map view of a bidirectional map + +Convertible to \c map_type_by<Tag,Bimap>::type +Instead of using \c map_type_by<Tag,Bimap>::type this functions use +\b Boost.call_traits to find the best way to return this value. To help +the user of this function the following metafunction is provided +\code + +namespace result_of { + +template< class Tag, class Bimap > +struct map_by( Bimap & b ); + +} // namespace result_of + +\endcode + +See also member_at, value_type_of. +\ingroup bimap_group + **/ + +template< class Tag, class Bimap > +BOOST_DEDUCED_TYPENAME result_of::map_by<Tag,Bimap>::type + map_by( Bimap & b ); + +} // namespace support +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_ONLY_DOXYGEN_WILL_PROCESS_THE_FOLLOWING_LINES + + + +#ifndef BOOST_BIMAP_DOXIGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +namespace boost { +namespace bimaps { +namespace support { + +// Since it is very error-prone to directly write the hole bunch +// of relation accesor. They are built from little macro blocks that +// are both more readable, leading to self docummenting code and a +// lot more easier to understand and maintain. +// It is very important to note that the three building blocks have +// to laid in the same namespace in order to work. There is also +// important to keep them in order. +// The forward declaration are not necessary but they help a lot to +// the reader, as they undercover what is the signature of the +// result code. +// In the end, it is not quicker to do it in this way because you +// write a lot. But this code has no complexity at all and almost +// every word writed is for documentation. + +// Result of +// ------------------------------------------------------------------------- +/* + namespace result_of { + + template< class Tag, class Bimap > + struct map_by<Tag,Bimap>; + { + typedef -unspecified- type; + }; + + } // namespace result_of + +*/ + +BOOST_BIMAP_SYMMETRIC_ACCESS_RESULT_OF_BUILDER +( + map_by, + map_type_by +) + +// Implementation +// ------------------------------------------------------------------------- + +BOOST_BIMAP_SYMMETRIC_ACCESS_IMPLEMENTATION_BUILDER +( + map_by, + Bimap, + b, + return b.left, + return b.right +) + +// Interface +// -------------------------------------------------------------------------- + +BOOST_BIMAP_SYMMETRIC_ACCESS_INTERFACE_BUILDER +( + map_by +) + +} // namespace support +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_DOXIGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +#endif // BOOST_BIMAP_SUPPORT_MAP_BY_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/support/map_type_by.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/support/map_type_by.hpp new file mode 100644 index 0000000000..5727a76070 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/support/map_type_by.hpp @@ -0,0 +1,65 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file support/map_type_by.hpp +/// \brief Metafunction to access the map view types of a bimap + +#ifndef BOOST_BIMAP_SUPPORT_MAP_TYPE_BY_HPP +#define BOOST_BIMAP_SUPPORT_MAP_TYPE_BY_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/relation/detail/metadata_access_builder.hpp> + +/** \struct boost::bimaps::support::map_type_by + +\brief Metafunction to obtain the map view type of a bimap indexed by one of the sides. + +The tag parameter can be either a user defined tag or \c member_at::{side}. +The returned type is signature-compatible with std::pair. + +\code + +template< class Tag, class Bimap > +struct map_type_by +{ + typedef typename Bimap::{side}_map_type type; +}; + +\endcode + +See also member_at. +\ingroup bimap_group + **/ + +namespace boost { +namespace bimaps { +namespace support { + +// Implementation of map type by metafunction + +BOOST_BIMAP_SYMMETRIC_METADATA_ACCESS_BUILDER +( + map_type_by, + left_map, + right_map +) + + + +} // namespace support +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_SUPPORT_MAP_TYPE_BY_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/support/value_type_by.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/support/value_type_by.hpp new file mode 100644 index 0000000000..b65dfc674f --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/support/value_type_by.hpp @@ -0,0 +1,65 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file support/value_type_by.hpp +/// \brief Metafunction to access the value types (std::pair compatibles) of a bimap + +#ifndef BOOST_BIMAP_SUPPORT_VALUE_TYPE_BY_HPP +#define BOOST_BIMAP_SUPPORT_VALUE_TYPE_BY_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/relation/detail/metadata_access_builder.hpp> + +/** \struct boost::bimaps::support::value_type_by + +\brief Metafunction to obtain the value type of a bimap indexed by one of the sides. + +The tag parameter can be either a user defined tag or \c member_at::{side}. +The returned type is signature-compatible with std::pair. + +\code + +template< class Tag, class Bimap > +struct value_type_by +{ + typedef typename Bimap::{side}_value_type type; +}; + +\endcode + +See also member_at. +\ingroup bimap_group + **/ + +namespace boost { +namespace bimaps { +namespace support { + +// Implementation of value type by metafunction + +BOOST_BIMAP_SYMMETRIC_METADATA_ACCESS_BUILDER +( + value_type_by, + left_value_type, + right_value_type +) + + + +} // namespace support +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_SUPPORT_VALUE_TYPE_BY_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/tags/support/apply_to_value_type.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/tags/support/apply_to_value_type.hpp new file mode 100644 index 0000000000..0267b86f94 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/tags/support/apply_to_value_type.hpp @@ -0,0 +1,70 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file tags/support/apply_to_value_type.hpp +/// \brief Similar to mpl::apply but for tagged types. + +#ifndef BOOST_BIMAP_TAGS_SUPPORT_APPLY_TO_VALUE_TYPE_HPP +#define BOOST_BIMAP_TAGS_SUPPORT_APPLY_TO_VALUE_TYPE_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/tags/tagged.hpp> +#include <boost/mpl/apply.hpp> + +/** \struct boost::bimaps::tags::support::apply_to_value_type +\brief Higger order metafunction similar to mpl::apply but for tagged types. + +\code +template< class Metafunction, class TaggedType > +struct apply_to_value_type +{ + typedef tagged + < + Metafuntion< value_type_of< TaggedType >::type >::type, + tag_of< TaggedType >::type + + > type; +}; +\endcode + +This higher order metafunctions is very useful, and it can be used with lambda +expressions. + +See also tagged. + **/ + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +namespace boost { +namespace bimaps { +namespace tags { +namespace support { + +template < class F, class TaggedType > +struct apply_to_value_type; + +template < class F, class ValueType, class Tag > +struct apply_to_value_type<F, tagged<ValueType,Tag> > +{ + typedef BOOST_DEDUCED_TYPENAME mpl::apply< F, ValueType >::type new_value_type; + typedef tagged< new_value_type, Tag > type; +}; + +} // namespace support +} // namespace tags +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +#endif // BOOST_BIMAP_TAGS_SUPPORT_APPLY_TO_VALUE_TYPE_HPP diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/tags/support/default_tagged.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/tags/support/default_tagged.hpp new file mode 100644 index 0000000000..806ca20926 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/tags/support/default_tagged.hpp @@ -0,0 +1,73 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file tags/support/default_tagged.hpp +/// \brief Weak tagging + +#ifndef BOOST_BIMAP_TAGS_SUPPORT_DEFAULT_TAGGED_HPP +#define BOOST_BIMAP_TAGS_SUPPORT_DEFAULT_TAGGED_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/tags/tagged.hpp> + +/** \struct boost::bimaps::tags::support::default_tagged +\brief Weak tagging metafunction + +\code +template< class Type, class Tag > +struct default_tagged +{ + typedef {TaggedType} type; +}; +\endcode + +If the type is not tagged, this metafunction returns a tagged type with the +default tag. If it is tagged, the returns the type unchanged. + +See also tagged, overwrite_tagged. + **/ + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +namespace boost { +namespace bimaps { +namespace tags { +namespace support { + + +// Default Tagging +// A metafunction that create a tagged type with a default tag value. + +template< class Type, class DefaultTag > +struct default_tagged +{ + typedef tagged<Type,DefaultTag> type; +}; + +template< class Type, class OldTag, class NewTag > +struct default_tagged< tagged< Type, OldTag >, NewTag > +{ + typedef tagged<Type,OldTag> type; +}; + +} // namespace support +} // namespace tags +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +#endif // BOOST_BIMAP_TAGS_SUPPORT_DEFAULT_TAGGED_HPP + + + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/tags/support/is_tagged.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/tags/support/is_tagged.hpp new file mode 100644 index 0000000000..62fcf81080 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/tags/support/is_tagged.hpp @@ -0,0 +1,64 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file tags/support/is_tagged.hpp +/// \brief type_traits extension + +#ifndef BOOST_BIMAP_TAGS_SUPPORT_IS_TAGGED_HPP +#define BOOST_BIMAP_TAGS_SUPPORT_IS_TAGGED_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/mpl/bool.hpp> +#include <boost/bimap/tags/tagged.hpp> + +/** \struct boost::bimaps::tags::support::is_tagged +\brief Type trait to check if a type is tagged. + +\code +template< class Type > +struct is_tagged +{ + typedef {mpl::true_/mpl::false_} type; +}; +\endcode + +See also tagged. + **/ + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +namespace boost { +namespace bimaps { +namespace tags { +namespace support { + + +// is_tagged metafunction + +template< class Type > +struct is_tagged : + ::boost::mpl::false_ {}; + +template< class Type, class Tag > +struct is_tagged< tagged< Type, Tag > > : + ::boost::mpl::true_ {}; + +} // namespace support +} // namespace tags +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +#endif // BOOST_BIMAP_TAGS_SUPPORT_IS_TAGGED_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/tags/support/overwrite_tagged.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/tags/support/overwrite_tagged.hpp new file mode 100644 index 0000000000..f3c49cc620 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/tags/support/overwrite_tagged.hpp @@ -0,0 +1,73 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file tags/support/overwrite_tagged.hpp +/// \brief Hard tagging + +#ifndef BOOST_BIMAP_TAGS_SUPPORT_OVERWRITE_TAGGED_HPP +#define BOOST_BIMAP_TAGS_SUPPORT_OVERWRITE_TAGGED_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/tags/tagged.hpp> + +/** \struct boost::bimaps::tags::support::overwrite_tagged +\brief Hard tagging metafunction + +\code +template< class Type, class Tag > +struct overwrite_tagged +{ + typedef {TaggedType} type; +}; +\endcode + +If the type is not tagged, this metafunction returns a tagged type with the +passed tag. If it is tagged it returns a new tagged type with the tag replaced +by the one passed as a parameter. + +See also tagged, default_tagged. + **/ + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +namespace boost { +namespace bimaps { +namespace tags { +namespace support { + + +// Change the tag + +template< class Type, class NewTag > +struct overwrite_tagged +{ + typedef tagged<Type,NewTag> type; +}; + +template< class Type, class OldTag, class NewTag > +struct overwrite_tagged< tagged< Type, OldTag >, NewTag > +{ + typedef tagged<Type,NewTag> type; +}; + + +} // namespace support +} // namespace tags +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +#endif // BOOST_BIMAP_TAGS_SUPPORT_OVERWRITE_TAGGED_HPP + + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/tags/support/tag_of.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/tags/support/tag_of.hpp new file mode 100644 index 0000000000..f2594f082c --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/tags/support/tag_of.hpp @@ -0,0 +1,75 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file tags/support/tag_of.hpp +/// \brief Safe way to access the tag of a type + +#ifndef BOOST_BIMAP_TAGS_SUPPORT_TAG_OF_HPP +#define BOOST_BIMAP_TAGS_SUPPORT_TAG_OF_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/tags/tagged.hpp> +#include <boost/bimap/detail/debug/static_error.hpp> + +/** \struct boost::bimaps::tags::support::tag_of +\brief Metafunction to obtain the tag of a type. + +\code +template< class TaggedType > +struct tag_of +{ + typedef {Tag} type; +}; +\endcode + +If the type is not tagged you will get a compile timer error with the following message: + +\verbatim +USING_TAG_OF_WITH_AN_UNTAGGED_TYPE, TaggedType +\endverbatim + +See also tagged, value_type_of. + **/ + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +namespace boost { +namespace bimaps { +namespace tags { +namespace support { + + +// tag_of metafunction + +template< class Type > +struct tag_of +{ + BOOST_BIMAP_STATIC_ERROR( USING_TAG_OF_WITH_AN_UNTAGGED_TYPE, (Type) ); +}; + +template< class Type, class Tag > +struct tag_of< tagged< Type, Tag > > +{ + typedef Tag type; +}; + + +} // namespace support +} // namespace tags +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +#endif // BOOST_BIMAP_TAGS_SUPPORT_TAG_OF_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/tags/support/value_type_of.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/tags/support/value_type_of.hpp new file mode 100644 index 0000000000..4734c6b6ca --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/tags/support/value_type_of.hpp @@ -0,0 +1,74 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file tags/support/value_type_of.hpp +/// \brief Consistent way to access the value type of a tagged or untagged type. + +#ifndef BOOST_BIMAP_TAGS_SUPPORT_VALUE_TYPE_OF_HPP +#define BOOST_BIMAP_TAGS_SUPPORT_VALUE_TYPE_OF_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/tags/tagged.hpp> + +/** \struct boost::bimaps::tags::support::value_type_of +\brief Metafunction to work with tagged and untagged type uniformly + +\code +template< class Type > +struct value_type_of +{ + typedef {UntaggedType} type; +}; +\endcode + +If the type is tagged this metafunction returns Type::value_type, and if it is not +tagged it return the same type. This allows to work consistently with tagged and +untagged types. + +See also tagged, tag_of. + **/ + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + + +namespace boost { +namespace bimaps { +namespace tags { +namespace support { + + +// value_type_of metafunction + +template< class Type > +struct value_type_of +{ + typedef Type type; +}; + +template< class Type, class Tag > +struct value_type_of< tagged< Type, Tag > > +{ + typedef Type type; +}; + + +} // namespace support +} // namespace tags +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +#endif // BOOST_BIMAP_TAGS_SUPPORT_VALUE_TYPE_OF_HPP + + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/tags/tagged.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/tags/tagged.hpp new file mode 100644 index 0000000000..4376d85bbb --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/tags/tagged.hpp @@ -0,0 +1,107 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file tags/tagged.hpp +/// \brief Defines the tagged class + +#ifndef BOOST_BIMAP_TAGS_TAGGED_HPP +#define BOOST_BIMAP_TAGS_TAGGED_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +namespace boost { +namespace bimaps { + +/// \brief A light non-invasive idiom to tag a type. +/** + +There are a lot of ways of tagging a type. The standard library for example +defines tags (empty structs) that are then inherited by the tagged class. To +support built-in types and other types that simple cannot inherit from the +tag, the standard builds another level of indirection. An example of this is +the type_traits metafunction. This approach is useful if the tags are intended +to be used in the library internals, and if the user does not have to create +new tagged types often. + +Boost.MultiIndex is an example of a library that defines a tagged idiom that +is better suited to the user. As an option, in the indexed by declaration +of a multi-index container a user can \b attach a tag to each index, so it +can be referred by it instead of by the index number. It is a very user +friendly way of specifying a tag but is very invasive from the library writer's +point of view. Each index must now support this additional parameter. Maybe +not in the case of the multi-index container, but in simpler classes +the information of the tags is used by the father class rather than by the +tagged types. + +\b tagged is a light non-invasive idiom to tag a type. It is very intuitive +and user-friendly. With the use of the defined metafunctions the library +writer can enjoy the coding too. + + **/ + +namespace tags { + +/// \brief The tag holder +/** + +The idea is to add a level of indirection to the type being tagged. With this +class you wrapped a type and apply a tag to it. The only thing to remember is +that if you write + +\code +typedef tagged<type,tag> taggedType; +\endcode + +Then instead to use directly the tagged type, in order to access it you have +to write \c taggedType::value_type. The tag can be obtained using \c taggedType::tag. +The idea is not to use this metadata directly but rather using the metafunctions +that are defined in the support namespace. With this metafunctions you can work +with tagged and untagged types in a consistent way. For example, the following +code is valid: + +\code +BOOST_STATIC_ASSERT( is_same< value_type_of<taggedType>, value_type_of<type> >::value ); +\endcode + +The are other useful metafunctions there too. +See also value_type_of, tag_of, is_tagged, apply_to_value_type. + +\ingroup tagged_group + **/ +template< class Type, class Tag > +struct tagged +{ + typedef Type value_type; + typedef Tag tag; +}; + +} // namespace tags +} // namespace bimaps +} // namespace boost + +/** \namespace boost::bimaps::tags::support +\brief Metafunctions to work with tagged types. + +This metafunctions aims to make easier the manage of tagged types. They are all mpl +compatible metafunctions and can be used with lambda expressions. +The metafunction value_type_of and tag_of get the data in a tagged type in a secure +and consistent way. +default_tagged and overwrite_tagged allows to work with the tag of a tagged type, +and apply_to_value_type is a higher order metafunction that allow the user to change +the type of a TaggedType. + **/ + +#endif // BOOST_BIMAP_TAGS_TAGGED_HPP + + + + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/unconstrained_set_of.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/unconstrained_set_of.hpp new file mode 100644 index 0000000000..107e1a555e --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/unconstrained_set_of.hpp @@ -0,0 +1,150 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file unconstrained_set_of.hpp +/// \brief Include support for set constrains for the bimap container + +#ifndef BOOST_BIMAP_UNCONSTRAINED_SET_OF_HPP +#define BOOST_BIMAP_UNCONSTRAINED_SET_OF_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/detail/user_interface_config.hpp> + +#include <boost/mpl/bool.hpp> + +#include <boost/concept_check.hpp> + +#include <boost/bimap/detail/concept_tags.hpp> + +#include <boost/bimap/tags/support/value_type_of.hpp> + +#include <boost/bimap/detail/generate_index_binder.hpp> +#include <boost/bimap/detail/generate_view_binder.hpp> +#include <boost/bimap/detail/generate_relation_binder.hpp> + +#include <boost/bimap/views/unconstrained_map_view.hpp> +#include <boost/bimap/views/unconstrained_set_view.hpp> + +namespace boost { +namespace bimaps { + +/// \brief Set Type Specification +/** +This struct is used to specify a set specification. +It is not a container, it is just a metaprogramming facility to +express the type of a set. Generally, this specification will +be used in other place to create a container. +The first parameter is the type of the objects in the set. + +\code + +using namespace support; + +BOOST_STATIC_ASSERT( is_set_type_of< unconstrained_set_of<Type> >::value ) + +\endcode + +See also unconstrained_set_of_relation. + **/ + +template +< + class KeyType +> +struct unconstrained_set_of : public ::boost::bimaps::detail::set_type_of_tag +{ + /// User type, can be tagged + typedef KeyType user_type; + + /// Type of the object that will be stored in the container + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::tags::support:: + value_type_of<user_type>::type value_type; + + struct lazy_concept_checked + { + BOOST_CLASS_REQUIRE ( value_type, + boost, AssignableConcept ); + + typedef unconstrained_set_of type; + }; + + BOOST_BIMAP_GENERATE_INDEX_BINDER_FAKE + + BOOST_BIMAP_GENERATE_MAP_VIEW_BINDER( + + // binds to + views::unconstrained_map_view + ) + + BOOST_BIMAP_GENERATE_SET_VIEW_BINDER( + + // binds to + views::unconstrained_set_view + ) + + typedef mpl::bool_<true> mutable_key; +}; + +/// \brief Set Of Relation Specification +/** +This struct is similar to unconstrained_set_of but it is bind +logically to a relation. It is used in the bimap instantiation to +specify the desired type of the main view. + +See also unconstrained_set_of, is_set_type_of_relation. + **/ + +struct unconstrained_set_of_relation : public ::boost::bimaps::detail::set_type_of_relation_tag +{ + + BOOST_BIMAP_GENERATE_RELATION_BINDER_0CP( + + // binds to + unconstrained_set_of + ) + + typedef mpl::bool_<true> left_mutable_key; + typedef mpl::bool_<true> right_mutable_key; +}; + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +namespace detail { + +template<class T> +struct is_unconstrained_set_of : + ::boost::mpl::false_ {}; + +template<class T> +struct is_unconstrained_set_of< unconstrained_set_of<T> > : + ::boost::mpl::true_ {}; + +} // namespace detail + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +} // namespace bimaps +} // namespace boost + + +/** \struct boost::bimaps::detail::is_unconstrained_set_of +\brief Trait to check if a type is unconstrained_set_of. +\code +template< class T > +struct is_unconstrained_set_of; +\endcode + **/ + + +#endif // BOOST_BIMAP_UNCONSTRAINED_SET_OF_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/unordered_multiset_of.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/unordered_multiset_of.hpp new file mode 100644 index 0000000000..1444a95272 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/unordered_multiset_of.hpp @@ -0,0 +1,233 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file unordered_multiset_of.hpp +/// \brief Include support for unordered_multiset constrains for the bimap container + +#ifndef BOOST_BIMAP_UNORDERED_MULTISET_OF_HPP +#define BOOST_BIMAP_UNORDERED_MULTISET_OF_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/detail/user_interface_config.hpp> + +#include <cstdlib> +#include <functional> +#include <boost/functional/hash.hpp> +#include <boost/mpl/bool.hpp> + +#include <boost/concept_check.hpp> + +#include <boost/bimap/detail/concept_tags.hpp> + +#include <boost/bimap/tags/support/value_type_of.hpp> + +#include <boost/bimap/detail/generate_index_binder.hpp> +#include <boost/bimap/detail/generate_view_binder.hpp> +#include <boost/bimap/detail/generate_relation_binder.hpp> + +#include <boost/multi_index/hashed_index.hpp> + +#include <boost/bimap/views/unordered_multimap_view.hpp> +#include <boost/bimap/views/unordered_multiset_view.hpp> + +namespace boost { +namespace bimaps { + + +/// \brief Set Type Specification +/** +This struct is used to specify an unordered_multiset specification. +It is not a container, it is just a metaprogramming facility to +express the type of a set. Generally, this specification will +be used in other place to create a container. +It has the same syntax that an tr1::unordered_multiset instantiation, +except that the allocator cannot be specified. The rationale behind +this difference is that the allocator is not part of the +unordered_multiset type specification, rather it is a container +configuration parameter. +The first parameter is the type of the objects in the set, the +second one is a Hash Functor that takes objects of this type, and +the third one is a Functor that compares them for equality. +Bimap binding metafunctions can be used with this class in +the following way: + +\code +using namespace support; + +BOOST_STATIC_ASSERT( is_set_type_of< unordered_multiset_of<Type> >::value ) + +BOOST_STATIC_ASSERT +( + is_same + < + compute_index_type + < + unordered_multiset_of<Type,HashFunctor,EqualKey>, + KeyExtractor, + Tag + + >::type + , + hashed_nonunique< tag<Tag>, KeyExtractor, HashFunctor, EqualKey > + + >::value +) + +typedef bimap +< + unordered_multiset_of<Type>, RightKeyType + +> bimap_with_left_type_as_unordered_multiset; + +BOOST_STATIC_ASSERT +( + is_same + < + compute_map_view_type + < + member_at::left, + bimap_with_left_type_as_unordered_multiset + + >::type, + + unordered_multimap_view + < + member_at::left, + bimap_with_left_type_as_unordered_multiset + > + + >::value +) + +\endcode + +See also unordered_multiset_of_relation. + **/ + +template +< + class KeyType, + class HashFunctor = hash< BOOST_DEDUCED_TYPENAME + ::boost::bimaps::tags::support::value_type_of<KeyType>::type >, + class EqualKey = std::equal_to< BOOST_DEDUCED_TYPENAME + ::boost::bimaps::tags::support::value_type_of<KeyType>::type > +> +struct unordered_multiset_of : public ::boost::bimaps::detail::set_type_of_tag +{ + /// User type, can be tagged + typedef KeyType user_type; + + /// Type of the object that will be stored in the container + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::tags::support:: + value_type_of<user_type>::type value_type; + + /// Hash Functor that takes value_type objects + typedef HashFunctor hasher; + + /// Functor that compare two value_type objects for equality + typedef EqualKey key_equal; + + struct lazy_concept_checked + { + BOOST_CLASS_REQUIRE ( value_type, + boost, AssignableConcept ); + + BOOST_CLASS_REQUIRE3( hasher, std::size_t, value_type, + boost, UnaryFunctionConcept ); + + BOOST_CLASS_REQUIRE4( key_equal, bool, value_type, value_type, + boost, BinaryFunctionConcept ); + + typedef unordered_multiset_of type; + }; + + BOOST_BIMAP_GENERATE_INDEX_BINDER_2CP( + + // binds to + multi_index::hashed_non_unique, + + // with + hasher, + key_equal + ) + + BOOST_BIMAP_GENERATE_MAP_VIEW_BINDER( + + // binds to + views::unordered_multimap_view + ) + + BOOST_BIMAP_GENERATE_SET_VIEW_BINDER( + + // binds to + views::unordered_multiset_view + ) + + typedef mpl::bool_<false> mutable_key; +}; + + +/// \brief Set Of Relation Specification +/** +This struct is similar to unordered_multiset_of but it is bind logically +to a relation. It is used in the bimap instantiation to specify the +desired type of the main view. This struct implements internally +a metafunction named bind_to that manages the quite complicated +task of finding the right type of the set for the relation. + +\code +template<class Relation> +struct bind_to +{ + typedef -unspecified- type; +}; +\endcode + +See also unordered_multiset_of, is_set_type_of_relation. + **/ + +template +< + class HashFunctor = hash< _relation >, + class EqualKey = std::equal_to< _relation > +> +struct unordered_multiset_of_relation : public ::boost::bimaps::detail::set_type_of_relation_tag +{ + /// Hash Functor that takes value_type objects + typedef HashFunctor hasher; + + /// Functor that compare two value_type objects for equality + typedef EqualKey key_equal; + + + BOOST_BIMAP_GENERATE_RELATION_BINDER_2CP( + + // binds to + unordered_multiset_of, + + // with + hasher, + key_equal + ) + + typedef mpl::bool_<false> left_mutable_key; + typedef mpl::bool_<false> right_mutable_key; +}; + + +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_UNORDERED_MULTISET_OF_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/unordered_set_of.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/unordered_set_of.hpp new file mode 100644 index 0000000000..d94c5b0762 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/unordered_set_of.hpp @@ -0,0 +1,230 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file unordered_set_of.hpp +/// \brief Include support for unordered_set constrains for the bimap container + +#ifndef BOOST_BIMAP_UNORDERED_SET_OF_HPP +#define BOOST_BIMAP_UNORDERED_SET_OF_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/detail/user_interface_config.hpp> + +#include <functional> +#include <boost/functional/hash.hpp> +#include <boost/mpl/bool.hpp> + +#include <boost/concept_check.hpp> + +#include <boost/bimap/detail/concept_tags.hpp> + +#include <boost/bimap/tags/support/value_type_of.hpp> + +#include <boost/bimap/detail/generate_index_binder.hpp> +#include <boost/bimap/detail/generate_view_binder.hpp> +#include <boost/bimap/detail/generate_relation_binder.hpp> + +#include <boost/multi_index/hashed_index.hpp> + +#include <boost/bimap/views/unordered_map_view.hpp> +#include <boost/bimap/views/unordered_set_view.hpp> + +namespace boost { +namespace bimaps { + +/// \brief Set Type Specification +/** +This struct is used to specify an unordered_set specification. +It is not a container, it is just a metaprogramming facility to +express the type of a set. Generally, this specification will +be used in other place to create a container. +It has the same syntax that an tr1::unordered_set instantiation, +except that the allocator cannot be specified. The rationale behind +this difference is that the allocator is not part of the +unordered_set type specification, rather it is a container +configuration parameter. +The first parameter is the type of the objects in the set, the +second one is a Hash Functor that takes objects of this type, and +the third one is a Functor that compares them for equality. +Bimap binding metafunctions can be used with this class in +the following way: + +\code +using namespace support; + +BOOST_STATIC_ASSERT( is_set_type_of< unordered_set_of<Type> >::value ) + +BOOST_STATIC_ASSERT +( + is_same + < + unordered_set_of<Type,HashFunctor,EqualKey>::index_bind + < + KeyExtractor, + Tag + + >::type, + + hashed_unique< tag<Tag>, KeyExtractor, HashFunctor, EqualKey > + + >::value +) + +typedef bimap +< + unordered_set_of<Type>, RightKeyType + +> bimap_with_left_type_as_unordered_set; + +BOOST_STATIC_ASSERT +( + is_same + < + unordered_set_of<Type>::map_view_bind + < + member_at::left, + bimap_with_left_type_as_unordered_set + + >::type, + + unordered_map_view + < + member_at::left, + bimap_with_left_type_as_unordered_set + > + + >::value +) + +\endcode + +See also unordered_set_of_relation. + **/ + +template +< + class KeyType, + class HashFunctor = hash< BOOST_DEDUCED_TYPENAME + ::boost::bimaps::tags::support::value_type_of<KeyType>::type >, + class EqualKey = std::equal_to< BOOST_DEDUCED_TYPENAME + ::boost::bimaps::tags::support::value_type_of<KeyType>::type > +> +struct unordered_set_of : public ::boost::bimaps::detail::set_type_of_tag +{ + /// User type, can be tagged + typedef KeyType user_type; + + /// Type of the object that will be stored in the container + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::tags::support:: + value_type_of<user_type>::type value_type; + + /// Hash Functor that takes value_type objects + typedef HashFunctor hasher; + + /// Functor that compare two value_type objects for equality + typedef EqualKey key_equal; + + struct lazy_concept_checked + { + BOOST_CLASS_REQUIRE ( value_type, + boost, AssignableConcept ); + + BOOST_CLASS_REQUIRE3( hasher, std::size_t, value_type, + boost, UnaryFunctionConcept ); + + BOOST_CLASS_REQUIRE4( key_equal, bool, value_type, value_type, + boost, BinaryFunctionConcept ); + + typedef unordered_set_of type; + }; + + BOOST_BIMAP_GENERATE_INDEX_BINDER_2CP( + + // binds to + multi_index::hashed_unique, + + // with + hasher, + key_equal + ) + + BOOST_BIMAP_GENERATE_MAP_VIEW_BINDER( + + // binds to + views::unordered_map_view + ) + + BOOST_BIMAP_GENERATE_SET_VIEW_BINDER( + + // binds to + views::unordered_set_view + ) + + typedef mpl::bool_<false> mutable_key; +}; + + +/// \brief Set Of Relation Specification +/** +This struct is similar to unordered_set_of but it is bind logically to +a relation. It is used in the bimap instantiation to specify the +desired type of the main view. This struct implements internally +a metafunction named bind_to that manages the quite complicated +task of finding the right type of the set for the relation. + +\code +template<class Relation> +struct bind_to +{ + typedef -unspecified- type; +}; +\endcode + +See also unordered_set_of, is_set_type_of_relation. + **/ + +template +< + class HashFunctor = hash< _relation >, + class EqualKey = std::equal_to< _relation > +> +struct unordered_set_of_relation : public ::boost::bimaps::detail::set_type_of_relation_tag +{ + /// Hash Functor that takes value_type objects + typedef HashFunctor hasher; + + /// Functor that compare two value_type objects for equality + typedef EqualKey key_equal; + + + BOOST_BIMAP_GENERATE_RELATION_BINDER_2CP( + + // binds to + unordered_set_of, + + // with + hasher, + key_equal + ) + + typedef mpl::bool_<false> left_mutable_key; + typedef mpl::bool_<false> right_mutable_key; +}; + + +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_UNORDERED_SET_OF_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/vector_of.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/vector_of.hpp new file mode 100644 index 0000000000..4ed3427c09 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/vector_of.hpp @@ -0,0 +1,186 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file vector_of.hpp +/// \brief Include support for vector constrains for the bimap container + +#ifndef BOOST_BIMAP_VECTOR_OF_HPP +#define BOOST_BIMAP_VECTOR_OF_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/detail/user_interface_config.hpp> + +#include <boost/mpl/bool.hpp> + +#include <boost/concept_check.hpp> + +#include <boost/bimap/detail/concept_tags.hpp> + +#include <boost/bimap/tags/support/value_type_of.hpp> + +#include <boost/bimap/detail/generate_index_binder.hpp> +#include <boost/bimap/detail/generate_view_binder.hpp> +#include <boost/bimap/detail/generate_relation_binder.hpp> + +#include <boost/multi_index/random_access_index.hpp> + +#include <boost/bimap/views/vector_map_view.hpp> +#include <boost/bimap/views/vector_set_view.hpp> + +namespace boost { +namespace bimaps { + + +/// \brief Set Type Specification +/** +This struct is used to specify a set specification. +It is not a container, it is just a metaprogramming facility to +express the type of a set. Generally, this specification will +be used in other place to create a container. +It has the same syntax that an std::vector instantiation, except +that the allocator cannot be specified. The rationale behind +this difference is that the allocator is not part of the set +type specification, rather it is a container configuration +parameter. +The first parameter is the type of the objects in the set, and +the second one is a Functor that compares them. +Bimap binding metafunctions can be used with this class in +the following way: + +\code +using namespace support; + +BOOST_STATIC_ASSERT( is_set_type_of< vector_of<Type> >::value ) + +BOOST_STATIC_ASSERT +( + is_same + < + vector_of<Type>::index_bind + < + KeyExtractor, + Tag + + >::type, + + random_access< tag<Tag>, KeyExtractor > + + >::value +) + +typedef bimap +< + vector_of<Type>, RightKeyType + +> bimap_with_left_type_as_vector; + +BOOST_STATIC_ASSERT +( + is_same + < + vector_of<Type>::map_view_bind + < + member_at::left, + bimap_with_left_type_as_vector + + >::type, + + vector_map_view< member_at::left, bimap_with_left_type_as_vector > + + >::value +) + +\endcode + +See also vector_of_relation. + **/ + +template< class Type > +struct vector_of : public ::boost::bimaps::detail::set_type_of_tag +{ + /// User type, can be tagged + typedef Type user_type; + + /// Type of the object that will be stored in the vector + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::tags::support:: + value_type_of<user_type>::type value_type; + + + struct lazy_concept_checked + { + BOOST_CLASS_REQUIRE ( value_type, + boost, AssignableConcept ); + + typedef vector_of type; + }; + + BOOST_BIMAP_GENERATE_INDEX_BINDER_0CP_NO_EXTRACTOR( + + // binds to + multi_index::random_access + ) + + BOOST_BIMAP_GENERATE_MAP_VIEW_BINDER( + + // binds to + views::vector_map_view + ) + + BOOST_BIMAP_GENERATE_SET_VIEW_BINDER( + + // binds to + views::vector_set_view + ) + + typedef mpl::bool_<true> mutable_key; +}; + + +/// \brief Set Of Relation Specification +/** +This struct is similar to vector_of but it is bind logically to a +relation. It is used in the bimap instantiation to specify the +desired type of the main view. This struct implements internally +a metafunction named bind_to that manages the quite complicated +task of finding the right type of the set for the relation. + +\code +template<class Relation> +struct bind_to +{ + typedef -unspecified- type; +}; +\endcode + +See also vector_of, is_set_type_of_relation. + **/ + +struct vector_of_relation : public ::boost::bimaps::detail::set_type_of_relation_tag +{ + BOOST_BIMAP_GENERATE_RELATION_BINDER_0CP( + + // binds to + vector_of + ) + + typedef mpl::bool_<true> left_mutable_key; + typedef mpl::bool_<true> right_mutable_key; +}; + + +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_VECTOR_OF_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/views/list_map_view.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/views/list_map_view.hpp new file mode 100644 index 0000000000..9b0cf6f0ef --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/views/list_map_view.hpp @@ -0,0 +1,177 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file views/list_map_view.hpp +/// \brief View of a side of a bimap. + +#ifndef BOOST_BIMAP_VIEWS_LIST_MAP_VIEW_HPP +#define BOOST_BIMAP_VIEWS_LIST_MAP_VIEW_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/container_adaptor/list_map_adaptor.hpp> +#include <boost/bimap/relation/support/pair_by.hpp> +#include <boost/bimap/support/iterator_type_by.hpp> +#include <boost/bimap/detail/map_view_base.hpp> +#include <boost/bimap/relation/support/data_extractor.hpp> +#include <boost/bimap/relation/detail/to_mutable_relation_functor.hpp> + +namespace boost { +namespace bimaps { +namespace views { + +#ifndef BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +template< class Tag, class BimapType > +struct list_map_view_base +{ + typedef ::boost::bimaps::container_adaptor::list_map_adaptor + < + BOOST_DEDUCED_TYPENAME BimapType::core_type:: + BOOST_NESTED_TEMPLATE index<Tag>::type, + ::boost::bimaps::detail:: map_view_iterator<Tag,BimapType>, + ::boost::bimaps::detail:: const_map_view_iterator<Tag,BimapType>, + ::boost::bimaps::detail:: reverse_map_view_iterator<Tag,BimapType>, + ::boost::bimaps::detail::const_reverse_map_view_iterator<Tag,BimapType>, + ::boost::bimaps::container_adaptor::support::iterator_facade_to_base + < + ::boost::bimaps::detail:: map_view_iterator<Tag,BimapType>, + ::boost::bimaps::detail::const_map_view_iterator<Tag,BimapType> + + >, + ::boost::mpl::na, + ::boost::mpl::na, + ::boost::bimaps::relation::detail:: + pair_to_relation_functor<Tag, BOOST_DEDUCED_TYPENAME BimapType::relation >, + ::boost::bimaps::relation::support:: + get_pair_functor<Tag, BOOST_DEDUCED_TYPENAME BimapType::relation >, + + BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support::data_extractor + < + Tag, + BOOST_DEDUCED_TYPENAME BimapType::relation + + >::type + + > type; +}; + +#endif // BOOST_BIMAP_DOXYGEN_WILL_NOT_PROCESS_THE_FOLLOWING_LINES + +/// \brief View of a side of a bimap. +/** + +This class uses container_adaptor and iterator_adaptor to wrapped a index of the +multi_index bimap core. + +See also const_list_map_view. + **/ +template< class Tag, class BimapType > +class list_map_view +: + public list_map_view_base<Tag,BimapType>::type, + public ::boost::bimaps::detail:: + map_view_base< list_map_view<Tag,BimapType>,Tag,BimapType > + +{ + typedef BOOST_DEDUCED_TYPENAME list_map_view_base<Tag,BimapType>::type base_; + + BOOST_BIMAP_MAP_VIEW_BASE_FRIEND(list_map_view,Tag,BimapType) + + public: + + typedef BOOST_DEDUCED_TYPENAME base_::value_type::info_type info_type; + + list_map_view(BOOST_DEDUCED_TYPENAME base_::base_type & c) : + base_(c) {} + + list_map_view & operator=(const list_map_view & v) + { + this->base() = v.base(); + return *this; + } + + BOOST_BIMAP_VIEW_ASSIGN_IMPLEMENTATION(base_) + + BOOST_BIMAP_VIEW_FRONT_BACK_IMPLEMENTATION(base_) + + // Rearrange Operations + + void relocate(BOOST_DEDUCED_TYPENAME base_::iterator position, + BOOST_DEDUCED_TYPENAME base_::iterator i) + { + this->base().relocate( + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position), + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(i) + ); + } + + void relocate(BOOST_DEDUCED_TYPENAME base_::iterator position, + BOOST_DEDUCED_TYPENAME base_::iterator first, + BOOST_DEDUCED_TYPENAME base_::iterator last) + { + this->base().relocate( + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position), + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(first), + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(last) + ); + } +}; + + +} // namespace views + +/*===========================================================================*/ +#define BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,TYPENAME) \ +typedef BOOST_DEDUCED_TYPENAME MAP_VIEW::TYPENAME \ + BOOST_PP_CAT(SIDE,BOOST_PP_CAT(_,TYPENAME)); +/*===========================================================================*/ + +/*===========================================================================*/ +#define BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY(MAP_VIEW,SIDE) \ + BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,reverse_iterator) \ + BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,const_reverse_iterator) \ +/*===========================================================================*/ + +namespace detail { + +template< class Tag, class BimapType > +struct left_map_view_extra_typedefs< ::boost::bimaps::views::list_map_view<Tag,BimapType> > +{ + private: typedef ::boost::bimaps::views::list_map_view<Tag,BimapType> map_view_; + public : BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY(map_view_,left) +}; + +template< class Tag, class BimapType > +struct right_map_view_extra_typedefs< ::boost::bimaps::views::list_map_view<Tag,BimapType> > +{ + private: typedef ::boost::bimaps::views::list_map_view<Tag,BimapType> map_view_; + public : BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY(map_view_,right) +}; + +} // namespace detail + +/*===========================================================================*/ +#undef BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF +#undef BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY +/*===========================================================================*/ + +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_VIEWS_LIST_MAP_VIEW_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/views/list_set_view.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/views/list_set_view.hpp new file mode 100644 index 0000000000..cfa52ab19e --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/views/list_set_view.hpp @@ -0,0 +1,109 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file views/list_set_view.hpp +/// \brief View of a side of a bimap that is signature compatible with std::list. + +#ifndef BOOST_BIMAP_VIEWS_LIST_SET_VIEW_HPP +#define BOOST_BIMAP_VIEWS_LIST_SET_VIEW_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/container_adaptor/list_adaptor.hpp> +#include <boost/bimap/detail/set_view_base.hpp> +#include <boost/bimap/detail/map_view_base.hpp> + +namespace boost { +namespace bimaps { +namespace views { + +/// \brief View of a bimap that is signature compatible with std::list. +/** + +This class uses container_adaptor and iterator_adaptor to wrapped a index of the +multi_index bimap core so it can be used as a std::list. + +See also const_list_set_view. + **/ + +template< class CoreIndex > +class list_set_view +: + public BOOST_BIMAP_SEQUENCED_SET_VIEW_CONTAINER_ADAPTOR( + list_adaptor, + CoreIndex, + reverse_iterator, const_reverse_iterator + ), + + public ::boost::bimaps::detail:: + set_view_base< list_set_view< CoreIndex >, CoreIndex > +{ + BOOST_BIMAP_SET_VIEW_BASE_FRIEND(list_set_view,CoreIndex) + + typedef BOOST_BIMAP_SEQUENCED_SET_VIEW_CONTAINER_ADAPTOR( + list_adaptor, + CoreIndex, + reverse_iterator, const_reverse_iterator + + ) base_; + + public: + + list_set_view(BOOST_DEDUCED_TYPENAME base_::base_type & c) : + base_(c) {} + + list_set_view & operator=(const list_set_view & v) + { + this->base() = v.base(); + return *this; + } + + BOOST_BIMAP_VIEW_ASSIGN_IMPLEMENTATION(base_) + + BOOST_BIMAP_VIEW_FRONT_BACK_IMPLEMENTATION(base_) + + // Rearrange Operations + + void relocate(BOOST_DEDUCED_TYPENAME base_::iterator position, + BOOST_DEDUCED_TYPENAME base_::iterator i) + { + this->base().relocate( + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position), + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(i) + ); + } + + void relocate(BOOST_DEDUCED_TYPENAME base_::iterator position, + BOOST_DEDUCED_TYPENAME base_::iterator first, + BOOST_DEDUCED_TYPENAME base_::iterator last) + { + this->base().relocate( + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position), + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(first), + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(last) + ); + } +}; + + +} // namespace views +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_VIEWS_LIST_SET_VIEW_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/views/map_view.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/views/map_view.hpp new file mode 100644 index 0000000000..80820aab81 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/views/map_view.hpp @@ -0,0 +1,156 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file views/map_view.hpp +/// \brief View of a side of a bimap that is signature compatible with std::map. + +#ifndef BOOST_BIMAP_VIEWS_MAP_VIEW_HPP +#define BOOST_BIMAP_VIEWS_MAP_VIEW_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/container_adaptor/map_adaptor.hpp> +#include <boost/bimap/detail/map_view_base.hpp> + +namespace boost { +namespace bimaps { +namespace views { + +/// \brief View of a side of a bimap that is signature compatible with std::map. +/** + +This class uses container_adaptor and iterator_adaptor to wrapped a index of the +multi_index bimap core so it can be used as a std::map. + +See also const_map_view. + **/ + +template< class Tag, class BimapType > +class map_view +: + public BOOST_BIMAP_MAP_VIEW_CONTAINER_ADAPTOR( + map_adaptor, + Tag,BimapType, + reverse_map_view_iterator,const_reverse_map_view_iterator + ), + public ::boost::bimaps::detail:: + map_view_base< map_view<Tag,BimapType>,Tag,BimapType >, + public ::boost::bimaps::detail:: + unique_map_view_access< map_view<Tag,BimapType>, Tag, BimapType>::type +{ + typedef BOOST_BIMAP_MAP_VIEW_CONTAINER_ADAPTOR( + map_adaptor, + Tag,BimapType, + reverse_map_view_iterator,const_reverse_map_view_iterator + + ) base_; + + BOOST_BIMAP_MAP_VIEW_BASE_FRIEND(map_view,Tag,BimapType) + + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::detail:: + unique_map_view_access< + map_view<Tag,BimapType>, Tag, BimapType + + >::type unique_map_view_access_; + + public: + + typedef BOOST_DEDUCED_TYPENAME base_::value_type::info_type info_type; + + map_view(BOOST_DEDUCED_TYPENAME base_::base_type & c) : base_(c) {} + + using unique_map_view_access_::at; + using unique_map_view_access_::operator[]; + + BOOST_BIMAP_MAP_VIEW_RANGE_IMPLEMENTATION(base_) + + map_view & operator=(const map_view & v) + { + this->base() = v.base(); + return *this; + } + + // It can be used enable_if here but the error message when there + // is no info is very clear like this + + template< class CompatibleKey > + const info_type & info_at(const CompatibleKey& k) const + { + BOOST_DEDUCED_TYPENAME base_::const_iterator iter = this->find(k); + if( iter == this->end() ) + { + ::boost::throw_exception( + std::out_of_range("bimap<>: invalid key") + ); + } + return iter->info; + } + + template< class CompatibleKey > + info_type & info_at(const CompatibleKey& k) + { + BOOST_DEDUCED_TYPENAME base_::iterator iter = this->find(k); + if( iter == this->end() ) + { + ::boost::throw_exception( + std::out_of_range("bimap<>: invalid key") + ); + } + return iter->info; + } +}; + +} // namespace views + +/*===========================================================================*/ +#define BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,TYPENAME) \ +typedef BOOST_DEDUCED_TYPENAME MAP_VIEW::TYPENAME \ + BOOST_PP_CAT(SIDE,BOOST_PP_CAT(_,TYPENAME)); +/*===========================================================================*/ + +/*===========================================================================*/ +#define BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY(MAP_VIEW,SIDE) \ + BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,reverse_iterator) \ + BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,const_reverse_iterator) \ + BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,range_type) \ + BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,const_range_type) \ + BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,key_compare) +/*===========================================================================*/ + +namespace detail { + +template< class Tag, class BimapType > +struct left_map_view_extra_typedefs< ::boost::bimaps::views::map_view<Tag,BimapType> > +{ + private: typedef ::boost::bimaps::views::map_view<Tag,BimapType> map_view_; + public : BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY(map_view_,left) +}; + +template< class Tag, class BimapType > +struct right_map_view_extra_typedefs< ::boost::bimaps::views::map_view<Tag,BimapType> > +{ + private: typedef ::boost::bimaps::views::map_view<Tag,BimapType> map_view_; + public : BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY(map_view_,right) +}; + +} // namespace detail + +/*===========================================================================*/ +#undef BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF +#undef BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY +/*===========================================================================*/ + +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_VIEWS_MAP_VIEW_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/views/multimap_view.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/views/multimap_view.hpp new file mode 100644 index 0000000000..7beb92095d --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/views/multimap_view.hpp @@ -0,0 +1,123 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file views/multimap_view.hpp +/// \brief View of a side of a bimap that is signature compatible with std::multimap. + +#ifndef BOOST_BIMAP_VIEWS_MULTIMAP_VIEW_HPP +#define BOOST_BIMAP_VIEWS_MULTIMAP_VIEW_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/container_adaptor/multimap_adaptor.hpp> +#include <boost/bimap/detail/non_unique_views_helper.hpp> +#include <boost/bimap/support/iterator_type_by.hpp> +#include <boost/bimap/detail/map_view_base.hpp> + +namespace boost { +namespace bimaps { +namespace views { + +/// \brief View of a side of a bimap that is signature compatible with std::multimap. +/** + +This class uses container_adaptor and iterator_adaptor to wrapped a index of the +multi_index bimap core so it can be used as a std::multimap. + +See also const_multimap_view. + **/ + +template< class Tag, class BimapType > +class multimap_view +: + public BOOST_BIMAP_MAP_VIEW_CONTAINER_ADAPTOR( + multimap_adaptor, + Tag,BimapType, + reverse_map_view_iterator,const_reverse_map_view_iterator + ), + public ::boost::bimaps::detail:: + map_view_base< multimap_view<Tag,BimapType>,Tag,BimapType > + +{ + typedef BOOST_BIMAP_MAP_VIEW_CONTAINER_ADAPTOR( + multimap_adaptor, + Tag,BimapType, + reverse_map_view_iterator,const_reverse_map_view_iterator + + ) base_; + + BOOST_BIMAP_MAP_VIEW_BASE_FRIEND(multimap_view,Tag,BimapType) + + public: + + typedef BOOST_DEDUCED_TYPENAME base_::value_type::info_type info_type; + + multimap_view(BOOST_DEDUCED_TYPENAME base_::base_type & c) + : base_(c) {} + + BOOST_BIMAP_MAP_VIEW_RANGE_IMPLEMENTATION(base_) + + multimap_view & operator=(const multimap_view & v) + { + this->base() = v.base(); + return *this; + } + + BOOST_BIMAP_NON_UNIQUE_VIEW_INSERT_FUNCTIONS +}; + + +} // namespace views + +/*===========================================================================*/ +#define BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,TYPENAME) \ +typedef BOOST_DEDUCED_TYPENAME MAP_VIEW::TYPENAME \ + BOOST_PP_CAT(SIDE,BOOST_PP_CAT(_,TYPENAME)); +/*===========================================================================*/ + +/*===========================================================================*/ +#define BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY(MAP_VIEW,SIDE) \ + BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,reverse_iterator) \ + BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,const_reverse_iterator) \ + BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,range_type) \ + BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,const_range_type) \ + BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,key_compare) +/*===========================================================================*/ + +namespace detail { + +template< class Tag, class BimapType > +struct left_map_view_extra_typedefs< ::boost::bimaps::views::multimap_view<Tag,BimapType> > +{ + private: typedef ::boost::bimaps::views::multimap_view<Tag,BimapType> map_view_; + public : BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY(map_view_,left) +}; + +template< class Tag, class BimapType > +struct right_map_view_extra_typedefs< ::boost::bimaps::views::multimap_view<Tag,BimapType> > +{ + private: typedef ::boost::bimaps::views::multimap_view<Tag,BimapType> map_view_; + public : BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY(map_view_,right) +}; + +} // namespace detail + +/*===========================================================================*/ +#undef BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF +#undef BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY +/*===========================================================================*/ + +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_VIEWS_MAP_VIEW_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/views/multiset_view.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/views/multiset_view.hpp new file mode 100644 index 0000000000..6c93b484b9 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/views/multiset_view.hpp @@ -0,0 +1,110 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file views/multiset_view.hpp +/// \brief View of a bimap that is signature compatible with std::multiset. + +#ifndef BOOST_BIMAP_VIEWS_MULTISET_VIEW_HPP +#define BOOST_BIMAP_VIEWS_MULTISET_VIEW_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/container_adaptor/multiset_adaptor.hpp> +#include <boost/bimap/container_adaptor/detail/comparison_adaptor.hpp> +#include <boost/bimap/detail/non_unique_views_helper.hpp> +#include <boost/bimap/detail/set_view_base.hpp> + +namespace boost { +namespace bimaps { +namespace views { + +/// \brief View of a bimap that is signature compatible with std::multiset. +/** + +This class uses container_adaptor and iterator_adaptor to wrapped a index of the +multi_index bimap core so it can be used as a std::multiset. + +See also const_multiset_view. + **/ + +template< class CoreIndex > +class multiset_view +: + public BOOST_BIMAP_SET_VIEW_CONTAINER_ADAPTOR( + multiset_adaptor, + CoreIndex, + reverse_iterator, + const_reverse_iterator + ), + + public ::boost::bimaps::detail:: + set_view_base< multiset_view< CoreIndex >, CoreIndex > +{ + BOOST_BIMAP_SET_VIEW_BASE_FRIEND(multiset_view, CoreIndex) + + typedef BOOST_BIMAP_SET_VIEW_CONTAINER_ADAPTOR( + multiset_adaptor, + CoreIndex, + reverse_iterator, + const_reverse_iterator + + ) base_; + + public: + + multiset_view(BOOST_DEDUCED_TYPENAME base_::base_type & c) : base_(c) {} + + /* + template< class LowerBounder, class UpperBounder > + std::pair<BOOST_DEDUCED_TYPENAME base_::const_iterator, + BOOST_DEDUCED_TYPENAME base_::const_iterator> + range(LowerBounder lower,UpperBounder upper) const + { + return this->base().range( + + ::boost::bimaps::container_adaptor::detail::unary_check_adaptor + < + LowerBounder, + BOOST_DEDUCED_TYPENAME base_::base_type::value_type, + BOOST_DEDUCED_TYPENAME base_::value_from_base + + >( lower, this->template functor< + BOOST_DEDUCED_TYPENAME base_::value_from_base>() ), + + ::boost::bimaps::container_adaptor::detail::unary_check_adaptor + < + UpperBounder, + BOOST_DEDUCED_TYPENAME base_::base_type::value_type, + BOOST_DEDUCED_TYPENAME base_::value_from_base + + >( upper, this->template functor< + BOOST_DEDUCED_TYPENAME base_::value_from_base>() ) + + ); + } + */ + + multiset_view & operator=(const multiset_view & v) + { + this->base() = v.base(); return *this; + } + + BOOST_BIMAP_NON_UNIQUE_VIEW_INSERT_FUNCTIONS +}; + + +} // namespace views +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_VIEWS_MULTISET_VIEW_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/views/set_view.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/views/set_view.hpp new file mode 100644 index 0000000000..de5e6da99d --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/views/set_view.hpp @@ -0,0 +1,106 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file views/set_view.hpp +/// \brief View of a bimap that is signature compatible with std::set. + +#ifndef BOOST_BIMAP_VIEWS_SET_VIEW_HPP +#define BOOST_BIMAP_VIEWS_SET_VIEW_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/container_adaptor/set_adaptor.hpp> +#include <boost/bimap/detail/set_view_base.hpp> + +namespace boost { +namespace bimaps { +namespace views { + +/// \brief View of a bimap that is signature compatible with std::set. +/** + +This class uses container_adaptor and iterator_adaptor to wrapped a index of the +multi_index bimap core so it can be used as a std::set. + +See also const_set_view. + **/ + +template< class CoreIndex > +class set_view +: + public BOOST_BIMAP_SET_VIEW_CONTAINER_ADAPTOR( + set_adaptor, + CoreIndex, + reverse_iterator, const_reverse_iterator + ), + + public ::boost::bimaps::detail:: + set_view_base< set_view< CoreIndex >, CoreIndex > +{ + typedef BOOST_BIMAP_SET_VIEW_CONTAINER_ADAPTOR( + set_adaptor, + CoreIndex, + reverse_iterator, const_reverse_iterator + + ) base_; + + BOOST_BIMAP_SET_VIEW_BASE_FRIEND(set_view,CoreIndex) + + public: + + set_view(BOOST_DEDUCED_TYPENAME base_::base_type & c) : base_(c) {} + + /* + template< class LowerBounder, class UpperBounder > + std::pair<BOOST_DEDUCED_TYPENAME base_::const_iterator, + BOOST_DEDUCED_TYPENAME base_::const_iterator> + range(LowerBounder lower,UpperBounder upper) const + { + return this->base().range( + + ::boost::bimaps::container_adaptor::detail::unary_check_adaptor + < + LowerBounder, + BOOST_DEDUCED_TYPENAME base_::base_type::value_type, + BOOST_DEDUCED_TYPENAME base_::value_from_base + + >( lower, this->template functor< + BOOST_DEDUCED_TYPENAME base_::value_from_base>() ), + + ::boost::bimaps::container_adaptor::detail::unary_check_adaptor + < + UpperBounder, + BOOST_DEDUCED_TYPENAME base_::base_type::value_type, + BOOST_DEDUCED_TYPENAME base_::value_from_base + + >( upper, this->template functor< + BOOST_DEDUCED_TYPENAME base_::value_from_base>() ) + + ); + } + */ + + set_view & operator=(const set_view & v) + { + this->base() = v.base(); + return *this; + } +}; + + +} // namespace views +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_VIEWS_SET_VIEW_HPP + + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/views/unconstrained_map_view.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/views/unconstrained_map_view.hpp new file mode 100644 index 0000000000..863c7df918 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/views/unconstrained_map_view.hpp @@ -0,0 +1,46 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file views/unconstrained_map_view.hpp +/// \brief Unconstrained view of a side of a bimap. + +#ifndef BOOST_BIMAP_VIEWS_UNCONSTRAINED_MAP_VIEW_HPP +#define BOOST_BIMAP_VIEWS_UNCONSTRAINED_MAP_VIEW_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +namespace boost { +namespace bimaps { +namespace views { + +/// \brief Unconstrained view of a side of a bimap. + +template< class Tag, class BimapType> +class unconstrained_map_view +{ + public: + template< class T > + unconstrained_map_view(const T &) {} + + typedef void iterator; + typedef void const_iterator; + typedef void reference; + typedef void const_reference; + typedef void info_type; +}; + +} // namespace views +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_VIEWS_UNCONSTRAINED_MAP_VIEW_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/views/unconstrained_set_view.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/views/unconstrained_set_view.hpp new file mode 100644 index 0000000000..35cf2e55d4 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/views/unconstrained_set_view.hpp @@ -0,0 +1,42 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file views/unconstrained_set_view.hpp +/// \brief Unconstrained view of a bimap. + +#ifndef BOOST_BIMAP_VIEWS_UNCONSTRAINED_SET_VIEW_HPP +#define BOOST_BIMAP_VIEWS_UNCONSTRAINED_SET_VIEW_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +namespace boost { +namespace bimaps { +namespace views { + +/// \brief Unconstrained view of a bimap. + +template< class CoreIndex > +class unconstrained_set_view +{ + public: + template< class T > + unconstrained_set_view(const T &) {} + + typedef void iterator; + typedef void const_iterator; +}; + +} // namespace views +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_VIEWS_UNCONSTRAINED_SET_VIEW_HPP diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/views/unordered_map_view.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/views/unordered_map_view.hpp new file mode 100644 index 0000000000..c41fcbd9b4 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/views/unordered_map_view.hpp @@ -0,0 +1,174 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file views/unordered_map_view.hpp +/// \brief View of a side of a bimap that is signature compatible with tr1::unordered_map. + +#ifndef BOOST_BIMAP_VIEWS_UNOREDERED_MAP_VIEW_HPP +#define BOOST_BIMAP_VIEWS_UNOREDERED_MAP_VIEW_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <utility> + +#include <boost/bimap/container_adaptor/unordered_map_adaptor.hpp> +#include <boost/bimap/detail/map_view_base.hpp> + +namespace boost { +namespace bimaps { +namespace views { + +/// \brief Map View of a bimap, signature compatible with tr1::unordered_map. +/** + +This class uses container_adaptor and iterator_adaptor to wrapped a index of the +multi_index bimap core so it can be used as a tr1::unordered_map. + +See also const_unordered_map_view. + **/ + + +template< class Tag, class BimapType > +class unordered_map_view +: + public BOOST_BIMAP_MAP_VIEW_CONTAINER_ADAPTOR( + unordered_map_adaptor, + Tag,BimapType, + local_map_view_iterator,const_local_map_view_iterator + ), + + public ::boost::bimaps::detail::map_view_base< + unordered_map_view<Tag,BimapType>,Tag,BimapType >, + public ::boost::bimaps::detail:: + unique_map_view_access< + unordered_map_view<Tag,BimapType>, Tag, BimapType>::type + +{ + typedef BOOST_BIMAP_MAP_VIEW_CONTAINER_ADAPTOR( + unordered_map_adaptor, + Tag,BimapType, + local_map_view_iterator,const_local_map_view_iterator + + ) base_; + + BOOST_BIMAP_MAP_VIEW_BASE_FRIEND(unordered_map_view,Tag,BimapType) + + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::detail:: + unique_map_view_access< + unordered_map_view<Tag,BimapType>, Tag, BimapType + + >::type unique_map_view_access_; + + public: + + typedef std::pair< + BOOST_DEDUCED_TYPENAME base_::iterator, + BOOST_DEDUCED_TYPENAME base_::iterator + > range_type; + + typedef std::pair< + BOOST_DEDUCED_TYPENAME base_::const_iterator, + BOOST_DEDUCED_TYPENAME base_::const_iterator + > const_range_type; + + typedef BOOST_DEDUCED_TYPENAME base_::value_type::info_type info_type; + + unordered_map_view(BOOST_DEDUCED_TYPENAME base_::base_type & c) + : base_(c) {} + + using unique_map_view_access_::at; + using unique_map_view_access_::operator[]; + + unordered_map_view & operator=(const unordered_map_view & v) + { + this->base() = v.base(); + return *this; + } + + // It can be used enable_if here but the error message when there + // is no info is very clear like this + + template< class CompatibleKey > + const info_type & info_at(const CompatibleKey& k) const + { + BOOST_DEDUCED_TYPENAME base_::const_iterator iter = this->find(k); + if( iter == this->end() ) + { + ::boost::throw_exception( + std::out_of_range("bimap<>: invalid key") + ); + } + return iter->info; + } + + template< class CompatibleKey > + info_type & info_at(const CompatibleKey& k) + { + BOOST_DEDUCED_TYPENAME base_::iterator iter = this->find(k); + if( iter == this->end() ) + { + ::boost::throw_exception( + std::out_of_range("bimap<>: invalid key") + ); + } + return iter->info; + } +}; + + +} // namespace views + +/*===========================================================================*/ +#define BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,TYPENAME) \ +typedef BOOST_DEDUCED_TYPENAME MAP_VIEW::TYPENAME \ + BOOST_PP_CAT(SIDE,BOOST_PP_CAT(_,TYPENAME)); +/*===========================================================================*/ + +/*===========================================================================*/ +#define BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY(MAP_VIEW,SIDE) \ + BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,local_iterator) \ + BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,const_local_iterator) \ + BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,range_type) \ + BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,const_range_type) \ + BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,hasher) \ + BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,key_equal) +/*===========================================================================*/ + +namespace detail { + +template< class Tag, class BimapType > +struct left_map_view_extra_typedefs< ::boost::bimaps::views::unordered_map_view<Tag,BimapType> > +{ + private: typedef ::boost::bimaps::views::unordered_map_view<Tag,BimapType> map_view_; + public : BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY(map_view_,left) +}; + +template< class Tag, class BimapType > +struct right_map_view_extra_typedefs< ::boost::bimaps::views::unordered_map_view<Tag,BimapType> > +{ + private: typedef ::boost::bimaps::views::unordered_map_view<Tag,BimapType> map_view_; + public : BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY(map_view_,right) +}; + +} // namespace detail + +/*===========================================================================*/ +#undef BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF +#undef BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY +/*===========================================================================*/ + +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_VIEWS_UNOREDERED_MAP_VIEW_HPP + + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/views/unordered_multimap_view.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/views/unordered_multimap_view.hpp new file mode 100644 index 0000000000..17faf27322 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/views/unordered_multimap_view.hpp @@ -0,0 +1,136 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file views/unordered_multimap_view.hpp +/// \brief View of a side of a bimap that is signature compatible with tr1::unordered_multimap. + +#ifndef BOOST_BIMAP_VIEWS_UNOREDERED_MULTIMAP_VIEW_HPP +#define BOOST_BIMAP_VIEWS_UNOREDERED_MULTIMAP_VIEW_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <utility> + +#include <boost/bimap/container_adaptor/unordered_multimap_adaptor.hpp> +#include <boost/bimap/detail/non_unique_views_helper.hpp> +#include <boost/bimap/support/iterator_type_by.hpp> +#include <boost/bimap/detail/map_view_base.hpp> + +namespace boost { +namespace bimaps { +namespace views { + +/// \brief View of a side of a bimap that is signature compatible with tr1::unordered_multimap. +/** + +This class uses container_adaptor and iterator_adaptor to wrapped a index of the +multi_index bimap core so it can be used as a tr1::unordered_multimap. + +See also const_unordered_multimap_view. + **/ + +template< class Tag, class BimapType > +class unordered_multimap_view +: + public BOOST_BIMAP_MAP_VIEW_CONTAINER_ADAPTOR( + unordered_multimap_adaptor, + Tag,BimapType, + local_map_view_iterator,const_local_map_view_iterator + ), + + public ::boost::bimaps::detail::map_view_base< + unordered_multimap_view<Tag,BimapType>,Tag,BimapType > + +{ + typedef BOOST_BIMAP_MAP_VIEW_CONTAINER_ADAPTOR( + unordered_multimap_adaptor, + Tag,BimapType, + local_map_view_iterator,const_local_map_view_iterator + + ) base_; + + BOOST_BIMAP_MAP_VIEW_BASE_FRIEND(unordered_multimap_view,Tag,BimapType) + + public: + + typedef std::pair< + BOOST_DEDUCED_TYPENAME base_::iterator, + BOOST_DEDUCED_TYPENAME base_::iterator + > range_type; + + typedef std::pair< + BOOST_DEDUCED_TYPENAME base_::const_iterator, + BOOST_DEDUCED_TYPENAME base_::const_iterator + > const_range_type; + + typedef BOOST_DEDUCED_TYPENAME base_::value_type::info_type info_type; + + unordered_multimap_view(BOOST_DEDUCED_TYPENAME base_::base_type & c) + : base_(c) {} + + BOOST_BIMAP_NON_UNIQUE_VIEW_INSERT_FUNCTIONS + + unordered_multimap_view & operator=(const unordered_multimap_view & v) + { + this->base() = v.base(); + return *this; + } +}; + + +} // namespace views + +/*===========================================================================*/ +#define BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,TYPENAME) \ +typedef BOOST_DEDUCED_TYPENAME MAP_VIEW::TYPENAME \ + BOOST_PP_CAT(SIDE,BOOST_PP_CAT(_,TYPENAME)); +/*===========================================================================*/ + +/*===========================================================================*/ +#define BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY(MAP_VIEW,SIDE) \ + BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,local_iterator) \ + BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,const_local_iterator) \ + BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,range_type) \ + BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,const_range_type) \ + BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,hasher) \ + BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,key_equal) +/*===========================================================================*/ + +namespace detail { + +template< class Tag, class BimapType > +struct left_map_view_extra_typedefs< ::boost::bimaps::views::unordered_multimap_view<Tag,BimapType> > +{ + private: typedef ::boost::bimaps::views::unordered_multimap_view<Tag,BimapType> map_view_; + public : BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY(map_view_,left) +}; + +template< class Tag, class BimapType > +struct right_map_view_extra_typedefs< ::boost::bimaps::views::unordered_multimap_view<Tag,BimapType> > +{ + private: typedef ::boost::bimaps::views::unordered_multimap_view<Tag,BimapType> map_view_; + public : BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY(map_view_,right) +}; + +} // namespace detail + +/*===========================================================================*/ +#undef BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF +#undef BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY +/*===========================================================================*/ + +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_VIEWS_UNOREDERED_MULTIMAP_VIEW_HPP + + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/views/unordered_multiset_view.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/views/unordered_multiset_view.hpp new file mode 100644 index 0000000000..d1d137d0eb --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/views/unordered_multiset_view.hpp @@ -0,0 +1,83 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file views/unordered_multiset_view.hpp +/// \brief View of a bimap that is signature compatible with tr1::unordered_multiset. + +#ifndef BOOST_BIMAP_VIEWS_UNORDERED_MULTISET_VIEW_HPP +#define BOOST_BIMAP_VIEWS_UNORDERED_MULTISET_VIEW_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/container_adaptor/unordered_multiset_adaptor.hpp> +#include <boost/bimap/detail/non_unique_views_helper.hpp> +#include <boost/bimap/detail/set_view_base.hpp> + +namespace boost { +namespace bimaps { +namespace views { + +/// \brief View of a bimap that is signature compatible with std::unordered_multiset. +/** + +This class uses container_adaptor and iterator_adaptor to wrapped a index of the +multi_index bimap core so it can be used as a std::unordered_multiset. + +See also const_unordered_multiset_view. + **/ + +template< class CoreIndex > +class unordered_multiset_view +: + public BOOST_BIMAP_SET_VIEW_CONTAINER_ADAPTOR( + unordered_multiset_adaptor, + CoreIndex, + local_iterator, + const_local_iterator + + ), + + public ::boost::bimaps::detail:: + set_view_base< unordered_multiset_view< CoreIndex >, CoreIndex > +{ + BOOST_BIMAP_SET_VIEW_BASE_FRIEND(unordered_multiset_view,CoreIndex) + + typedef BOOST_BIMAP_SET_VIEW_CONTAINER_ADAPTOR( + unordered_multiset_adaptor, + CoreIndex, + local_iterator, + const_local_iterator + + ) base_; + + public: + + unordered_multiset_view(BOOST_DEDUCED_TYPENAME base_::base_type & c) + : base_(c) {} + + BOOST_BIMAP_NON_UNIQUE_VIEW_INSERT_FUNCTIONS + + unordered_multiset_view & operator=(const unordered_multiset_view & v) + { + this->base() = v.base(); + return *this; + } +}; + + +} // namespace views +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_VIEWS_UNORDERED_MULTISET_VIEW_HPP + + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/views/unordered_set_view.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/views/unordered_set_view.hpp new file mode 100644 index 0000000000..c2a8ae3b5e --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/views/unordered_set_view.hpp @@ -0,0 +1,78 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file views/unordered_set_view.hpp +/// \brief View of a bimap that is signature compatible with tr1::unordered_set. + +#ifndef BOOST_BIMAP_VIEWS_UNORDERED_SET_VIEW_HPP +#define BOOST_BIMAP_VIEWS_UNORDERED_SET_VIEW_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/container_adaptor/unordered_set_adaptor.hpp> +#include <boost/bimap/detail/set_view_base.hpp> + +namespace boost { +namespace bimaps { +namespace views { + +/// \brief View of a bimap that is signature compatible with std::unordered_set. +/** + +This class uses container_adaptor and iterator_adaptor to wrapped a index of the +multi_index bimap core so it can be used as a std::unordered_set. + +See also const_unordered_set_view. + **/ + +template< class CoreIndex > +class unordered_set_view +: + public BOOST_BIMAP_SET_VIEW_CONTAINER_ADAPTOR( + unordered_set_adaptor, + CoreIndex, + local_iterator, + const_local_iterator + ), + + public ::boost::bimaps::detail:: + set_view_base< unordered_set_view< CoreIndex >, CoreIndex > +{ + BOOST_BIMAP_SET_VIEW_BASE_FRIEND(unordered_set_view,CoreIndex) + + typedef BOOST_BIMAP_SET_VIEW_CONTAINER_ADAPTOR( + unordered_set_adaptor, + CoreIndex, + local_iterator, + const_local_iterator + + ) base_; + + public: + + unordered_set_view(BOOST_DEDUCED_TYPENAME base_::base_type & c) + : base_(c) {} + + unordered_set_view & operator=(const unordered_set_view & v) + { + this->base() = v.base(); + return *this; + } +}; + + +} // namespace views +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_VIEWS_UNORDERED_SET_VIEW_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/views/vector_map_view.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/views/vector_map_view.hpp new file mode 100644 index 0000000000..a22bb57f39 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/views/vector_map_view.hpp @@ -0,0 +1,340 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file views/vector_map_view.hpp +/// \brief View of a side of a bimap. + +#ifndef BOOST_BIMAP_VIEWS_VECTOR_MAP_VIEW_HPP +#define BOOST_BIMAP_VIEWS_VECTOR_MAP_VIEW_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/container_adaptor/vector_map_adaptor.hpp> +#include <boost/bimap/support/iterator_type_by.hpp> +#include <boost/bimap/detail/map_view_base.hpp> +#include <boost/bimap/container_adaptor/detail/comparison_adaptor.hpp> + +namespace boost { +namespace bimaps { +namespace views { + +/// \brief View of a side of a bimap. +/** + +This class uses container_adaptor and iterator_adaptor to wrapped a index of the +multi_index bimap core. + +See also const_map_view. + **/ +template< class Tag, class BimapType > +class vector_map_view +: + public BOOST_BIMAP_MAP_VIEW_CONTAINER_ADAPTOR( + vector_map_adaptor, + Tag,BimapType, + reverse_map_view_iterator, const_reverse_map_view_iterator + ), + + public ::boost::bimaps::detail:: + map_view_base< vector_map_view<Tag,BimapType>,Tag,BimapType > +{ + typedef BOOST_BIMAP_MAP_VIEW_CONTAINER_ADAPTOR( + vector_map_adaptor, + Tag,BimapType, + reverse_map_view_iterator, const_reverse_map_view_iterator + + ) base_; + + BOOST_BIMAP_MAP_VIEW_BASE_FRIEND(vector_map_view,Tag,BimapType) + + typedef BOOST_DEDUCED_TYPENAME ::boost::bimaps::relation::support::data_extractor + < + Tag, + BOOST_DEDUCED_TYPENAME BimapType::relation + + >::type key_from_base_value; + + public: + + typedef BOOST_DEDUCED_TYPENAME base_::value_type::info_type info_type; + + vector_map_view(BOOST_DEDUCED_TYPENAME base_::base_type & c) : + base_(c) {} + + vector_map_view & operator=(const vector_map_view & v) + { + this->base() = v.base(); + return *this; + } + + BOOST_DEDUCED_TYPENAME base_::const_reference + operator[](BOOST_DEDUCED_TYPENAME base_::size_type n) const + { + return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()( + this->base().operator[](n) + ); + } + + BOOST_DEDUCED_TYPENAME base_::const_reference + at(BOOST_DEDUCED_TYPENAME base_::size_type n) const + { + return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()( + this->base().at(n) + ); + } + + BOOST_DEDUCED_TYPENAME base_::reference + operator[](BOOST_DEDUCED_TYPENAME base_::size_type n) + { + return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()( + const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type &>( + this->base().operator[](n) + )); + } + + BOOST_DEDUCED_TYPENAME base_::reference + at(BOOST_DEDUCED_TYPENAME base_::size_type n) + { + return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()( + const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type &>( + this->base().at(n) + )); + } + + BOOST_BIMAP_VIEW_ASSIGN_IMPLEMENTATION(base_) + + BOOST_BIMAP_VIEW_FRONT_BACK_IMPLEMENTATION(base_) + + // Lists operations + + void splice(BOOST_DEDUCED_TYPENAME base_::iterator position, vector_map_view & x) + { + this->base().splice( + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position), + x.base() + ); + } + + void splice(BOOST_DEDUCED_TYPENAME base_::iterator position, + vector_map_view & x, + BOOST_DEDUCED_TYPENAME base_::iterator i) + { + this->base().splice( + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position), + x.base(), + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(i) + ); + } + + void splice(BOOST_DEDUCED_TYPENAME base_::iterator position, + vector_map_view & x, + BOOST_DEDUCED_TYPENAME base_::iterator first, + BOOST_DEDUCED_TYPENAME base_::iterator last) + { + this->base().splice( + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position), + x.base(), + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(first), + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(last) + ); + } + + void remove(BOOST_DEDUCED_TYPENAME ::boost::call_traits< + BOOST_DEDUCED_TYPENAME base_::value_type >::param_type value) + { + this->base().remove( + this->template functor< + BOOST_DEDUCED_TYPENAME base_::value_to_base>()(value) + ); + } + + template< class Predicate > + void remove_if(Predicate pred) + { + this->base().remove_if( + ::boost::bimaps::container_adaptor::detail::unary_check_adaptor + < + Predicate, + BOOST_DEDUCED_TYPENAME base_::base_type::value_type, + key_from_base_value + + >( pred, key_from_base_value() ) + ); + } + + void unique() + { + this->base().unique( + ::boost::bimaps::container_adaptor::detail::comparison_adaptor + < + std::equal_to<BOOST_DEDUCED_TYPENAME base_::key_type>, + BOOST_DEDUCED_TYPENAME base_::base_type::value_type, + key_from_base_value + + >(std::equal_to<BOOST_DEDUCED_TYPENAME base_::key_type>(), + key_from_base_value() ) + ); + } + + template< class BinaryPredicate > + void unique(BinaryPredicate binary_pred) + { + this->base().unique( + ::boost::bimaps::container_adaptor::detail::comparison_adaptor + < + BinaryPredicate, + BOOST_DEDUCED_TYPENAME base_::base_type::value_type, + key_from_base_value + + >( binary_pred, key_from_base_value() ) + ); + } + + void merge(vector_map_view & x) + { + this->base().merge(x.base(), + ::boost::bimaps::container_adaptor::detail::comparison_adaptor + < + std::less<BOOST_DEDUCED_TYPENAME base_::key_type>, + BOOST_DEDUCED_TYPENAME base_::base_type::value_type, + key_from_base_value + + >( std::less<BOOST_DEDUCED_TYPENAME base_::key_type>(), + key_from_base_value() ) + ); + } + + template< class Compare > + void merge(vector_map_view & x, Compare comp) + { + this->base().merge(x.base(), + ::boost::bimaps::container_adaptor::detail::comparison_adaptor + < + Compare, + BOOST_DEDUCED_TYPENAME base_::base_type::value_type, + key_from_base_value + + >( comp, key_from_base_value() ) + ); + } + + void sort() + { + this->base().sort( + ::boost::bimaps::container_adaptor::detail::comparison_adaptor + < + std::less<BOOST_DEDUCED_TYPENAME base_::key_type>, + BOOST_DEDUCED_TYPENAME base_::base_type::value_type, + key_from_base_value + + >( std::less<BOOST_DEDUCED_TYPENAME base_::key_type>(), + key_from_base_value() ) + ); + } + + template< class Compare > + void sort(Compare comp) + { + this->base().sort( + ::boost::bimaps::container_adaptor::detail::comparison_adaptor + < + Compare, + BOOST_DEDUCED_TYPENAME base_::base_type::value_type, + key_from_base_value + + >( comp, key_from_base_value() ) + ); + } + + void reverse() + { + this->base().reverse(); + } + + // Rearrange Operations + + void relocate(BOOST_DEDUCED_TYPENAME base_::iterator position, + BOOST_DEDUCED_TYPENAME base_::iterator i) + { + this->base().relocate( + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position), + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(i) + ); + } + + void relocate(BOOST_DEDUCED_TYPENAME base_::iterator position, + BOOST_DEDUCED_TYPENAME base_::iterator first, + BOOST_DEDUCED_TYPENAME base_::iterator last) + { + this->base().relocate( + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position), + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(first), + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(last) + ); + } + +}; + + +} // namespace views + +/*===========================================================================*/ +#define BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,TYPENAME) \ +typedef BOOST_DEDUCED_TYPENAME MAP_VIEW::TYPENAME \ + BOOST_PP_CAT(SIDE,BOOST_PP_CAT(_,TYPENAME)); +/*===========================================================================*/ + +/*===========================================================================*/ +#define BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY(MAP_VIEW,SIDE) \ + BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,reverse_iterator) \ + BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF(MAP_VIEW,SIDE,const_reverse_iterator) +/*===========================================================================*/ + +namespace detail { + +template< class Tag, class BimapType > +struct left_map_view_extra_typedefs< ::boost::bimaps::views::vector_map_view<Tag,BimapType> > +{ + private: typedef ::boost::bimaps::views::vector_map_view<Tag,BimapType> map_view_; + public : BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY(map_view_,left) +}; + +template< class Tag, class BimapType > +struct right_map_view_extra_typedefs< ::boost::bimaps::views::vector_map_view<Tag,BimapType> > +{ + private: typedef ::boost::bimaps::views::vector_map_view<Tag,BimapType> map_view_; + public : BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY(map_view_,right) +}; + +} // namespace detail + +/*===========================================================================*/ +#undef BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEF +#undef BOOST_BIMAP_MAP_VIEW_EXTRA_TYPEDEFS_BODY +/*===========================================================================*/ + +} // namespace bimaps +} // namespace boost + +#endif // BOOST_BIMAP_VIEWS_VECTOR_MAP_VIEW_HPP + diff --git a/contrib/restricted/boost/bimap/include/boost/bimap/views/vector_set_view.hpp b/contrib/restricted/boost/bimap/include/boost/bimap/views/vector_set_view.hpp new file mode 100644 index 0000000000..207ca7d2a1 --- /dev/null +++ b/contrib/restricted/boost/bimap/include/boost/bimap/views/vector_set_view.hpp @@ -0,0 +1,313 @@ +// Boost.Bimap +// +// Copyright (c) 2006-2007 Matias Capeletto +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +/// \file views/vector_set_view.hpp +/// \brief View of a side of a bimap that is signature compatible with std::vector. + +#ifndef BOOST_BIMAP_VIEWS_VECTOR_SET_VIEW_HPP +#define BOOST_BIMAP_VIEWS_VECTOR_SET_VIEW_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include <boost/config.hpp> + +#include <boost/bimap/container_adaptor/vector_adaptor.hpp> +#include <boost/bimap/container_adaptor/detail/comparison_adaptor.hpp> +#include <boost/bimap/detail/set_view_base.hpp> +#include <boost/bimap/detail/map_view_base.hpp> + +namespace boost { +namespace bimaps { +namespace views { + +/// \brief View of a bimap that is signature compatible with std::vector. +/** + +This class uses container_adaptor and iterator_adaptor to wrapped a index of the +multi_index bimap core so it can be used as a std::vector. + +See also const_set_view. + **/ + +template< class CoreIndex > +class vector_set_view +: + public BOOST_BIMAP_SEQUENCED_SET_VIEW_CONTAINER_ADAPTOR( + vector_adaptor, + CoreIndex, + reverse_iterator, const_reverse_iterator + ), + + public ::boost::bimaps::detail:: + set_view_base< vector_set_view< CoreIndex >, CoreIndex > +{ + BOOST_BIMAP_SET_VIEW_BASE_FRIEND(vector_set_view,CoreIndex) + + typedef BOOST_BIMAP_SEQUENCED_SET_VIEW_CONTAINER_ADAPTOR( + vector_adaptor, + CoreIndex, + reverse_iterator, const_reverse_iterator + + ) base_; + + public: + + vector_set_view(BOOST_DEDUCED_TYPENAME base_::base_type & c) : + base_(c) {} + + vector_set_view & operator=(const vector_set_view & v) + { + this->base() = v.base(); + return *this; + } + + BOOST_DEDUCED_TYPENAME base_::const_reference + operator[](BOOST_DEDUCED_TYPENAME base_::size_type n) const + { + return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()( + this->base().operator[](n) + ); + } + + BOOST_DEDUCED_TYPENAME base_::const_reference + at(BOOST_DEDUCED_TYPENAME base_::size_type n) const + { + return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()( + this->base().at(n) + ); + } + + BOOST_DEDUCED_TYPENAME base_::reference + operator[](BOOST_DEDUCED_TYPENAME base_::size_type n) + { + return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()( + const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type &>( + this->base().operator[](n) + )); + } + + BOOST_DEDUCED_TYPENAME base_::reference + at(BOOST_DEDUCED_TYPENAME base_::size_type n) + { + return this->template functor<BOOST_DEDUCED_TYPENAME base_::value_from_base>()( + const_cast<BOOST_DEDUCED_TYPENAME base_::base_type::value_type &>( + this->base().at(n) + )); + } + + BOOST_BIMAP_VIEW_ASSIGN_IMPLEMENTATION(base_) + + BOOST_BIMAP_VIEW_FRONT_BACK_IMPLEMENTATION(base_) + + // List operations + + void splice(BOOST_DEDUCED_TYPENAME base_::iterator position, + vector_set_view & x) + { + this->base().splice( + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position), + x.base() + ); + } + + void splice(BOOST_DEDUCED_TYPENAME base_::iterator position, + vector_set_view & x, + BOOST_DEDUCED_TYPENAME base_::iterator i) + { + this->base().splice( + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position), + x.base(), + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(i) + ); + } + + void splice(BOOST_DEDUCED_TYPENAME base_::iterator position, + vector_set_view & x, + BOOST_DEDUCED_TYPENAME base_::iterator first, + BOOST_DEDUCED_TYPENAME base_::iterator last) + { + this->base().splice( + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position), + x.base(), + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(first), + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(last) + ); + } + + void remove(BOOST_DEDUCED_TYPENAME ::boost::call_traits< + BOOST_DEDUCED_TYPENAME base_::value_type >::param_type value) + { + this->base().remove( + this->template functor< + BOOST_DEDUCED_TYPENAME base_::value_to_base>()(value) + ); + } + + template<typename Predicate> + void remove_if(Predicate pred) + { + this->base().remove_if( + ::boost::bimaps::container_adaptor::detail::unary_check_adaptor + < + Predicate, + BOOST_DEDUCED_TYPENAME base_::base_type::value_type, + BOOST_DEDUCED_TYPENAME base_::value_from_base + + >( pred, this->template functor< + BOOST_DEDUCED_TYPENAME base_::value_from_base>() ) + ); + } + + void unique() + { + this->base().unique( + ::boost::bimaps::container_adaptor::detail::comparison_adaptor + < + std::equal_to<BOOST_DEDUCED_TYPENAME base_::value_type>, + BOOST_DEDUCED_TYPENAME base_::base_type::value_type, + BOOST_DEDUCED_TYPENAME base_::value_from_base + + >( + std::equal_to<BOOST_DEDUCED_TYPENAME base_::value_type>(), + this->template functor< + BOOST_DEDUCED_TYPENAME base_::value_from_base>() + ) + ); + } + + template< class BinaryPredicate > + void unique(BinaryPredicate binary_pred) + { + this->base().unique( + ::boost::bimaps::container_adaptor::detail::comparison_adaptor + < + BinaryPredicate, + BOOST_DEDUCED_TYPENAME base_::base_type::value_type, + BOOST_DEDUCED_TYPENAME base_::value_from_base + + >( binary_pred, + this->template functor< + BOOST_DEDUCED_TYPENAME base_::value_from_base>() + ) + ); + } + + void merge(vector_set_view & x) + { + this->base().merge(x.base(), + ::boost::bimaps::container_adaptor::detail::comparison_adaptor + < + std::less<BOOST_DEDUCED_TYPENAME base_::value_type>, + BOOST_DEDUCED_TYPENAME base_::base_type::value_type, + BOOST_DEDUCED_TYPENAME base_::value_from_base + + >( + std::less<BOOST_DEDUCED_TYPENAME base_::value_type>(), + this->template functor< + BOOST_DEDUCED_TYPENAME base_::value_from_base>() + ) + ); + } + + template< class Compare > + void merge(vector_set_view & x, Compare comp) + { + this->base().merge(x.base(), + ::boost::bimaps::container_adaptor::detail::comparison_adaptor + < + Compare, + BOOST_DEDUCED_TYPENAME base_::base_type::value_type, + BOOST_DEDUCED_TYPENAME base_::value_from_base + + >( comp, this->template functor< + BOOST_DEDUCED_TYPENAME base_::value_from_base>() ) + ); + } + + void sort() + { + this->base().sort( + ::boost::bimaps::container_adaptor::detail::comparison_adaptor + < + std::less<BOOST_DEDUCED_TYPENAME base_::value_type>, + BOOST_DEDUCED_TYPENAME base_::base_type::value_type, + BOOST_DEDUCED_TYPENAME base_::value_from_base + + >( + std::less<BOOST_DEDUCED_TYPENAME base_::value_type>(), + this->template functor< + BOOST_DEDUCED_TYPENAME base_::value_from_base>() + ) + ); + } + + template< class Compare > + void sort(Compare comp) + { + this->base().sort( + ::boost::bimaps::container_adaptor::detail::comparison_adaptor + < + Compare, + BOOST_DEDUCED_TYPENAME base_::base_type::value_type, + BOOST_DEDUCED_TYPENAME base_::value_from_base + + >( comp, this->template functor< + BOOST_DEDUCED_TYPENAME base_::value_from_base>() ) + ); + } + + void reverse() + { + this->base().reverse(); + } + + // Rearrange Operations + + void relocate(BOOST_DEDUCED_TYPENAME base_::iterator position, + BOOST_DEDUCED_TYPENAME base_::iterator i) + { + this->base().relocate( + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position), + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(i) + ); + } + + void relocate(BOOST_DEDUCED_TYPENAME base_::iterator position, + BOOST_DEDUCED_TYPENAME base_::iterator first, + BOOST_DEDUCED_TYPENAME base_::iterator last) + { + this->base().relocate( + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(position), + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(first), + this->template functor< + BOOST_DEDUCED_TYPENAME base_::iterator_to_base>()(last) + ); + } + +}; + + +} // namespace views +} // namespace bimaps +} // namespace boost + + +#endif // BOOST_BIMAP_VIEWS_VECTOR_SET_VIEW_HPP + |