blob: 59da034be77e781738801c10f67e66629e6ad486 [file] [log] [blame]
Jeff Thompsonef2d5a42013-08-22 19:09:24 -07001// 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 <ndnboost/preprocessor/seq/for_each_i.hpp>
7# include <ndnboost/preprocessor/seq/enum.hpp>
8# include <ndnboost/preprocessor/comma_if.hpp>
9# include <ndnboost/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