1 // Copyright David Abrahams 2006. Distributed under the Boost
2 // 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_CONCEPT_DETAIL_CONCEPT_DEF_DWA200651_HPP
5 # define BOOST_CONCEPT_DETAIL_CONCEPT_DEF_DWA200651_HPP
6 # include <boost/preprocessor/seq/for_each_i.hpp>
7 # include <boost/preprocessor/seq/enum.hpp>
8 # include <boost/preprocessor/comma_if.hpp>
9 # include <boost/preprocessor/cat.hpp>
10 #endif // BOOST_CONCEPT_DETAIL_CONCEPT_DEF_DWA200651_HPP
11 
12 // BOOST_concept(SomeName, (p1)(p2)...(pN))
13 //
14 // Expands to "template <class p1, class p2, ...class pN> struct SomeName"
15 //
16 // Also defines an equivalent SomeNameConcept for backward compatibility.
17 // Maybe in the next release we can kill off the "Concept" suffix for good.
18 #if BOOST_WORKAROUND(__GNUC__, <= 3)
19 # define BOOST_concept(name, params)                                            \
20     template < BOOST_PP_SEQ_FOR_EACH_I(BOOST_CONCEPT_typename,~,params) >       \
21     struct name; /* forward declaration */                                      \
22                                                                                 \
23     template < BOOST_PP_SEQ_FOR_EACH_I(BOOST_CONCEPT_typename,~,params) >       \
24     struct BOOST_PP_CAT(name,Concept)                                           \
25       : name< BOOST_PP_SEQ_ENUM(params) >                                       \
26     {                                                                           \
27         /* at least 2.96 and 3.4.3 both need this */                            \
28         BOOST_PP_CAT(name,Concept)();                                           \
29     };                                                                          \
30                                                                                 \
31     template < BOOST_PP_SEQ_FOR_EACH_I(BOOST_CONCEPT_typename,~,params) >       \
32     struct name
33 #else
34 # define BOOST_concept(name, params)                                            \
35     template < BOOST_PP_SEQ_FOR_EACH_I(BOOST_CONCEPT_typename,~,params) >       \
36     struct name; /* forward declaration */                                      \
37                                                                                 \
38     template < BOOST_PP_SEQ_FOR_EACH_I(BOOST_CONCEPT_typename,~,params) >       \
39     struct BOOST_PP_CAT(name,Concept)                                           \
40       : name< BOOST_PP_SEQ_ENUM(params) >                                       \
41     {                                                                           \
42     };                                                                          \
43                                                                                 \
44     template < BOOST_PP_SEQ_FOR_EACH_I(BOOST_CONCEPT_typename,~,params) >       \
45     struct name
46 #endif
47 
48 // Helper for BOOST_concept, above.
49 # define BOOST_CONCEPT_typename(r, ignored, index, t) \
50     BOOST_PP_COMMA_IF(index) typename t
51 
52