148 lines
4.5 KiB
Plaintext
148 lines
4.5 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).
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
#ifndef BOOST_FT_DETAIL_TAGS_HPP_INCLUDED
|
|
#define BOOST_FT_DETAIL_TAGS_HPP_INCLUDED
|
|
|
|
#include <cstddef>
|
|
|
|
#include <boost/type_traits/integral_constant.hpp>
|
|
#include <boost/mpl/bitxor.hpp>
|
|
|
|
|
|
namespace boost { namespace function_types {
|
|
|
|
namespace detail
|
|
{
|
|
typedef long bits_t;
|
|
|
|
template<bits_t Value> struct constant
|
|
: boost::integral_constant<bits_t,Value>
|
|
{ };
|
|
|
|
template<bits_t Bits, bits_t Mask> struct property_tag
|
|
{
|
|
typedef constant<Bits> bits;
|
|
typedef constant<Mask> mask;
|
|
};
|
|
|
|
template<typename T> struct bits : T::bits { };
|
|
template<typename T> struct mask : T::mask { };
|
|
|
|
// forward declaration, defined in pp_tags
|
|
template<bits_t Bits, bits_t CCID> struct encode_bits_impl;
|
|
|
|
// forward declaration, defined in pp_tags
|
|
template<bits_t LHS_bits, bits_t LHS_mask,
|
|
bits_t RHS_bits, bits_t RHS_mask>
|
|
struct tag_ice;
|
|
|
|
// forward declaration, defined in retag_default_cc
|
|
template<class Tag, class RegTag = Tag> struct retag_default_cc;
|
|
|
|
template<bits_t Bits, bits_t CCID> struct encode_bits
|
|
: constant<
|
|
::boost::function_types::detail::encode_bits_impl<Bits,CCID>::value
|
|
>
|
|
{ };
|
|
|
|
template<class LHS, class RHS> struct compound_tag
|
|
{
|
|
typedef constant<
|
|
::boost::function_types::detail::tag_ice
|
|
< ::boost::function_types::detail::bits<LHS>::value
|
|
, ::boost::function_types::detail::mask<LHS>::value
|
|
, ::boost::function_types::detail::bits<RHS>::value
|
|
, ::boost::function_types::detail::mask<RHS>::value
|
|
>::combined_bits
|
|
> bits;
|
|
|
|
typedef constant<
|
|
::boost::function_types::detail::tag_ice
|
|
< ::boost::function_types::detail::bits<LHS>::value
|
|
, ::boost::function_types::detail::mask<LHS>::value
|
|
, ::boost::function_types::detail::bits<RHS>::value
|
|
, ::boost::function_types::detail::mask<RHS>::value
|
|
>::combined_mask
|
|
> mask;
|
|
};
|
|
|
|
template <class Base, class PropOld, class PropNew>
|
|
struct changed_tag
|
|
: Base
|
|
{
|
|
typedef mpl::bitxor_
|
|
<typename Base::bits, typename PropOld::bits, typename PropNew::bits>
|
|
bits;
|
|
};
|
|
|
|
template<class Tag, class QueryTag> struct represents_impl
|
|
: boost::integral_constant<bool,
|
|
::boost::function_types::detail::tag_ice
|
|
< ::boost::function_types::detail::bits<Tag>::value
|
|
, ::boost::function_types::detail::mask<Tag>::value
|
|
, ::boost::function_types::detail::bits<QueryTag>::value
|
|
, ::boost::function_types::detail::mask<QueryTag>::value
|
|
>::match
|
|
>
|
|
{ };
|
|
|
|
} // namespace detail
|
|
|
|
typedef detail::property_tag<0,0> null_tag;
|
|
|
|
template<class Tag1, class Tag2, class Tag3 = null_tag, class Tag4 = null_tag>
|
|
struct tag
|
|
: detail::compound_tag< detail::compound_tag<Tag1,Tag2>,
|
|
detail::compound_tag<Tag3,Tag4> >
|
|
{ };
|
|
|
|
template<class Tag1, class Tag2, class Tag3> struct tag<Tag1,Tag2,Tag3,null_tag>
|
|
: detail::compound_tag<detail::compound_tag<Tag1,Tag2>,Tag3>
|
|
{ };
|
|
template<class Tag1, class Tag2> struct tag<Tag1,Tag2,null_tag,null_tag>
|
|
: detail::compound_tag<Tag1,Tag2>
|
|
{ };
|
|
template<class Tag1> struct tag<Tag1,null_tag,null_tag,null_tag>
|
|
: Tag1
|
|
{ };
|
|
|
|
|
|
template<class Tag, class QueryTag> struct represents
|
|
: detail::represents_impl<Tag, detail::retag_default_cc<QueryTag,Tag> >
|
|
{ };
|
|
|
|
|
|
template<class Tag, class QueryTag> struct extract
|
|
{
|
|
typedef detail::constant<
|
|
::boost::function_types::detail::tag_ice
|
|
< ::boost::function_types::detail::bits<Tag>::value
|
|
, ::boost::function_types::detail::mask<Tag>::value
|
|
, ::boost::function_types::detail::bits<QueryTag>::value
|
|
, ::boost::function_types::detail::mask<QueryTag>::value
|
|
>::extracted_bits
|
|
> bits;
|
|
|
|
typedef detail::constant<
|
|
::boost::function_types::detail::mask<QueryTag>::value
|
|
> mask;
|
|
};
|
|
|
|
} } // namespace ::boost::function_types
|
|
|
|
#include <boost/function_types/detail/pp_tags/preprocessed.hpp>
|
|
|
|
namespace boost { namespace function_types {
|
|
#define BOOST_FT_cc_file <boost/function_types/detail/pp_tags/cc_tag.hpp>
|
|
#include <boost/function_types/detail/pp_loop.hpp>
|
|
} } // namespace boost::function_types
|
|
|
|
#endif
|
|
|