1 2 // (C) Copyright Tobias Schwinger 3 // 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). 6 7 //------------------------------------------------------------------------------ 8 9 #ifndef BOOST_FT_DETAIL_TAGS_HPP_INCLUDED 10 #define BOOST_FT_DETAIL_TAGS_HPP_INCLUDED 11 12 #include <cstddef> 13 14 #include <boost/type_traits/integral_constant.hpp> 15 #include <boost/mpl/bitxor.hpp> 16 17 18 namespace boost { namespace function_types { 19 20 namespace detail 21 { 22 typedef long bits_t; 23 24 template<bits_t Value> struct constant 25 : boost::integral_constant<bits_t,Value> 26 { }; 27 28 template<bits_t Bits, bits_t Mask> struct property_tag 29 { 30 typedef constant<Bits> bits; 31 typedef constant<Mask> mask; 32 }; 33 34 template<typename T> struct bits : T::bits { }; 35 template<typename T> struct mask : T::mask { }; 36 37 // forward declaration, defined in pp_tags 38 template<bits_t Bits, bits_t CCID> struct encode_bits_impl; 39 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> 43 struct tag_ice; 44 45 // forward declaration, defined in retag_default_cc 46 template<class Tag, class RegTag = Tag> struct retag_default_cc; 47 48 template<bits_t Bits, bits_t CCID> struct encode_bits 49 : constant< 50 ::boost::function_types::detail::encode_bits_impl<Bits,CCID>::value 51 > 52 { }; 53 54 template<class LHS, class RHS> struct compound_tag 55 { 56 typedef constant< 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 62 >::combined_bits 63 > bits; 64 65 typedef constant< 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 71 >::combined_mask 72 > mask; 73 }; 74 75 template <class Base, class PropOld, class PropNew> 76 struct changed_tag 77 : Base 78 { 79 typedef mpl::bitxor_ 80 <typename Base::bits, typename PropOld::bits, typename PropNew::bits> 81 bits; 82 }; 83 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 91 >::match 92 > 93 { }; 94 95 } // namespace detail 96 97 typedef detail::property_tag<0,0> null_tag; 98 99 template<class Tag1, class Tag2, class Tag3 = null_tag, class Tag4 = null_tag> 100 struct tag 101 : detail::compound_tag< detail::compound_tag<Tag1,Tag2>, 102 detail::compound_tag<Tag3,Tag4> > 103 { }; 104 105 template<class Tag1, class Tag2, class Tag3> struct tag<Tag1,Tag2,Tag3,null_tag> 106 : detail::compound_tag<detail::compound_tag<Tag1,Tag2>,Tag3> 107 { }; 108 template<class Tag1, class Tag2> struct tag<Tag1,Tag2,null_tag,null_tag> 109 : detail::compound_tag<Tag1,Tag2> 110 { }; 111 template<class Tag1> struct tag<Tag1,null_tag,null_tag,null_tag> 112 : Tag1 113 { }; 114 115 116 template<class Tag, class QueryTag> struct represents 117 : detail::represents_impl<Tag, detail::retag_default_cc<QueryTag,Tag> > 118 { }; 119 120 121 template<class Tag, class QueryTag> struct extract 122 { 123 typedef detail::constant< 124 ::boost::function_types::detail::tag_ice 125 < ::boost::function_types::detail::bits<Tag>::value 126 , ::boost::function_types::detail::mask<Tag>::value 127 , ::boost::function_types::detail::bits<QueryTag>::value 128 , ::boost::function_types::detail::mask<QueryTag>::value 129 >::extracted_bits 130 > bits; 131 132 typedef detail::constant< 133 ::boost::function_types::detail::mask<QueryTag>::value 134 > mask; 135 }; 136 137 } } // namespace ::boost::function_types 138 139 #include <boost/function_types/detail/pp_tags/preprocessed.hpp> 140 141 namespace boost { namespace function_types { 142 #define BOOST_FT_cc_file <boost/function_types/detail/pp_tags/cc_tag.hpp> 143 #include <boost/function_types/detail/pp_loop.hpp> 144 } } // namespace boost::function_types 145 146 #endif 147 148