123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- #ifndef BOOST_IOSTREAMS_DETAIL_SELECT_BY_SIZE_HPP_INCLUDED
- #define BOOST_IOSTREAMS_DETAIL_SELECT_BY_SIZE_HPP_INCLUDED
- #define SELECT_BY_SIZE_MAX_SPECIALIZED 20
- #include <boost/config.hpp> // BOOST_STATIC_CONSTANT.
- #include <boost/preprocessor/cat.hpp>
- #include <boost/preprocessor/iteration/local.hpp>
-
- namespace boost { namespace iostreams { namespace detail {
- template<int N> struct case_ { char c1; case_<N - 1> c2; };
- template<> struct case_<-1> { char c; };
- typedef case_<true> yes_type;
- typedef case_<false> no_type;
- template<unsigned Size> struct select_by_size;
- } } }
- #define SELECT_BY_SIZE_SPEC(n) \
- namespace boost { namespace iostreams { namespace detail { \
- static const int BOOST_PP_CAT(sizeof_case_, n) = sizeof(case_<n - 1>); \
- template<> \
- struct select_by_size< BOOST_PP_CAT(sizeof_case_, n) > { \
- struct type { BOOST_STATIC_CONSTANT(int, value = n - 1); }; \
- BOOST_STATIC_CONSTANT(int, value = type::value); \
- }; \
- } } } \
-
- #define BOOST_PP_LOCAL_MACRO(n) SELECT_BY_SIZE_SPEC(n)
- #define BOOST_PP_LOCAL_LIMITS (0, 20)
- #include BOOST_PP_LOCAL_ITERATE()
- #undef BOOST_PP_LOCAL_MACRO
- #define BOOST_SELECT_BY_SIZE(type_, name, expr) \
- BOOST_STATIC_CONSTANT( \
- unsigned, \
- BOOST_PP_CAT(boost_select_by_size_temp_, name) = sizeof(expr) \
- ); \
- BOOST_STATIC_CONSTANT( \
- type_, \
- name = \
- ( ::boost::iostreams::detail::select_by_size< \
- BOOST_PP_CAT(boost_select_by_size_temp_, name) \
- >::value ) \
- ) \
-
- #endif
- #if defined(BOOST_SELECT_BY_SIZE_MAX_CASE) && \
- BOOST_SELECT_BY_SIZE_MAX_CASE > SELECT_BY_SIZE_MAX_SPECIALIZED
- #define BOOST_PP_LOCAL_MACRO(n) SELECT_BY_SIZE_SPEC(n)
- #define BOOST_PP_LOCAL_LIMITS \
- (SELECT_BY_SIZE_MAX_SPECIALIZED, BOOST_SELECT_BY_SIZE_MAX_CASE) \
-
- #include BOOST_PP_LOCAL_ITERATE()
- #undef BOOST_PP_LOCAL_MACRO
- #undef SELECT_BY_SIZE_MAX_SPECIALIZED
- #define SELECT_BY_SIZE_MAX_SPECIALIZED BOOST_SELECT_BY_SIZE_MAX_CASE
- #endif
|