• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //  Copyright (c) 2001-2011 Hartmut Kaiser
2 //
3 //  Distributed under the Boost Software License, Version 1.0. (See accompanying
4 //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5 
6 #if !defined(BOOST_PP_IS_ITERATING)
7 
8 #if !defined(BOOST_SPIRIT_KARMA_FORMAT_MANIP_ATTR_APR_24_2009_0734AM)
9 #define BOOST_SPIRIT_KARMA_FORMAT_MANIP_ATTR_APR_24_2009_0734AM
10 
11 #include <boost/spirit/home/karma/stream/format_manip.hpp>
12 
13 #include <boost/fusion/include/vector.hpp>
14 #include <boost/preprocessor/iterate.hpp>
15 #include <boost/preprocessor/repetition/enum.hpp>
16 #include <boost/preprocessor/repetition/enum_params.hpp>
17 #include <boost/preprocessor/repetition/enum_binary_params.hpp>
18 
19 #define BOOST_PP_FILENAME_1                                                   \
20     <boost/spirit/home/karma/stream/format_manip_attr.hpp>
21 #define BOOST_PP_ITERATION_LIMITS (2, SPIRIT_ARGUMENTS_LIMIT)
22 #include BOOST_PP_ITERATE()
23 
24 #endif
25 
26 ///////////////////////////////////////////////////////////////////////////////
27 //
28 //  Preprocessor vertical repetition code
29 //
30 ///////////////////////////////////////////////////////////////////////////////
31 #else // defined(BOOST_PP_IS_ITERATING)
32 
33 #define N BOOST_PP_ITERATION()
34 #define BOOST_SPIRIT_KARMA_ATTRIBUTE_REFERENCE(z, n, A)                       \
35     BOOST_PP_CAT(A, n) const&
36 
37 ///////////////////////////////////////////////////////////////////////////////
38 namespace boost { namespace spirit { namespace karma
39 {
40     ///////////////////////////////////////////////////////////////////////////
41     template <typename Expr, BOOST_PP_ENUM_PARAMS(N, typename A)>
42     inline detail::format_manip<Expr, mpl::false_, mpl::true_, unused_type
43       , fusion::vector<
44             BOOST_PP_ENUM(N, BOOST_SPIRIT_KARMA_ATTRIBUTE_REFERENCE, A)
45         > >
format(Expr const & xpr,BOOST_PP_ENUM_BINARY_PARAMS (N,A,const & attr))46     format(Expr const& xpr, BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& attr))
47     {
48         using karma::detail::format_manip;
49 
50         // Report invalid expression error as early as possible.
51         // If you got an error_invalid_expression error message here,
52         // then the expression (expr) is not a valid spirit karma expression.
53         BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Expr);
54 
55         typedef fusion::vector<
56             BOOST_PP_ENUM(N, BOOST_SPIRIT_KARMA_ATTRIBUTE_REFERENCE, A)
57         > vector_type;
58 
59         vector_type attr (BOOST_PP_ENUM_PARAMS(N, attr));
60         return format_manip<Expr, mpl::false_, mpl::true_, unused_type, vector_type>(
61             xpr, unused, attr);
62     }
63 
64     ///////////////////////////////////////////////////////////////////////////
65     template <typename Expr, typename Delimiter
66       , BOOST_PP_ENUM_PARAMS(N, typename A)>
67     inline detail::format_manip<Expr, mpl::false_, mpl::true_, Delimiter
68       , fusion::vector<
69             BOOST_PP_ENUM(N, BOOST_SPIRIT_KARMA_ATTRIBUTE_REFERENCE, A)
70         > >
format_delimited(Expr const & xpr,Delimiter const & d,BOOST_SCOPED_ENUM (delimit_flag)pre_delimit,BOOST_PP_ENUM_BINARY_PARAMS (N,A,const & attr))71     format_delimited(Expr const& xpr, Delimiter const& d
72       , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit
73       , BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& attr))
74     {
75         using karma::detail::format_manip;
76 
77         // Report invalid expression error as early as possible.
78         // If you got an error_invalid_expression error message here,
79         // then the expression (expr) is not a valid spirit karma expression.
80         BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Expr);
81         BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Delimiter);
82 
83         typedef fusion::vector<
84             BOOST_PP_ENUM(N, BOOST_SPIRIT_KARMA_ATTRIBUTE_REFERENCE, A)
85         > vector_type;
86 
87         vector_type attr (BOOST_PP_ENUM_PARAMS(N, attr));
88         return format_manip<Expr, mpl::false_, mpl::true_, Delimiter, vector_type>(
89             xpr, d, pre_delimit, attr);
90     }
91 
92     template <typename Expr, typename Delimiter
93       , BOOST_PP_ENUM_PARAMS(N, typename A)>
94     inline detail::format_manip<Expr, mpl::false_, mpl::true_, Delimiter
95       , fusion::vector<
96             BOOST_PP_ENUM(N, BOOST_SPIRIT_KARMA_ATTRIBUTE_REFERENCE, A)
97         > >
format_delimited(Expr const & xpr,Delimiter const & d,BOOST_PP_ENUM_BINARY_PARAMS (N,A,const & attr))98     format_delimited(Expr const& xpr, Delimiter const& d
99       , BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& attr))
100     {
101         using karma::detail::format_manip;
102 
103         // Report invalid expression error as early as possible.
104         // If you got an error_invalid_expression error message here,
105         // then the expression (expr) is not a valid spirit karma expression.
106         BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Expr);
107         BOOST_SPIRIT_ASSERT_MATCH(karma::domain, Delimiter);
108 
109         typedef fusion::vector<
110             BOOST_PP_ENUM(N, BOOST_SPIRIT_KARMA_ATTRIBUTE_REFERENCE, A)
111         > vector_type;
112 
113         vector_type attr (BOOST_PP_ENUM_PARAMS(N, attr));
114         return format_manip<Expr, mpl::false_, mpl::true_, Delimiter, vector_type>(
115             xpr, d, delimit_flag::dont_predelimit, attr);
116     }
117 }}}
118 
119 #undef BOOST_SPIRIT_KARMA_ATTRIBUTE_REFERENCE
120 #undef N
121 
122 #endif
123 
124