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_SPIRIT_KARMA_EOL_JUL_08_2008_1014AM)
7 #define BOOST_SPIRIT_KARMA_EOL_JUL_08_2008_1014AM
8 
9 #if defined(_MSC_VER)
10 #pragma once
11 #endif
12 
13 #include <boost/spirit/home/support/common_terminals.hpp>
14 #include <boost/spirit/home/support/info.hpp>
15 #include <boost/spirit/home/support/unused.hpp>
16 #include <boost/spirit/home/karma/detail/attributes.hpp>
17 #include <boost/spirit/home/karma/domain.hpp>
18 #include <boost/spirit/home/karma/meta_compiler.hpp>
19 #include <boost/spirit/home/karma/delimit_out.hpp>
20 #include <boost/spirit/home/karma/detail/generate_to.hpp>
21 
22 namespace boost { namespace spirit
23 {
24     ///////////////////////////////////////////////////////////////////////////
25     // Enablers
26     ///////////////////////////////////////////////////////////////////////////
27     template <>
28     struct use_terminal<karma::domain, tag::eol>       // enables eol
29       : mpl::true_ {};
30 
31 }}
32 
33 ///////////////////////////////////////////////////////////////////////////////
34 namespace boost { namespace spirit { namespace karma
35 {
36 #ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
37     using boost::spirit::eol;
38 #endif
39     using boost::spirit::eol_type;
40 
41     struct eol_generator : primitive_generator<eol_generator>
42     {
43         template <typename Context, typename Unused>
44         struct attribute
45         {
46             typedef unused_type type;
47         };
48 
49         template <
50             typename OutputIterator, typename Context, typename Delimiter
51           , typename Attribute>
generateboost::spirit::karma::eol_generator52         static bool generate(OutputIterator& sink, Context&, Delimiter const& d
53           , Attribute const& /*attr*/)
54         {
55             return detail::generate_to(sink, '\n') &&
56                    karma::delimit_out(sink, d);   // always do post-delimiting
57         }
58 
59         template <typename Context>
whatboost::spirit::karma::eol_generator60         info what(Context const& /*context*/) const
61         {
62             return info("eol");
63         }
64     };
65 
66     ///////////////////////////////////////////////////////////////////////////
67     // Generator generators: make_xxx function (objects)
68     ///////////////////////////////////////////////////////////////////////////
69     template <typename Modifiers>
70     struct make_primitive<tag::eol, Modifiers>
71     {
72         typedef eol_generator result_type;
operator ()boost::spirit::karma::make_primitive73         result_type operator()(unused_type, unused_type) const
74         {
75             return result_type();
76         }
77     };
78 
79 }}}
80 
81 #endif
82