123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- // Copyright (C) 2004 Arkadiy Vertleyb
- // Distributed under the Boost Software License, Version 1.0. (See accompanying
- // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- #include <boost/typeof/encode_decode_params.hpp>
- #define n BOOST_PP_ITERATION()
- // function pointers
- template<class V, class R BOOST_PP_ENUM_TRAILING_PARAMS(n, class P)>
- struct encode_type_impl<V, R(*)(BOOST_PP_ENUM_PARAMS(n, P))>
- {
- typedef R BOOST_PP_CAT(P, n);
- typedef BOOST_TYPEOF_ENCODE_PARAMS(BOOST_PP_INC(n), FUN_PTR_ID + n) type;
- };
- template<class V, class R BOOST_PP_ENUM_TRAILING_PARAMS(n, class P)>
- struct encode_type_impl<V, R(*)(BOOST_PP_ENUM_PARAMS(n, P) ...)>
- {
- typedef R BOOST_PP_CAT(P, n);
- typedef BOOST_TYPEOF_ENCODE_PARAMS(BOOST_PP_INC(n), FUN_VAR_PTR_ID + n) type;
- };
- template<class Iter>
- struct decode_type_impl<boost::type_of::constant<std::size_t,FUN_PTR_ID + n>, Iter>
- {
- typedef Iter iter0;
- BOOST_TYPEOF_DECODE_PARAMS(BOOST_PP_INC(n))
- typedef BOOST_PP_CAT(p, n)(*type)(BOOST_PP_ENUM_PARAMS(n, p));
- typedef BOOST_PP_CAT(iter, BOOST_PP_INC(n)) iter;
- };
- template<class Iter>
- struct decode_type_impl<boost::type_of::constant<std::size_t,FUN_VAR_PTR_ID + n>, Iter>
- {
- typedef Iter iter0;
- BOOST_TYPEOF_DECODE_PARAMS(BOOST_PP_INC(n))
- typedef BOOST_PP_CAT(p, n)(*type)(BOOST_PP_ENUM_PARAMS(n, p) ...);
- typedef BOOST_PP_CAT(iter, BOOST_PP_INC(n)) iter;
- };
- #ifndef BOOST_TYPEOF_NO_FUNCTION_TYPES
- // function references
- template<class V, class R BOOST_PP_ENUM_TRAILING_PARAMS(n, class P)>
- struct encode_type_impl<V, R(&)(BOOST_PP_ENUM_PARAMS(n, P))>
- {
- typedef R BOOST_PP_CAT(P, n);
- typedef BOOST_TYPEOF_ENCODE_PARAMS(BOOST_PP_INC(n), FUN_REF_ID + n) type;
- };
- template<class V, class R BOOST_PP_ENUM_TRAILING_PARAMS(n, class P)>
- struct encode_type_impl<V, R(&)(BOOST_PP_ENUM_PARAMS(n, P) ...)>
- {
- typedef R BOOST_PP_CAT(P, n);
- typedef BOOST_TYPEOF_ENCODE_PARAMS(BOOST_PP_INC(n), FUN_VAR_REF_ID + n) type;
- };
- template<class Iter>
- struct decode_type_impl<boost::type_of::constant<std::size_t,FUN_REF_ID + n>, Iter>
- {
- typedef Iter iter0;
- BOOST_TYPEOF_DECODE_PARAMS(BOOST_PP_INC(n))
- typedef BOOST_PP_CAT(p, n)(&type)(BOOST_PP_ENUM_PARAMS(n, p));
- typedef BOOST_PP_CAT(iter, BOOST_PP_INC(n)) iter;
- };
- template<class Iter>
- struct decode_type_impl<boost::type_of::constant<std::size_t,FUN_VAR_REF_ID + n>, Iter>
- {
- typedef Iter iter0;
- BOOST_TYPEOF_DECODE_PARAMS(BOOST_PP_INC(n))
- typedef BOOST_PP_CAT(p, n)(&type)(BOOST_PP_ENUM_PARAMS(n, p) ...);
- typedef BOOST_PP_CAT(iter, BOOST_PP_INC(n)) iter;
- };
- // functions
- template<class V, class R BOOST_PP_ENUM_TRAILING_PARAMS(n, class P)>
- struct encode_type_impl<V, R(BOOST_PP_ENUM_PARAMS(n, P))>
- {
- typedef R BOOST_PP_CAT(P, n);
- typedef BOOST_TYPEOF_ENCODE_PARAMS(BOOST_PP_INC(n), FUN_ID + n) type;
- };
- template<class V, class R BOOST_PP_ENUM_TRAILING_PARAMS(n, class P)>
- struct encode_type_impl<V, R(BOOST_PP_ENUM_PARAMS(n, P) ...)>
- {
- typedef R BOOST_PP_CAT(P, n);
- typedef BOOST_TYPEOF_ENCODE_PARAMS(BOOST_PP_INC(n), FUN_VAR_ID + n) type;
- };
- template<class Iter>
- struct decode_type_impl<boost::type_of::constant<std::size_t,FUN_ID + n>, Iter>
- {
- typedef Iter iter0;
- BOOST_TYPEOF_DECODE_PARAMS(BOOST_PP_INC(n))
- typedef BOOST_PP_CAT(p, n)(type)(BOOST_PP_ENUM_PARAMS(n, p));
- typedef BOOST_PP_CAT(iter, BOOST_PP_INC(n)) iter;
- };
- template<class Iter>
- struct decode_type_impl<boost::type_of::constant<std::size_t,FUN_VAR_ID + n>, Iter>
- {
- typedef Iter iter0;
- BOOST_TYPEOF_DECODE_PARAMS(BOOST_PP_INC(n))
- typedef BOOST_PP_CAT(p, n)(type)(BOOST_PP_ENUM_PARAMS(n, p) ...);
- typedef BOOST_PP_CAT(iter, BOOST_PP_INC(n)) iter;
- };
- #endif//BOOST_TYPEOF_NO_FUNCTION_TYPES
- #ifndef BOOST_TYPEOF_NO_MEMBER_FUNCTION_TYPES
- // member functions
- #define BOOST_TYPEOF_qualifier
- #define BOOST_TYPEOF_id MEM_FUN_ID
- #include <boost/typeof/register_mem_functions.hpp>
- #define BOOST_TYPEOF_qualifier const
- #define BOOST_TYPEOF_id CONST_MEM_FUN_ID
- #include <boost/typeof/register_mem_functions.hpp>
- #define BOOST_TYPEOF_qualifier volatile
- #define BOOST_TYPEOF_id VOLATILE_MEM_FUN_ID
- #include <boost/typeof/register_mem_functions.hpp>
- #define BOOST_TYPEOF_qualifier volatile const
- #define BOOST_TYPEOF_id VOLATILE_CONST_MEM_FUN_ID
- #include <boost/typeof/register_mem_functions.hpp>
- #undef n
- #endif
|