Add SCons configure checks
[senf.git] / boost_ext / boost / bimap / detail / set_view_base.hpp
diff --git a/boost_ext/boost/bimap/detail/set_view_base.hpp b/boost_ext/boost/bimap/detail/set_view_base.hpp
new file mode 100644 (file)
index 0000000..b867145
--- /dev/null
@@ -0,0 +1,330 @@
+// 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>
+
+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