123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- // (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
|