LIST_FOR_EACH_PRODUCT() added to library

[SVN r12571]
This commit is contained in:
Vesa Karvonen
2002-01-30 10:22:13 +00:00
parent 9d401687ef
commit 18ae25d5e5
3 changed files with 14 additions and 82 deletions

View File

@ -12,7 +12,8 @@
/* This example demonstrates the usage of preprocessor lists for generating C++ code. */
#include <boost/preprocessor/list/for_each.hpp>
#include <boost/preprocessor/list/for_each_product.hpp>
#include <boost/preprocessor/list/at.hpp>
#include <boost/preprocessor/tuple/to_list.hpp>
#include <boost/preprocessor/empty.hpp>
@ -20,18 +21,18 @@
#define INTEGRAL_TYPES\
BOOST_PP_TUPLE_TO_LIST(9,(char, signed char, unsigned char, short, unsigned short, int, unsigned, long, unsigned long))
/* List of invokeable cv-qualifiers. */
#define CV_QUALIFIERS\
BOOST_PP_TUPLE_TO_LIST(4,(BOOST_PP_EMPTY, const BOOST_PP_EMPTY, volatile BOOST_PP_EMPTY, const volatile BOOST_PP_EMPTY))
/* Template for testing whether a type is an integral type. */
template<class T> struct is_integral {enum {value = false};};
/* Macro for defining a specialization of is_integral<> template.
* NOTE: CV is invoked so that it is possible to pass empty cv-qualifiers.
*/
#define IS_INTEGRAL_SPECIALIZATION(_,CV,T)\
template<> struct is_integral<CV() T> {enum {value = true};};
/* Macro for defining a specialization of is_integral<> template. */
#define IS_INTEGRAL_SPECIALIZATION(R,_,L)\
template<> struct is_integral<BOOST_PP_LIST_AT(L,1)() BOOST_PP_LIST_AT(L,0)> {enum {value = true};};
BOOST_PP_LIST_FOR_EACH(IS_INTEGRAL_SPECIALIZATION, BOOST_PP_EMPTY, INTEGRAL_TYPES)
BOOST_PP_LIST_FOR_EACH(IS_INTEGRAL_SPECIALIZATION, const BOOST_PP_EMPTY, INTEGRAL_TYPES)
BOOST_PP_LIST_FOR_EACH(IS_INTEGRAL_SPECIALIZATION, volatile BOOST_PP_EMPTY, INTEGRAL_TYPES)
BOOST_PP_LIST_FOR_EACH(IS_INTEGRAL_SPECIALIZATION, const volatile BOOST_PP_EMPTY, INTEGRAL_TYPES)
BOOST_PP_LIST_FOR_EACH_PRODUCT(IS_INTEGRAL_SPECIALIZATION,_,BOOST_PP_TUPLE_TO_LIST(2,(CV_QUALIFIERS, INTEGRAL_TYPES)))
#undef IS_INTEGRAL_SPECIALIZATION
#undef CV_QUALIFIERS
#undef INTEGRAL_TYPES