diff options
author | Anas Nashif <anas.nashif@intel.com> | 2012-10-30 12:57:26 -0700 |
---|---|---|
committer | Anas Nashif <anas.nashif@intel.com> | 2012-10-30 12:57:26 -0700 |
commit | 1a78a62555be32868418fe52f8e330c9d0f95d5a (patch) | |
tree | d3765a80e7d3b9640ec2e930743630cd6b9fce2b /boost/bimap/container_adaptor/detail/functor_bag.hpp | |
download | boost-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.hpp | 100 |
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 + + |