summaryrefslogtreecommitdiff
path: root/boost/bimap/relation/detail/access_builder.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/bimap/relation/detail/access_builder.hpp')
-rw-r--r--boost/bimap/relation/detail/access_builder.hpp170
1 files changed, 170 insertions, 0 deletions
diff --git a/boost/bimap/relation/detail/access_builder.hpp b/boost/bimap/relation/detail/access_builder.hpp
new file mode 100644
index 0000000000..a1e939f827
--- /dev/null
+++ b/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) && (_MSC_VER>=1200)
+#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/utility/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
+