blob: 2e57b8a06812a22fa18acd0366bcaef8cbaf7f39 [file] [log] [blame]
// Copyright Daniel Wallin, David Abrahams 2005.
// Copyright Cromwell D. Enage 2017.
// 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)
#ifndef BOOST_PARAMETER_TAGGED_ARGUMENT_050328_HPP
#define BOOST_PARAMETER_TAGGED_ARGUMENT_050328_HPP
namespace boost { namespace parameter { namespace aux {
struct error_const_lvalue_bound_to_out_parameter;
struct error_lvalue_bound_to_consume_parameter;
struct error_rvalue_bound_to_out_parameter;
}}} // namespace boost::parameter::aux
#include <boost/parameter/keyword_fwd.hpp>
#include <boost/parameter/config.hpp>
#include <boost/mpl/eval_if.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/type_traits/remove_const.hpp>
#if defined(BOOST_PARAMETER_CAN_USE_MP11)
#include <boost/mp11/integral.hpp>
#include <boost/mp11/utility.hpp>
#include <type_traits>
#endif
namespace boost { namespace parameter { namespace aux {
template <typename Keyword, typename Arg>
#if defined(BOOST_PARAMETER_CAN_USE_MP11)
using tagged_argument_type = ::boost::mp11::mp_if<
::boost::mp11::mp_if<
::std::is_scalar<Arg>
, ::boost::mp11::mp_false
, ::std::is_same<
typename Keyword::qualifier
, ::boost::parameter::consume_reference
>
>
, ::boost::parameter::aux::error_lvalue_bound_to_consume_parameter
, ::boost::mp11::mp_if<
::std::is_const<Arg>
, ::boost::mp11::mp_if<
::std::is_same<
typename Keyword::qualifier
, ::boost::parameter::out_reference
>
, ::boost::parameter::aux
::error_const_lvalue_bound_to_out_parameter
, ::std::remove_const<Arg>
>
, ::boost::mp11::mp_identity<Arg>
>
>;
#else // !defined(BOOST_PARAMETER_CAN_USE_MP11)
struct tagged_argument_type
: ::boost::mpl::eval_if<
::boost::is_same<
typename Keyword::qualifier
, ::boost::parameter::out_reference
>
, ::boost::parameter::aux::error_const_lvalue_bound_to_out_parameter
, ::boost::remove_const<Arg>
>
{
};
#endif // BOOST_PARAMETER_CAN_USE_MP11
}}} // namespace boost::parameter::aux
#include <boost/parameter/aux_/tagged_argument_fwd.hpp>
#include <boost/parameter/aux_/is_tagged_argument.hpp>
#include <boost/parameter/aux_/default.hpp>
#include <boost/parameter/aux_/void.hpp>
#include <boost/parameter/aux_/arg_list.hpp>
#include <boost/parameter/aux_/result_of0.hpp>
#include <boost/mpl/bool.hpp>
#include <boost/mpl/if.hpp>
#include <boost/mpl/identity.hpp>
#include <boost/mpl/apply_wrap.hpp>
#include <boost/type_traits/is_const.hpp>
#include <boost/type_traits/is_function.hpp>
#include <boost/type_traits/is_scalar.hpp>
#include <boost/type_traits/remove_reference.hpp>
#if defined(BOOST_NO_CXX11_HDR_FUNCTIONAL)
#include <boost/function.hpp>
#else
#include <functional>
#endif
#if defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING)
#include <boost/core/enable_if.hpp>
#include <utility>
namespace boost { namespace parameter { namespace aux {
// Holds an lvalue reference to an argument of type Arg associated with
// keyword Keyword
template <typename Keyword, typename Arg>
class tagged_argument
: public ::boost::parameter::aux::tagged_argument_base
{
#if defined(BOOST_PARAMETER_CAN_USE_MP11)
using arg_type = typename ::boost::parameter::aux
::tagged_argument_type<Keyword,Arg>::type;
#else
typedef typename ::boost::mpl::eval_if<
typename ::boost::mpl::eval_if<
::boost::is_scalar<Arg>
, ::boost::mpl::false_
, ::boost::is_same<
typename Keyword::qualifier
, ::boost::parameter::consume_reference
>
>::type
, ::boost::parameter::aux::error_lvalue_bound_to_consume_parameter
, ::boost::mpl::eval_if<
::boost::is_const<Arg>
, ::boost::parameter::aux::tagged_argument_type<Keyword,Arg>
, ::boost::mpl::identity<Arg>
>
>::type arg_type;
#endif // BOOST_PARAMETER_CAN_USE_MP11
public:
typedef Keyword key_type;
// Wrap plain (non-UDT) function objects in either
// a boost::function or a std::function. -- Cromwell D. Enage
#if defined(BOOST_PARAMETER_CAN_USE_MP11)
using value_type = ::boost::mp11::mp_if<
::std::is_function<arg_type>
, ::std::function<arg_type>
, Arg
>;
#else // !defined(BOOST_PARAMETER_CAN_USE_MP11)
typedef typename ::boost::mpl::if_<
::boost::is_function<arg_type>
#if defined(BOOST_NO_CXX11_HDR_FUNCTIONAL)
, ::boost::function<arg_type>
#else
, ::std::function<arg_type>
#endif
, Arg
>::type value_type;
#endif // BOOST_PARAMETER_CAN_USE_MP11
// If Arg is void_, then this type will evaluate to void_&. If the
// supplied argument is a plain function, then this type will evaluate
// to a reference-to-const function wrapper type. If the supplied
// argument is an lvalue, then Arg will be deduced to the lvalue
// reference. -- Cromwell D. Enage
#if defined(BOOST_PARAMETER_CAN_USE_MP11)
using reference = ::boost::mp11::mp_if<
::std::is_function<arg_type>
, value_type const&
, Arg&
>;
#else
typedef typename ::boost::mpl::if_<
::boost::is_function<arg_type>
, value_type const&
, Arg&
>::type reference;
#endif
private:
// Store plain functions by value, everything else by reference.
// -- Cromwell D. Enage
#if defined(BOOST_PARAMETER_CAN_USE_MP11)
::boost::mp11::mp_if<
::std::is_function<arg_type>
, value_type
, reference
> value;
#else
typename ::boost::mpl::if_<
::boost::is_function<arg_type>
, value_type
, reference
>::type value;
#endif
public:
inline explicit BOOST_CONSTEXPR tagged_argument(reference x)
: value(x)
{
}
inline BOOST_CONSTEXPR tagged_argument(tagged_argument const& copy)
: value(copy.value)
{
}
// A metafunction class that, given a keyword and a default type,
// returns the appropriate result type for a keyword lookup given
// that default.
struct binding
{
template <typename KW, typename Default, typename Reference>
struct apply
: ::boost::mpl::eval_if<
::boost::is_same<KW,key_type>
, ::boost::mpl::if_<Reference,reference,value_type>
, ::boost::mpl::identity<Default>
>
{
};
#if defined(BOOST_PARAMETER_CAN_USE_MP11)
template <typename KW, typename Default, typename Reference>
using fn = ::boost::mp11::mp_if<
::std::is_same<KW,key_type>
, ::boost::mp11::mp_if<Reference,reference,value_type>
, Default
>;
#endif
};
#if !defined(BOOST_PARAMETER_CAN_USE_MP11)
// Comma operator to compose argument list without using parameters<>.
// Useful for argument lists with undetermined length.
template <typename Keyword2, typename Arg2>
inline BOOST_CONSTEXPR ::boost::parameter::aux::arg_list<
::boost::parameter::aux::tagged_argument<Keyword,Arg>
, ::boost::parameter::aux::arg_list<
::boost::parameter::aux::tagged_argument<Keyword2,Arg2>
>
>
operator,(
::boost::parameter::aux
::tagged_argument<Keyword2,Arg2> const& x
) const
{
return ::boost::parameter::aux::arg_list<
::boost::parameter::aux::tagged_argument<Keyword,Arg>
, ::boost::parameter::aux::arg_list<
::boost::parameter::aux::tagged_argument<Keyword2,Arg2>
>
>(
*this
, ::boost::parameter::aux::arg_list<
::boost::parameter::aux::tagged_argument<Keyword2,Arg2>
>(x, ::boost::parameter::aux::empty_arg_list())
);
}
template <typename Keyword2, typename Arg2>
inline BOOST_CONSTEXPR ::boost::parameter::aux::arg_list<
::boost::parameter::aux::tagged_argument<Keyword,Arg>
, ::boost::parameter::aux::arg_list<
::boost::parameter::aux::tagged_argument_rref<Keyword2,Arg2>
>
>
operator,(
::boost::parameter::aux
::tagged_argument_rref<Keyword2,Arg2> const& x
) const
{
return ::boost::parameter::aux::arg_list<
::boost::parameter::aux::tagged_argument<Keyword,Arg>
, boost::parameter::aux::arg_list<
boost::parameter::aux::tagged_argument_rref<Keyword2,Arg2>
>
>(
*this
, ::boost::parameter::aux::arg_list<
::boost::parameter::aux
::tagged_argument_rref<Keyword2,Arg2>
>(x, ::boost::parameter::aux::empty_arg_list())
);
}
#endif // BOOST_PARAMETER_CAN_USE_MP11
// Accessor interface.
inline BOOST_CONSTEXPR reference get_value() const
{
return this->value;
}
inline BOOST_CONSTEXPR reference
operator[](::boost::parameter::keyword<Keyword> const&) const
{
return this->get_value();
}
template <typename Default>
inline BOOST_CONSTEXPR reference
operator[](
::boost::parameter::aux::default_<key_type,Default> const&
) const
{
return this->get_value();
}
template <typename Default>
inline BOOST_CONSTEXPR reference
operator[](
::boost::parameter::aux::default_r_<key_type,Default> const&
) const
{
return this->get_value();
}
template <typename F>
inline BOOST_CONSTEXPR reference
operator[](
::boost::parameter::aux::lazy_default<key_type,F> const&
) const
{
return this->get_value();
}
template <typename KW, typename Default>
inline BOOST_CONSTEXPR Default&
operator[](
::boost::parameter::aux::default_<KW,Default> const& x
) const
{
return x.value;
}
template <typename KW, typename Default>
inline BOOST_CONSTEXPR Default&&
operator[](
::boost::parameter::aux::default_r_<KW,Default> const& x
) const
{
return ::std::forward<Default>(x.value);
}
template <typename KW, typename F>
inline BOOST_CONSTEXPR
typename ::boost::parameter::aux::result_of0<F>::type
operator[](
::boost::parameter::aux::lazy_default<KW,F> const& x
) const
{
return x.compute_default();
}
template <typename ParameterRequirements>
static BOOST_CONSTEXPR typename ParameterRequirements::has_default
satisfies(ParameterRequirements*);
template <typename HasDefault, typename Predicate>
static BOOST_CONSTEXPR
typename ::boost::mpl::apply_wrap1<Predicate,value_type>::type
satisfies(
::boost::parameter::aux::parameter_requirements<
key_type
, Predicate
, HasDefault
>*
);
// MPL sequence support
// Convenience for users
typedef ::boost::parameter::aux::tagged_argument<Keyword,Arg> type;
// For the benefit of iterators
typedef ::boost::parameter::aux::empty_arg_list tail_type;
// For dispatching to sequence intrinsics
typedef ::boost::parameter::aux::arg_list_tag tag;
};
#if defined(BOOST_PARAMETER_CAN_USE_MP11)
template <typename Keyword>
using tagged_argument_rref_key = ::boost::mp11::mp_if<
::std::is_same<
typename Keyword::qualifier
, ::boost::parameter::out_reference
>
, ::boost::parameter::aux::error_rvalue_bound_to_out_parameter
, ::boost::mp11::mp_identity<Keyword>
>;
#endif
// Holds an rvalue reference to an argument of type Arg associated with
// keyword Keyword
template <typename Keyword, typename Arg>
struct tagged_argument_rref
: ::boost::parameter::aux::tagged_argument_base
{
#if defined(BOOST_PARAMETER_CAN_USE_MP11)
using key_type = typename ::boost::parameter::aux
::tagged_argument_rref_key<Keyword>::type;
#else
typedef typename ::boost::mpl::eval_if<
::boost::is_same<
typename Keyword::qualifier
, ::boost::parameter::out_reference
>
, ::boost::parameter::aux::error_rvalue_bound_to_out_parameter
, ::boost::mpl::identity<Keyword>
>::type key_type;
#endif
typedef Arg value_type;
typedef Arg&& reference;
private:
reference value;
public:
inline explicit BOOST_CONSTEXPR tagged_argument_rref(reference x)
: value(::std::forward<Arg>(x))
{
}
inline BOOST_CONSTEXPR tagged_argument_rref(
tagged_argument_rref const& copy
) : value(::std::forward<Arg>(copy.value))
{
}
// A metafunction class that, given a keyword and a default type,
// returns the appropriate result type for a keyword lookup given
// that default.
struct binding
{
template <typename KW, typename Default, typename Reference>
struct apply
{
typedef typename ::boost::mpl::eval_if<
::boost::is_same<KW,key_type>
, ::boost::mpl::if_<Reference,reference,value_type>
, ::boost::mpl::identity<Default>
>::type type;
};
#if defined(BOOST_PARAMETER_CAN_USE_MP11)
template <typename KW, typename Default, typename Reference>
using fn = ::boost::mp11::mp_if<
::std::is_same<KW,key_type>
, ::boost::mp11::mp_if<Reference,reference,value_type>
, Default
>;
#endif
};
#if !defined(BOOST_PARAMETER_CAN_USE_MP11)
// Comma operator to compose argument list without using parameters<>.
// Useful for argument lists with undetermined length.
template <typename Keyword2, typename Arg2>
inline BOOST_CONSTEXPR ::boost::parameter::aux::arg_list<
::boost::parameter::aux::tagged_argument_rref<Keyword,Arg>
, ::boost::parameter::aux::arg_list<
::boost::parameter::aux::tagged_argument<Keyword2,Arg2>
>
>
operator,(
::boost::parameter::aux
::tagged_argument<Keyword2,Arg2> const& x
) const
{
return boost::parameter::aux::arg_list<
::boost::parameter::aux::tagged_argument_rref<Keyword,Arg>
, ::boost::parameter::aux::arg_list<
::boost::parameter::aux::tagged_argument<Keyword2,Arg2>
>
>(
*this
, ::boost::parameter::aux::arg_list<
::boost::parameter::aux::tagged_argument<Keyword2,Arg2>
>(x, ::boost::parameter::aux::empty_arg_list())
);
}
template <typename Keyword2, typename Arg2>
inline BOOST_CONSTEXPR ::boost::parameter::aux::arg_list<
::boost::parameter::aux::tagged_argument_rref<Keyword,Arg>
, ::boost::parameter::aux::arg_list<
::boost::parameter::aux::tagged_argument_rref<Keyword2,Arg2>
>
>
operator,(
::boost::parameter::aux
::tagged_argument_rref<Keyword2,Arg2> const& x
) const
{
return ::boost::parameter::aux::arg_list<
::boost::parameter::aux::tagged_argument_rref<Keyword,Arg>
, ::boost::parameter::aux::arg_list<
::boost::parameter::aux
::tagged_argument_rref<Keyword2,Arg2>
>
>(
*this
, ::boost::parameter::aux::arg_list<
::boost::parameter::aux::tagged_argument_rref<
Keyword2
, Arg2
>
>(x, ::boost::parameter::aux::empty_arg_list())
);
}
#endif // BOOST_PARAMETER_CAN_USE_MP11
// Accessor interface.
inline BOOST_CONSTEXPR reference get_value() const
{
return ::std::forward<Arg>(this->value);
}
inline BOOST_CONSTEXPR reference
operator[](::boost::parameter::keyword<Keyword> const&) const
{
return this->get_value();
}
template <typename Default>
inline BOOST_CONSTEXPR reference
operator[](
::boost::parameter::aux::default_<key_type,Default> const&
) const
{
return this->get_value();
}
template <typename Default>
inline BOOST_CONSTEXPR reference
operator[](
::boost::parameter::aux::default_r_<key_type,Default> const&
) const
{
return this->get_value();
}
template <typename F>
inline BOOST_CONSTEXPR reference
operator[](
::boost::parameter::aux::lazy_default<key_type,F> const&
) const
{
return this->get_value();
}
template <typename KW, typename Default>
inline BOOST_CONSTEXPR Default&
operator[](
::boost::parameter::aux::default_<KW,Default> const& x
) const
{
return x.value;
}
template <typename KW, typename Default>
inline BOOST_CONSTEXPR Default&&
operator[](
::boost::parameter::aux::default_r_<KW,Default> const& x
) const
{
return ::std::forward<Default>(x.value);
}
template <typename KW, typename F>
inline BOOST_CONSTEXPR
typename ::boost::parameter::aux::result_of0<F>::type
operator[](
::boost::parameter::aux::lazy_default<KW,F> const& x
) const
{
return x.compute_default();
}
template <typename ParameterRequirements>
static BOOST_CONSTEXPR typename ParameterRequirements::has_default
satisfies(ParameterRequirements*);
template <typename HasDefault, typename Predicate>
static BOOST_CONSTEXPR
typename ::boost::mpl::apply_wrap1<Predicate,value_type>::type
satisfies(
::boost::parameter::aux::parameter_requirements<
key_type
, Predicate
, HasDefault
>*
);
// MPL sequence support
// Convenience for users
typedef ::boost::parameter::aux
::tagged_argument_rref<Keyword,Arg> type;
// For the benefit of iterators
typedef ::boost::parameter::aux::empty_arg_list tail_type;
// For dispatching to sequence intrinsics
typedef ::boost::parameter::aux::arg_list_tag tag;
};
}}} // namespace boost::parameter::aux
#else // !defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING)
namespace boost { namespace parameter { namespace aux {
// Holds an lvalue reference to an argument of type Arg associated with
// keyword Keyword
template <typename Keyword, typename Arg>
class tagged_argument
: public ::boost::parameter::aux::tagged_argument_base
{
typedef typename ::boost::remove_const<Arg>::type arg_type;
public:
typedef Keyword key_type;
// Wrap plain (non-UDT) function objects in either
// a boost::function or a std::function. -- Cromwell D. Enage
typedef typename ::boost::mpl::if_<
::boost::is_function<arg_type>
#if defined(BOOST_NO_CXX11_HDR_FUNCTIONAL)
, ::boost::function<arg_type>
#else
, ::std::function<arg_type>
#endif
, Arg
>::type value_type;
// If Arg is void_, then this type will evaluate to void_&. If the
// supplied argument is a plain function, then this type will evaluate
// to a reference-to-const function wrapper type. If the supplied
// argument is an lvalue, then Arg will be deduced to the lvalue
// reference. -- Cromwell D. Enage
typedef typename ::boost::mpl::if_<
::boost::is_function<arg_type>
, value_type const&
, Arg&
>::type reference;
private:
// Store plain functions by value, everything else by reference.
// -- Cromwell D. Enage
typename ::boost::mpl::if_<
::boost::is_function<arg_type>
, value_type
, reference
>::type value;
public:
inline explicit BOOST_CONSTEXPR tagged_argument(reference x)
: value(x)
{
}
inline BOOST_CONSTEXPR tagged_argument(tagged_argument const& copy)
: value(copy.value)
{
}
// A metafunction class that, given a keyword and a default type,
// returns the appropriate result type for a keyword lookup given
// that default.
struct binding
{
template <typename KW, typename Default, typename Reference>
struct apply
{
typedef typename ::boost::mpl::eval_if<
::boost::is_same<KW,key_type>
, ::boost::mpl::if_<Reference,reference,value_type>
, ::boost::mpl::identity<Default>
>::type type;
};
};
// Comma operator to compose argument list without using parameters<>.
// Useful for argument lists with undetermined length.
template <typename Keyword2, typename Arg2>
inline ::boost::parameter::aux::arg_list<
::boost::parameter::aux::tagged_argument<Keyword,Arg>
, ::boost::parameter::aux::arg_list<
::boost::parameter::aux::tagged_argument<Keyword2,Arg2>
>
>
operator,(
::boost::parameter::aux
::tagged_argument<Keyword2,Arg2> const& x
) const
{
return ::boost::parameter::aux::arg_list<
::boost::parameter::aux::tagged_argument<Keyword,Arg>
, ::boost::parameter::aux::arg_list<
::boost::parameter::aux::tagged_argument<Keyword2,Arg2>
>
>(
*this
, ::boost::parameter::aux::arg_list<
::boost::parameter::aux::tagged_argument<Keyword2,Arg2>
>(x, ::boost::parameter::aux::empty_arg_list())
);
}
// Accessor interface.
inline BOOST_CONSTEXPR reference get_value() const
{
return this->value;
}
inline BOOST_CONSTEXPR reference
operator[](::boost::parameter::keyword<Keyword> const&) const
{
return this->get_value();
}
#if defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) || \
BOOST_WORKAROUND(BOOST_BORLANDC, BOOST_TESTED_AT(0x564))
template <typename KW, typename Default>
inline BOOST_CONSTEXPR Default&
get_with_default(
::boost::parameter::aux::default_<KW,Default> const& x
, int
) const
{
return x.value;
}
template <typename Default>
inline BOOST_CONSTEXPR reference
get_with_default(
::boost::parameter::aux::default_<key_type,Default> const&
, long
) const
{
return this->get_value();
}
template <typename KW, typename Default>
inline BOOST_CONSTEXPR typename ::boost::mpl::apply_wrap3<
binding
, KW
, Default&
, ::boost::mpl::true_
>::type
operator[](
::boost::parameter::aux::default_<KW,Default> const& x
) const
{
return this->get_with_default(x, 0L);
}
template <typename KW, typename F>
inline BOOST_CONSTEXPR
typename ::boost::parameter::aux::result_of0<F>::type
get_with_lazy_default(
::boost::parameter::aux::lazy_default<KW,F> const& x
, int
) const
{
return x.compute_default();
}
template <typename F>
inline BOOST_CONSTEXPR reference
get_with_lazy_default(
::boost::parameter::aux::lazy_default<key_type,F> const&
, long
) const
{
return this->get_value();
}
template <typename KW, typename F>
inline BOOST_CONSTEXPR typename ::boost::mpl::apply_wrap3<
binding
, KW
, typename ::boost::parameter::aux::result_of0<F>::type
, ::boost::mpl::true_
>::type
operator[](
::boost::parameter::aux::lazy_default<KW,F> const& x
) const
{
return this->get_with_lazy_default(x, 0L);
}
#else // No function template ordering or Borland workarounds needed.
template <typename Default>
inline BOOST_CONSTEXPR reference
operator[](
::boost::parameter::aux::default_<key_type,Default> const&
) const
{
return this->get_value();
}
template <typename F>
inline BOOST_CONSTEXPR reference
operator[](
::boost::parameter::aux::lazy_default<key_type,F> const&
) const
{
return this->get_value();
}
template <typename KW, typename Default>
inline BOOST_CONSTEXPR Default&
operator[](
::boost::parameter::aux::default_<KW,Default> const& x
) const
{
return x.value;
}
template <typename KW, typename F>
inline BOOST_CONSTEXPR
typename ::boost::parameter::aux::result_of0<F>::type
operator[](
::boost::parameter::aux::lazy_default<KW,F> const& x
) const
{
return x.compute_default();
}
template <typename ParameterRequirements>
static BOOST_CONSTEXPR typename ParameterRequirements::has_default
satisfies(ParameterRequirements*);
template <typename HasDefault, typename Predicate>
static BOOST_CONSTEXPR
typename ::boost::mpl::apply_wrap1<Predicate,value_type>::type
satisfies(
::boost::parameter::aux::parameter_requirements<
key_type
, Predicate
, HasDefault
>*
);
#endif // Function template ordering, Borland workarounds needed.
// MPL sequence support
// Convenience for users
typedef ::boost::parameter::aux::tagged_argument<Keyword,Arg> type;
// For the benefit of iterators
typedef ::boost::parameter::aux::empty_arg_list tail_type;
// For dispatching to sequence intrinsics
typedef ::boost::parameter::aux::arg_list_tag tag;
#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))
// warning suppression
private:
void operator=(type const&);
#endif
};
}}} // namespace boost::parameter::aux
#endif // BOOST_PARAMETER_HAS_PERFECT_FORWARDING
#if defined(BOOST_PARAMETER_CAN_USE_MP11)
namespace boost { namespace parameter { namespace aux {
template <typename TaggedArg>
struct tagged_argument_list_of_1 : public TaggedArg
{
using base_type = TaggedArg;
inline explicit BOOST_CONSTEXPR tagged_argument_list_of_1(
typename base_type::reference x
) : base_type(static_cast<typename base_type::reference>(x))
{
}
inline BOOST_CONSTEXPR tagged_argument_list_of_1(
tagged_argument_list_of_1 const& copy
) : base_type(static_cast<base_type const&>(copy))
{
}
using base_type::operator[];
using base_type::satisfies;
template <typename TA2>
inline BOOST_CONSTEXPR ::boost::parameter::aux::flat_like_arg_list<
::boost::parameter::aux
::flat_like_arg_tuple<typename TaggedArg::key_type,TaggedArg>
, ::boost::parameter::aux::flat_like_arg_tuple<
typename TA2::base_type::key_type
, typename TA2::base_type
>
>
operator,(TA2 const& x) const
{
return boost::parameter::aux::flat_like_arg_list<
::boost::parameter::aux
::flat_like_arg_tuple<typename TaggedArg::key_type,TaggedArg>
, ::boost::parameter::aux::flat_like_arg_tuple<
typename TA2::base_type::key_type
, typename TA2::base_type
>
>(
static_cast<base_type const&>(*this)
, ::boost::parameter::aux::arg_list<typename TA2::base_type>(
static_cast<typename TA2::base_type const&>(x)
, ::boost::parameter::aux::empty_arg_list()
)
);
}
};
}}} // namespace boost::parameter::aux
#endif // BOOST_PARAMETER_CAN_USE_MP11
#endif // include guard