Added boost header
This commit is contained in:
331
test/external/boost/bimap/detail/set_view_base.hpp
vendored
Normal file
331
test/external/boost/bimap/detail/set_view_base.hpp
vendored
Normal file
@@ -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) && (_MSC_VER>=1200)
|
||||
#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),
|
||||
value_type_(l,position->right)
|
||||
);
|
||||
}
|
||||
|
||||
template< class CompatibleRightType >
|
||||
bool replace_right(iterator_ position,
|
||||
const CompatibleRightType & r)
|
||||
{
|
||||
return derived().base().replace(
|
||||
derived().template functor<iterator_to_base_>()(position),
|
||||
value_type_(position->left,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
|
||||
Reference in New Issue
Block a user