127 lines
4.8 KiB
Plaintext
127 lines
4.8 KiB
Plaintext
|
|
// (C) Copyright Tobias Schwinger
|
|
//
|
|
// Use modification and distribution are subject to the boost Software License,
|
|
// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// no include guards, this file is guarded externally
|
|
|
|
#ifdef __WAVE__
|
|
// this file has been generated from the master.hpp file in the same directory
|
|
# pragma wave option(preserve: 0)
|
|
#endif
|
|
|
|
#if !defined(BOOST_FT_PREPROCESSING_MODE) || defined(BOOST_FT_CONFIG_HPP_INCLUDED)
|
|
# error "this file used with two-pass preprocessing, only"
|
|
#endif
|
|
|
|
#include <boost/preprocessor/slot/slot.hpp>
|
|
#include <boost/function_types/detail/encoding/def.hpp>
|
|
|
|
namespace boost { namespace function_types {
|
|
|
|
typedef detail::property_tag<BOOST_FT_non_variadic,BOOST_FT_variadic_mask> non_variadic;
|
|
typedef detail::property_tag<BOOST_FT_variadic,BOOST_FT_variadic_mask> variadic;
|
|
|
|
typedef detail::property_tag<0,BOOST_FT_const> non_const;
|
|
typedef detail::property_tag<BOOST_FT_const,BOOST_FT_const> const_qualified;
|
|
|
|
typedef detail::property_tag<0,BOOST_FT_volatile> non_volatile;
|
|
typedef detail::property_tag<BOOST_FT_volatile,BOOST_FT_volatile> volatile_qualified;
|
|
|
|
typedef detail::property_tag<BOOST_FT_default_cc,BOOST_FT_cc_mask> default_cc;
|
|
|
|
#define BOOST_PP_VALUE BOOST_FT_const|BOOST_FT_volatile
|
|
#include BOOST_PP_ASSIGN_SLOT(1)
|
|
|
|
typedef detail::property_tag<0 , BOOST_PP_SLOT(1)> non_cv;
|
|
typedef detail::property_tag<BOOST_FT_const , BOOST_PP_SLOT(1)> const_non_volatile;
|
|
typedef detail::property_tag<BOOST_FT_volatile, BOOST_PP_SLOT(1)> volatile_non_const;
|
|
typedef detail::property_tag<BOOST_PP_SLOT(1) , BOOST_PP_SLOT(1)> cv_qualified;
|
|
|
|
namespace detail {
|
|
|
|
typedef constant<BOOST_FT_full_mask> full_mask;
|
|
|
|
template <bits_t Flags, bits_t CCID> struct encode_bits_impl
|
|
{
|
|
BOOST_STATIC_CONSTANT( bits_t, value =
|
|
Flags | (BOOST_FT_default_cc * CCID) << 1 );
|
|
};
|
|
|
|
template <bits_t Flags, bits_t CCID, std::size_t Arity>
|
|
struct encode_charr_impl
|
|
{
|
|
BOOST_STATIC_CONSTANT(std::size_t, value = (std::size_t)(1+
|
|
Flags | (BOOST_FT_default_cc * CCID) << 1 | Arity << BOOST_FT_arity_shift
|
|
));
|
|
};
|
|
|
|
template <bits_t Bits> struct decode_bits
|
|
{
|
|
BOOST_STATIC_CONSTANT(bits_t, flags = Bits & BOOST_FT_flags_mask);
|
|
|
|
BOOST_STATIC_CONSTANT(bits_t, cc_id =
|
|
( (Bits & BOOST_FT_full_mask) / BOOST_FT_default_cc) >> 1
|
|
);
|
|
|
|
BOOST_STATIC_CONSTANT(bits_t, tag_bits = (Bits & BOOST_FT_full_mask));
|
|
|
|
BOOST_STATIC_CONSTANT(std::size_t, arity = (std::size_t)
|
|
(Bits >> BOOST_FT_arity_shift)
|
|
);
|
|
};
|
|
|
|
template <bits_t LHS_bits, bits_t LHS_mask, bits_t RHS_bits, bits_t RHS_mask>
|
|
struct tag_ice
|
|
{
|
|
BOOST_STATIC_CONSTANT(bool, match =
|
|
RHS_bits == (LHS_bits & RHS_mask & (RHS_bits |~BOOST_FT_type_mask))
|
|
);
|
|
|
|
BOOST_STATIC_CONSTANT(bits_t, combined_bits =
|
|
(LHS_bits & ~RHS_mask) | RHS_bits
|
|
);
|
|
|
|
BOOST_STATIC_CONSTANT(bits_t, combined_mask =
|
|
LHS_mask | RHS_mask
|
|
);
|
|
|
|
BOOST_STATIC_CONSTANT(bits_t, extracted_bits =
|
|
LHS_bits & RHS_mask
|
|
);
|
|
|
|
};
|
|
|
|
#define BOOST_FT_mask BOOST_FT_type_mask
|
|
typedef property_tag<BOOST_FT_callable_builtin,BOOST_FT_mask> callable_builtin_tag;
|
|
typedef property_tag<BOOST_FT_non_member_callable_builtin,BOOST_FT_mask> nonmember_callable_builtin_tag;
|
|
typedef property_tag<BOOST_FT_function,BOOST_FT_mask> function_tag;
|
|
typedef property_tag<BOOST_FT_reference,BOOST_FT_mask> reference_tag;
|
|
typedef property_tag<BOOST_FT_pointer,BOOST_FT_mask> pointer_tag;
|
|
typedef property_tag<BOOST_FT_member_function_pointer,BOOST_FT_mask> member_function_pointer_tag;
|
|
typedef property_tag<BOOST_FT_member_object_pointer,BOOST_FT_mask> member_object_pointer_tag;
|
|
typedef property_tag<BOOST_FT_member_object_pointer_flags,BOOST_FT_full_mask> member_object_pointer_base;
|
|
typedef property_tag<BOOST_FT_member_pointer,BOOST_FT_mask> member_pointer_tag;
|
|
#undef BOOST_FT_mask
|
|
|
|
#define BOOST_PP_VALUE BOOST_FT_function|BOOST_FT_non_variadic|BOOST_FT_default_cc
|
|
#include BOOST_PP_ASSIGN_SLOT(1)
|
|
#define BOOST_PP_VALUE BOOST_FT_type_mask|BOOST_FT_variadic_mask|BOOST_FT_cc_mask
|
|
#include BOOST_PP_ASSIGN_SLOT(2)
|
|
|
|
typedef property_tag< BOOST_PP_SLOT(1) , BOOST_PP_SLOT(2) > nv_dcc_func;
|
|
|
|
#define BOOST_PP_VALUE \
|
|
BOOST_FT_member_function_pointer|BOOST_FT_non_variadic|BOOST_FT_default_cc
|
|
#include BOOST_PP_ASSIGN_SLOT(1)
|
|
|
|
typedef property_tag< BOOST_PP_SLOT(1) , BOOST_PP_SLOT(2) > nv_dcc_mfp;
|
|
|
|
} // namespace detail
|
|
|
|
} } // namespace ::boost::function_types
|
|
|