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