Blame boost/type_erasure/constructible.hpp

Packit 58578d
// Boost.TypeErasure library
Packit 58578d
//
Packit 58578d
// Copyright 2011 Steven Watanabe
Packit 58578d
//
Packit 58578d
// Distributed under the Boost Software License Version 1.0. (See
Packit 58578d
// accompanying file LICENSE_1_0.txt or copy at
Packit 58578d
// http://www.boost.org/LICENSE_1_0.txt)
Packit 58578d
//
Packit 58578d
// $Id$
Packit 58578d
Packit 58578d
#if !defined(BOOST_PP_IS_ITERATING)
Packit 58578d
Packit 58578d
#ifndef BOOST_TYPE_ERASURE_CONSTRUCTIBLE_HPP_INCLUDED
Packit 58578d
#define BOOST_TYPE_ERASURE_CONSTRUCTIBLE_HPP_INCLUDED
Packit 58578d
Packit 58578d
#include <boost/detail/workaround.hpp>
Packit 58578d
#include <boost/preprocessor/iteration/iterate.hpp>
Packit 58578d
#include <boost/preprocessor/repetition/enum_params.hpp>
Packit 58578d
#include <boost/preprocessor/repetition/enum_binary_params.hpp>
Packit 58578d
#include <boost/preprocessor/repetition/enum_trailing_params.hpp>
Packit 58578d
#include <boost/type_erasure/detail/storage.hpp>
Packit 58578d
#include <boost/type_erasure/call.hpp>
Packit 58578d
#include <boost/type_erasure/concept_interface.hpp>
Packit 58578d
#include <boost/type_erasure/config.hpp>
Packit 58578d
#include <boost/type_erasure/param.hpp>
Packit 58578d
Packit 58578d
namespace boost {
Packit 58578d
namespace type_erasure {
Packit 58578d
Packit 58578d
template<class Sig>
Packit 58578d
struct constructible;
Packit 58578d
Packit 58578d
namespace detail {
Packit 58578d
    
Packit 58578d
template<class Sig>
Packit 58578d
struct null_construct;
Packit 58578d
Packit 58578d
template<class C>
Packit 58578d
struct get_null_vtable_entry;
Packit 58578d
Packit 58578d
template<class C, class Sig>
Packit 58578d
struct vtable_adapter;
Packit 58578d
Packit 58578d
};
Packit 58578d
Packit 58578d
#ifdef BOOST_TYPE_ERASURE_DOXYGEN
Packit 58578d
Packit 58578d
/**
Packit 58578d
 * The @ref constructible concept enables calling the
Packit 58578d
 * constructor of a type contained by an @ref any.
Packit 58578d
 * @c Sig should be a function signature.  The return
Packit 58578d
 * type is the placeholder specifying the type to
Packit 58578d
 * be constructed.  The arguments are the argument
Packit 58578d
 * types of the constructor.  The arguments of
Packit 58578d
 * @c Sig may be placeholders.
Packit 58578d
 *
Packit 58578d
 * \note @ref constructible may not be specialized and
Packit 58578d
 * may not be passed to \call as it depends on the
Packit 58578d
 * implementation details of @ref any.
Packit 58578d
 */
Packit 58578d
template<class Sig>
Packit 58578d
struct constructible {};
Packit 58578d
Packit 58578d
#elif !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && \
Packit 58578d
    !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && \
Packit 58578d
    !BOOST_WORKAROUND(BOOST_MSVC, == 1800)
Packit 58578d
Packit 58578d
template<class R, class... T>
Packit 58578d
struct constructible<R(T...)>
Packit 58578d
{
Packit 58578d
    static ::boost::type_erasure::detail::storage
Packit 58578d
    apply(T... arg)
Packit 58578d
    {
Packit 58578d
        ::boost::type_erasure::detail::storage result;
Packit 58578d
        result.data = new R(::std::forward<T>(arg)...);
Packit 58578d
        return result;
Packit 58578d
    }
Packit 58578d
};
Packit 58578d
Packit 58578d
/// INTERNAL ONLY
Packit 58578d
template<class Base, class Tag, class... T>
Packit 58578d
struct concept_interface<
Packit 58578d
    ::boost::type_erasure::constructible<Tag(T...)>,
Packit 58578d
    Base,
Packit 58578d
    Tag
Packit 58578d
> : Base
Packit 58578d
{
Packit 58578d
    using Base::_boost_type_erasure_deduce_constructor;
Packit 58578d
    ::boost::type_erasure::constructible<Tag(T...)>*
Packit 58578d
    _boost_type_erasure_deduce_constructor(
Packit 58578d
        typename ::boost::type_erasure::as_param<Base, T>::type...)
Packit 58578d
    {
Packit 58578d
        return 0;
Packit 58578d
    }
Packit 58578d
};
Packit 58578d
Packit 58578d
namespace detail {
Packit 58578d
Packit 58578d
template<class... T>
Packit 58578d
struct null_construct<void(T...)>
Packit 58578d
{
Packit 58578d
    static ::boost::type_erasure::detail::storage
Packit 58578d
    value(T...)
Packit 58578d
    {
Packit 58578d
        ::boost::type_erasure::detail::storage result;
Packit 58578d
        result.data = 0;
Packit 58578d
        return result;
Packit 58578d
    }
Packit 58578d
};
Packit 58578d
Packit 58578d
template<class T, class R, class... U>
Packit 58578d
struct get_null_vtable_entry<vtable_adapter<constructible<T(const T&)>, R(U...)> >
Packit 58578d
{
Packit 58578d
    typedef null_construct<void(U...)> type;
Packit 58578d
};
Packit 58578d
Packit 58578d
}
Packit 58578d
Packit 58578d
#else
Packit 58578d
Packit 58578d
#define BOOST_PP_FILENAME_1 <boost/type_erasure/constructible.hpp>
Packit 58578d
#define BOOST_PP_ITERATION_LIMITS (0, BOOST_TYPE_ERASURE_MAX_ARITY)
Packit 58578d
#include BOOST_PP_ITERATE()
Packit 58578d
Packit 58578d
#endif
Packit 58578d
Packit 58578d
}
Packit 58578d
}
Packit 58578d
Packit 58578d
#endif
Packit 58578d
Packit 58578d
#else
Packit 58578d
Packit 58578d
#define N BOOST_PP_ITERATION()
Packit 58578d
Packit 58578d
#define BOOST_TYPE_ERASURE_ARG_DECL(z, n, data)     \
Packit 58578d
    typename ::boost::type_erasure::as_param<          \
