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 // no include guards, this file is guarded externally 10 11 #ifdef __WAVE__ 12 // this file has been generated from the master.hpp file in the same directory 13 # pragma wave option(preserve: 0) 14 #endif 15 16 #if !defined(BOOST_FT_PREPROCESSING_MODE) || defined(BOOST_FT_CONFIG_HPP_INCLUDED) 17 # error "this file used with two-pass preprocessing, only" 18 #endif 19 20 #include <boost/preprocessor/slot/slot.hpp> 21 #include <boost/function_types/detail/encoding/def.hpp> 22 23 namespace boost { namespace function_types { 24 25 typedef detail::property_tag<BOOST_FT_non_variadic,BOOST_FT_variadic_mask> non_variadic; 26 typedef detail::property_tag<BOOST_FT_variadic,BOOST_FT_variadic_mask> variadic; 27 28 typedef detail::property_tag<0,BOOST_FT_const> non_const; 29 typedef detail::property_tag<BOOST_FT_const,BOOST_FT_const> const_qualified; 30 31 typedef detail::property_tag<0,BOOST_FT_volatile> non_volatile; 32 typedef detail::property_tag<BOOST_FT_volatile,BOOST_FT_volatile> volatile_qualified; 33 34 typedef detail::property_tag<BOOST_FT_default_cc,BOOST_FT_cc_mask> default_cc; 35 36 #define BOOST_PP_VALUE BOOST_FT_const|BOOST_FT_volatile 37 #include BOOST_PP_ASSIGN_SLOT(1) 38 39 typedef detail::property_tag<0 , BOOST_PP_SLOT(1)> non_cv; 40 typedef detail::property_tag<BOOST_FT_const , BOOST_PP_SLOT(1)> const_non_volatile; 41 typedef detail::property_tag<BOOST_FT_volatile, BOOST_PP_SLOT(1)> volatile_non_const; 42 typedef detail::property_tag<BOOST_PP_SLOT(1) , BOOST_PP_SLOT(1)> cv_qualified; 43 44 namespace detail { 45 46 typedef constant<BOOST_FT_full_mask> full_mask; 47 48 template <bits_t Flags, bits_t CCID> struct encode_bits_impl 49 { 50 BOOST_STATIC_CONSTANT( bits_t, value = 51 Flags | (BOOST_FT_default_cc * CCID) << 1 ); 52 }; 53 54 template <bits_t Flags, bits_t CCID, std::size_t Arity> 55 struct encode_charr_impl 56 { 57 BOOST_STATIC_CONSTANT(std::size_t, value = (std::size_t)(1+ 58 Flags | (BOOST_FT_default_cc * CCID) << 1 | Arity << BOOST_FT_arity_shift 59 )); 60 }; 61 62 template <bits_t Bits> struct decode_bits 63 { 64 BOOST_STATIC_CONSTANT(bits_t, flags = Bits & BOOST_FT_flags_mask); 65 66 BOOST_STATIC_CONSTANT(bits_t, cc_id = 67 ( (Bits & BOOST_FT_full_mask) / BOOST_FT_default_cc) >> 1 68 ); 69 70 BOOST_STATIC_CONSTANT(bits_t, tag_bits = (Bits & BOOST_FT_full_mask)); 71 72 BOOST_STATIC_CONSTANT(std::size_t, arity = (std::size_t) 73 (Bits >> BOOST_FT_arity_shift) 74 ); 75 }; 76 77 template <bits_t LHS_bits, bits_t LHS_mask, bits_t RHS_bits, bits_t RHS_mask> 78 struct tag_ice 79 { 80 BOOST_STATIC_CONSTANT(bool, match = 81 RHS_bits == (LHS_bits & RHS_mask & (RHS_bits |~BOOST_FT_type_mask)) 82 ); 83 84 BOOST_STATIC_CONSTANT(bits_t, combined_bits = 85 (LHS_bits & ~RHS_mask) | RHS_bits 86 ); 87 88 BOOST_STATIC_CONSTANT(bits_t, combined_mask = 89 LHS_mask | RHS_mask 90 ); 91 92 BOOST_STATIC_CONSTANT(bits_t, extracted_bits = 93 LHS_bits & RHS_mask 94 ); 95 96 }; 97 98 #define BOOST_FT_mask BOOST_FT_type_mask 99 typedef property_tag<BOOST_FT_callable_builtin,BOOST_FT_mask> callable_builtin_tag; 100 typedef property_tag<BOOST_FT_non_member_callable_builtin,BOOST_FT_mask> nonmember_callable_builtin_tag; 101 typedef property_tag<BOOST_FT_function,BOOST_FT_mask> function_tag; 102 typedef property_tag<BOOST_FT_reference,BOOST_FT_mask> reference_tag; 103 typedef property_tag<BOOST_FT_pointer,BOOST_FT_mask> pointer_tag; 104 typedef property_tag<BOOST_FT_member_function_pointer,BOOST_FT_mask> member_function_pointer_tag; 105 typedef property_tag<BOOST_FT_member_object_pointer,BOOST_FT_mask> member_object_pointer_tag; 106 typedef property_tag<BOOST_FT_member_object_pointer_flags,BOOST_FT_full_mask> member_object_pointer_base; 107 typedef property_tag<BOOST_FT_member_pointer,BOOST_FT_mask> member_pointer_tag; 108 #undef BOOST_FT_mask 109 110 #define BOOST_PP_VALUE BOOST_FT_function|BOOST_FT_non_variadic|BOOST_FT_default_cc 111 #include BOOST_PP_ASSIGN_SLOT(1) 112 #define BOOST_PP_VALUE BOOST_FT_type_mask|BOOST_FT_variadic_mask|BOOST_FT_cc_mask 113 #include BOOST_PP_ASSIGN_SLOT(2) 114 115 typedef property_tag< BOOST_PP_SLOT(1) , BOOST_PP_SLOT(2) > nv_dcc_func; 116 117 #define BOOST_PP_VALUE \ 118 BOOST_FT_member_function_pointer|BOOST_FT_non_variadic|BOOST_FT_default_cc 119 #include BOOST_PP_ASSIGN_SLOT(1) 120 121 typedef property_tag< BOOST_PP_SLOT(1) , BOOST_PP_SLOT(2) > nv_dcc_mfp; 122 123 } // namespace detail 124 125 } } // namespace ::boost::function_types 126 127