integral_template_param.hpp 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // Copyright (C) 2005 Arkadiy Vertleyb
  2. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  3. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  4. #ifndef BOOST_TYPEOF_INTEGRAL_TEMPLATE_PARAM_HPP_INCLUDED
  5. #define BOOST_TYPEOF_INTEGRAL_TEMPLATE_PARAM_HPP_INCLUDED
  6. #define BOOST_TYPEOF_unsigned (unsigned)
  7. #define BOOST_TYPEOF_signed (signed)
  8. #define char_BOOST_TYPEOF (char)
  9. #define short_BOOST_TYPEOF (short)
  10. #define int_BOOST_TYPEOF (int)
  11. #define long_BOOST_TYPEOF (long)
  12. #define BOOST_TYPEOF_char_BOOST_TYPEOF (char)
  13. #define BOOST_TYPEOF_short_BOOST_TYPEOF (short)
  14. #define BOOST_TYPEOF_int_BOOST_TYPEOF (int)
  15. #define BOOST_TYPEOF_long_BOOST_TYPEOF (long)
  16. #define BOOST_TYPEOF_bool_BOOST_TYPEOF (bool)
  17. #define BOOST_TYPEOF_unsigned_BOOST_TYPEOF (unsigned)
  18. #define BOOST_TYPEOF_size_t_BOOST_TYPEOF (size_t)
  19. #define BOOST_TYPEOF_MAKE_OBJ_char BOOST_TYPEOF_INTEGRAL_PARAM(char)
  20. #define BOOST_TYPEOF_MAKE_OBJ_short BOOST_TYPEOF_INTEGRAL_PARAM(short)
  21. #define BOOST_TYPEOF_MAKE_OBJ_int BOOST_TYPEOF_INTEGRAL_PARAM(int)
  22. #define BOOST_TYPEOF_MAKE_OBJ_long BOOST_TYPEOF_INTEGRAL_PARAM(long)
  23. #define BOOST_TYPEOF_MAKE_OBJ_bool BOOST_TYPEOF_INTEGRAL_PARAM(bool)
  24. #define BOOST_TYPEOF_MAKE_OBJ_unsigned BOOST_TYPEOF_INTEGRAL_PARAM(unsigned)
  25. #define BOOST_TYPEOF_MAKE_OBJ_size_t BOOST_TYPEOF_INTEGRAL_PARAM(size_t)
  26. #define BOOST_TYPEOF_MAKE_OBJ_unsignedchar BOOST_TYPEOF_INTEGRAL_PARAM(unsigned char)
  27. #define BOOST_TYPEOF_MAKE_OBJ_unsignedshort BOOST_TYPEOF_INTEGRAL_PARAM(unsigned short)
  28. #define BOOST_TYPEOF_MAKE_OBJ_unsignedint BOOST_TYPEOF_INTEGRAL_PARAM(unsigned int)
  29. #define BOOST_TYPEOF_MAKE_OBJ_unsignedlong BOOST_TYPEOF_INTEGRAL_PARAM(unsigned long)
  30. #define BOOST_TYPEOF_MAKE_OBJ_signedchar BOOST_TYPEOF_INTEGRAL_PARAM(signed char)
  31. #define BOOST_TYPEOF_MAKE_OBJ_signedshort BOOST_TYPEOF_INTEGRAL_PARAM(signed short)
  32. #define BOOST_TYPEOF_MAKE_OBJ_signedint BOOST_TYPEOF_INTEGRAL_PARAM(signed int)
  33. #define BOOST_TYPEOF_MAKE_OBJ_signedlong BOOST_TYPEOF_INTEGRAL_PARAM(signed long)
  34. #define BOOST_TYPEOF_MAKE_OBJ_integral(x) BOOST_TYPEOF_INTEGRAL_PARAM(x)
  35. #define BOOST_TYPEOF_INTEGRAL(X) integral(X) BOOST_TYPEOF_EAT
  36. #define BOOST_TYPEOF_EAT_BOOST_TYPEOF
  37. #define BOOST_TYPEOF_integral(X) (integral(X))
  38. #define BOOST_TYPEOF_INTEGRAL_PARAM(Type)\
  39. (INTEGRAL_PARAM)\
  40. (Type)
  41. #define BOOST_TYPEOF_INTEGRAL_PARAM_GETTYPE(Param)\
  42. BOOST_PP_SEQ_ELEM(1, Param)
  43. #define BOOST_TYPEOF_INTEGRAL_PARAM_EXPANDTYPE(Param)\
  44. BOOST_TYPEOF_INTEGRAL_PARAM_GETTYPE(Param)
  45. // INTEGRAL_PARAM "virtual functions" implementation
  46. #define BOOST_TYPEOF_INTEGRAL_PARAM_ENCODE(This, n)\
  47. typedef typename boost::type_of::encode_integral<\
  48. BOOST_PP_CAT(V, n),\
  49. BOOST_TYPEOF_INTEGRAL_PARAM_GETTYPE(This),\
  50. BOOST_PP_CAT(P, n)\
  51. >::type BOOST_PP_CAT(V, BOOST_PP_INC(n));
  52. #define BOOST_TYPEOF_INTEGRAL_PARAM_DECODE(This, n)\
  53. typedef boost::type_of::decode_integral<BOOST_TYPEOF_INTEGRAL_PARAM_GETTYPE(This), BOOST_PP_CAT(iter, n)> BOOST_PP_CAT(d, n);\
  54. static const BOOST_TYPEOF_INTEGRAL_PARAM_GETTYPE(This) BOOST_PP_CAT(P, n) = BOOST_PP_CAT(d, n)::value;\
  55. typedef typename BOOST_PP_CAT(d, n)::iter BOOST_PP_CAT(iter, BOOST_PP_INC(n));
  56. #define BOOST_TYPEOF_INTEGRAL_PARAM_PLACEHOLDER(Param)\
  57. (BOOST_TYPEOF_INTEGRAL_PARAM_GETTYPE(Param))0
  58. #define BOOST_TYPEOF_INTEGRAL_PARAM_DECLARATION_TYPE(Param)\
  59. BOOST_TYPEOF_INTEGRAL_PARAM_GETTYPE(Param)
  60. #define BOOST_TYPEOF_INTEGRAL_PARAM_PLACEHOLDER_TYPES(Param, n)\
  61. BOOST_PP_CAT(T,n)
  62. #define BOOST_TYPEOF_INTEGRAL_PARAM_ISTEMPLATE 0
  63. #endif//BOOST_TYPEOF_INTEGRAL_TEMPLATE_PARAM_HPP_INCLUDED