summaryrefslogtreecommitdiff
path: root/boost/bimap/container_adaptor/detail/functor_bag.hpp
diff options
context:
space:
mode:
authorAnas Nashif <anas.nashif@intel.com>2012-10-30 12:57:26 -0700
committerAnas Nashif <anas.nashif@intel.com>2012-10-30 12:57:26 -0700
commit1a78a62555be32868418fe52f8e330c9d0f95d5a (patch)
treed3765a80e7d3b9640ec2e930743630cd6b9fce2b /boost/bimap/container_adaptor/detail/functor_bag.hpp
downloadboost-1a78a62555be32868418fe52f8e330c9d0f95d5a.tar.gz
boost-1a78a62555be32868418fe52f8e330c9d0f95d5a.tar.bz2
boost-1a78a62555be32868418fe52f8e330c9d0f95d5a.zip
Imported Upstream version 1.49.0upstream/1.49.0
Diffstat (limited to 'boost/bimap/container_adaptor/detail/functor_bag.hpp')
-rw-r--r--boost/bimap/container_adaptor/detail/functor_bag.hpp100
1 files changed, 100 insertions, 0 deletions
diff --git a/boost/bimap/container_adaptor/detail/functor_bag.hpp b/boost/bimap/container_adaptor/detail/functor_bag.hpp
new file mode 100644
index 0000000000..fd8c435e03
--- /dev/null
+++ b/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) && (_MSC_VER>=1200)
+#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
+
+