1 // Copyright (c) 2001-2011 Hartmut Kaiser
2 // Copyright (c) 2001-2011 Joel de Guzman
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 #if !defined(BOOST_SPIRIT_GENERATOR_JANUARY_13_2009_1002AM)
8 #define BOOST_SPIRIT_GENERATOR_JANUARY_13_2009_1002AM
14 #include <boost/mpl/has_xxx.hpp>
15 #include <boost/mpl/int.hpp>
16 #include <boost/spirit/home/karma/domain.hpp>
18 namespace boost { namespace spirit { namespace karma
20 struct generator_properties
24 buffering = 0x01, // generator requires buffering
25 counting = 0x02, // generator requires counting
26 tracking = 0x04, // generator requires position tracking
27 disabling = 0x08, // generator requires disabling of output
29 countingbuffer = 0x03, // buffering | counting
30 all_properties = 0x0f // buffering | counting | tracking | disabling
34 template <typename Derived>
38 typedef mpl::int_<generator_properties::no_properties> properties;
39 typedef Derived derived_type;
40 typedef karma::domain domain;
42 // Requirement: g.generate(o, context, delimiter, attr) -> bool
46 // context: enclosing rule context (can be unused_type)
47 // delimit: delimiter (can be unused_type)
48 // attr: attribute (can be unused_type)
50 // Requirement: g.what(context) -> info
53 // context: enclosing rule context (can be unused_type)
55 // Requirement: G::template attribute<Ctx, Iter>::type
57 // G: a generator type
58 // Ctx: A context type (can be unused_type)
59 // Iter: An iterator type (always unused_type)
61 Derived const& derived() const
63 return *static_cast<Derived const*>(this);
67 template <typename Derived>
68 struct primitive_generator : generator<Derived>
70 struct primitive_generator_id;
73 template <typename Derived>
74 struct nary_generator : generator<Derived>
76 struct nary_generator_id;
78 // Requirement: g.elements -> fusion sequence
80 // g: a composite generator
82 // Requirement: G::elements_type -> fusion sequence
84 // G: a composite generator type
87 template <typename Derived>
88 struct unary_generator : generator<Derived>
90 struct unary_generator_id;
92 // Requirement: g.subject -> subject generator
94 // g: a unary generator
96 // Requirement: G::subject_type -> subject generator type
98 // G: a unary generator type
101 template <typename Derived>
102 struct binary_generator : generator<Derived>
104 struct binary_generator_id;
106 // Requirement: g.left -> left generator
108 // g: a binary generator
110 // Requirement: G::left_type -> left generator type
112 // G: a binary generator type
114 // Requirement: g.right -> right generator
116 // g: a binary generator
118 // Requirement: G::right_type -> right generator type
120 // G: a binary generator type
125 namespace boost { namespace spirit { namespace traits // classification
130 BOOST_MPL_HAS_XXX_TRAIT_DEF(generator_id)
131 BOOST_MPL_HAS_XXX_TRAIT_DEF(primitive_generator_id)
132 BOOST_MPL_HAS_XXX_TRAIT_DEF(nary_generator_id)
133 BOOST_MPL_HAS_XXX_TRAIT_DEF(unary_generator_id)
134 BOOST_MPL_HAS_XXX_TRAIT_DEF(binary_generator_id)
137 // check for generator tags
138 template <typename T>
139 struct is_generator : detail::has_generator_id<T> {};
141 template <typename T>
142 struct is_primitive_generator : detail::has_primitive_generator_id<T> {};
144 template <typename T>
145 struct is_nary_generator : detail::has_nary_generator_id<T> {};
147 template <typename T>
148 struct is_unary_generator : detail::has_unary_generator_id<T> {};
150 template <typename T>
151 struct is_binary_generator : detail::has_binary_generator_id<T> {};
153 // check for generator properties
154 template <typename T>
155 struct properties_of : T::properties {};