2
// (C) Copyright Tobias Schwinger
4
// Use modification and distribution are subject to the boost Software License,
5
// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
7
//------------------------------------------------------------------------------
9
#ifndef BOOST_FT_DETAIL_TAGS_HPP_INCLUDED
10
#define BOOST_FT_DETAIL_TAGS_HPP_INCLUDED
14
#include <boost/type_traits/integral_constant.hpp>
15
#include <boost/mpl/bitxor.hpp>
18
namespace boost { namespace function_types {
24
template<bits_t Value> struct constant
25
: boost::integral_constant<bits_t,Value>
28
template<bits_t Bits, bits_t Mask> struct property_tag
30
typedef constant<Bits> bits;
31
typedef constant<Mask> mask;
34
template<typename T> struct bits : T::bits { };
35
template<typename T> struct mask : T::mask { };
37
// forward declaration, defined in pp_tags
38
template<bits_t Bits, bits_t CCID> struct encode_bits_impl;
40
// forward declaration, defined in pp_tags
41
template<bits_t LHS_bits, bits_t LHS_mask,
42
bits_t RHS_bits, bits_t RHS_mask>
45
// forward declaration, defined in retag_default_cc
46
template<class Tag, class RegTag = Tag> struct retag_default_cc;
48
template<bits_t Bits, bits_t CCID> struct encode_bits
50
::boost::function_types::detail::encode_bits_impl<Bits,CCID>::value
54
template<class LHS, class RHS> struct compound_tag
57
::boost::function_types::detail::tag_ice
58
< ::boost::function_types::detail::bits<LHS>::value
59
, ::boost::function_types::detail::mask<LHS>::value
60
, ::boost::function_types::detail::bits<RHS>::value
61
, ::boost::function_types::detail::mask<RHS>::value
66
::boost::function_types::detail::tag_ice
67
< ::boost::function_types::detail::bits<LHS>::value
68
, ::boost::function_types::detail::mask<LHS>::value
69
, ::boost::function_types::detail::bits<RHS>::value
70
, ::boost::function_types::detail::mask<RHS>::value
75
template <class Base, class PropOld, class PropNew>
80
<typename Base::bits, typename PropOld::bits, typename PropNew::bits>
84
template<class Tag, class QueryTag> struct represents_impl
85
: boost::integral_constant<bool,
86
::boost::function_types::detail::tag_ice
87
< ::boost::function_types::detail::bits<Tag>::value
88
, ::boost::function_types::detail::mask<Tag>::value
89
, ::boost::function_types::detail::bits<QueryTag>::value
90
, ::boost::function_types::detail::mask<QueryTag>::value
97
typedef detail::property_tag<0,0> null_tag;
99
template<class Tag1, class Tag2, class Tag3 = null_tag, class Tag4 = null_tag>
101
: detail::compound_tag< detail::compound_tag<Tag1,Tag2>,
102
detail::compound_tag<Tag3,Tag4> >
105
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
106
template<class Tag1, class Tag2, class Tag3> struct tag<Tag1,Tag2,Tag3,null_tag>
107
: detail::compound_tag<detail::compound_tag<Tag1,Tag2>,Tag3>
109
template<class Tag1, class Tag2> struct tag<Tag1,Tag2,null_tag,null_tag>
110
: detail::compound_tag<Tag1,Tag2>
112
template<class Tag1> struct tag<Tag1,null_tag,null_tag,null_tag>
118
template<class Tag, class QueryTag> struct represents
119
: detail::represents_impl<Tag, detail::retag_default_cc<QueryTag,Tag> >
123
template<class Tag, class QueryTag> struct extract
125
typedef detail::constant<
126
::boost::function_types::detail::tag_ice
127
< ::boost::function_types::detail::bits<Tag>::value
128
, ::boost::function_types::detail::mask<Tag>::value
129
, ::boost::function_types::detail::bits<QueryTag>::value
130
, ::boost::function_types::detail::mask<QueryTag>::value
134
typedef detail::constant<
135
::boost::function_types::detail::mask<QueryTag>::value
139
} } // namespace ::boost::function_types
141
#include <boost/function_types/detail/pp_tags/preprocessed.hpp>
143
namespace boost { namespace function_types {
144
#define BOOST_FT_cc_file <boost/function_types/detail/pp_tags/cc_tag.hpp>
145
#include <boost/function_types/detail/pp_loop.hpp>
146
} } // namespace boost::function_types