Packit 58578d
        Base,                                       \
Packit 58578d
        BOOST_PP_CAT(T, n)                          \
Packit 58578d
    >::type
Packit 58578d
Packit 58578d
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
Packit 58578d
#define BOOST_TYPE_ERASURE_FORWARD_I(z, n, data) ::std::forward<BOOST_PP_CAT(T, n)>(BOOST_PP_CAT(arg, n))
Packit 58578d
#define BOOST_TYPE_ERASURE_FORWARD(n) BOOST_PP_ENUM(n, BOOST_TYPE_ERASURE_FORWARD_I, ~)
Packit 58578d
#else
Packit 58578d
#define BOOST_TYPE_ERASURE_FORWARD(n) BOOST_PP_ENUM_PARAMS(n, arg)
Packit 58578d
#endif
Packit 58578d
Packit 58578d
template<class R BOOST_PP_ENUM_TRAILING_PARAMS(N, class T)>
Packit 58578d
struct constructible<R(BOOST_PP_ENUM_PARAMS(N, T))>
Packit 58578d
{
Packit 58578d
    static ::boost::type_erasure::detail::storage
Packit 58578d
    apply(BOOST_PP_ENUM_BINARY_PARAMS(N, T, arg))
Packit 58578d
    {
Packit 58578d
        ::boost::type_erasure::detail::storage result;
Packit 58578d
        result.data = new R(BOOST_TYPE_ERASURE_FORWARD(N));
Packit 58578d
        return result;
Packit 58578d
    }
Packit 58578d
};
Packit 58578d
Packit 58578d
template<class Base BOOST_PP_ENUM_TRAILING_PARAMS(N, class T), class Tag>
Packit 58578d
struct concept_interface<
Packit 58578d
    ::boost::type_erasure::constructible<Tag(BOOST_PP_ENUM_PARAMS(N, T))>,
Packit 58578d
    Base,
Packit 58578d
    Tag
Packit 58578d
> : Base
Packit 58578d
{
Packit 58578d
    using Base::_boost_type_erasure_deduce_constructor;
Packit 58578d
    ::boost::type_erasure::constructible<Tag(BOOST_PP_ENUM_PARAMS(N, T))>*
Packit 58578d
    _boost_type_erasure_deduce_constructor(
Packit 58578d
        BOOST_PP_ENUM(N, BOOST_TYPE_ERASURE_ARG_DECL, ~))
Packit 58578d
    {
Packit 58578d
        return 0;
Packit 58578d
    }
Packit 58578d
};
Packit 58578d
Packit 58578d
namespace detail {
Packit 58578d
Packit 58578d
template<BOOST_PP_ENUM_PARAMS(N, class T)>
Packit 58578d
struct null_construct<void(BOOST_PP_ENUM_PARAMS(N, T))>
Packit 58578d
{
Packit 58578d
    static ::boost::type_erasure::detail::storage
Packit 58578d
    value(BOOST_PP_ENUM_PARAMS(N, T))
Packit 58578d
    {
Packit 58578d
        ::boost::type_erasure::detail::storage result;
Packit 58578d
        result.data = 0;
Packit 58578d
        return result;
Packit 58578d
    }
Packit 58578d
};
Packit 58578d
Packit 58578d
template<class T, class R BOOST_PP_ENUM_TRAILING_PARAMS(N, class T)>
Packit 58578d
struct get_null_vtable_entry<vtable_adapter<constructible<T(const T&)>, R(BOOST_PP_ENUM_PARAMS(N, T))> >
Packit 58578d
{
Packit 58578d
    typedef null_construct<void(BOOST_PP_ENUM_PARAMS(N, T))> type;
Packit 58578d
};
Packit 58578d
Packit 58578d
}
Packit 58578d
Packit 58578d
#undef BOOST_TYPE_ERASURE_FORWARD
Packit 58578d
#undef BOOST_TYPE_ERASURE_FORWARD_I
Packit 58578d
Packit 58578d
#undef BOOST_TYPE_ERASURE_ARG_DECL
Packit 58578d
#undef N
Packit 58578d
Packit 58578d
#endif