boost/function_types/property_tags.hpp
// (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





