[/==============================================================================
    Copyright (C) 2001-2010 Joel de Guzman
    Copyright (C) 2001-2010 Hartmut Kaiser

    Distributed under the Boost Software License, Version 1.0. (See accompanying
    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
===============================================================================/]
[section:generate_api Generator API]

[//////////////////////////////////////////////////////////////////////////////]
[section:iterator_api Iterator Based Generator API]

[heading Description]

The library provides a couple of free functions to make generating a snap.
These generator functions have two forms. The first form, `generate`, 
concatenates the output generated by the involved components without inserting
any output in between. The second `generate_delimited` intersperses the output
generated by the involved components using the given delimiter generator. 
Both versions can take in attributes by (constant) reference that hold the 
attribute values to output.

[heading Header]

    // forwards to <boost/spirit/home/karma/generate.hpp>
    #include <boost/spirit/include/karma_generate.hpp>

For variadic attributes:

    // forwards to <boost/spirit/home/karma/generate_attr.hpp>
    #include <boost/spirit/include/karma_generate_attr.hpp>

The variadic attributes version of the API allows one or more
attributes to be passed into the `generate` functions. The functions taking two 
or more attributes are usable when the generator expression is a 
__karma_sequence__ only. In this case each of the
attributes passed have to match the corresponding part of the sequence.

For the API functions deducing the correct (matching) generator type from the 
supplied attribute type:

    // forwards to <boost/spirit/home/karma/detail/generate_auto.hpp>
    #include <boost/spirit/include/karma_generate_auto.hpp>

Also, see __include_structure__.

[heading Namespace]

[table
    [[Name]]
    [[`boost::spirit::karma::generate` ]]
    [[`boost::spirit::karma::generate_delimited` ]]
    [[`boost::spirit::karma::delimit_flag::predelimit` ]]
    [[`boost::spirit::karma::delimit_flag::dont_predelimit` ]]
]

[heading Synopsis]

    namespace boost { namespace spirit { namespace karma
    {
        template <typename OutputIterator, typename Expr>
        inline bool
        generate(
            OutputIterator& sink
          , Expr const& expr);

        template <typename OutputIterator, typename Expr
          , typename Attr1, typename Attr2, ..., typename AttrN>
        inline bool
        generate(
            OutputIterator& sink
          , Expr const& expr
          , Attr1 const& attr1, Attr2 const& attr2, ..., AttrN const& attrN);

        template <typename OutputIterator, typename Expr, typename Delimiter>
        inline bool
        generate_delimited(
            OutputIterator& sink
          , Expr const& expr
          , Delimiter const& delimiter
          , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit = delimit_flag::dont_predelimit);

        template <typename OutputIterator, typename Expr, typename Delimiter
          , typename Attr1, typename Attr2, ..., typename AttrN>
        inline bool
        generate_delimited(
            OutputIterator& sink
          , Expr const& expr
          , Delimiter const& delimiter
          , Attr1 const& attr1, Attr2 const& attr2, ..., AttrN const& attrN);

        template <typename OutputIterator, typename Expr, typename Delimiter
          , typename Attr1, typename Attr2, ..., typename AttrN>
        inline bool
        generate_delimited(
            OutputIterator& sink
          , Expr const& expr
          , Delimiter const& delimiter
          , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit
          , Attr1 const& attr1, Attr2 const& attr2, ..., AttrN const& attrN);
    }}}

__karma__ generator API functions based on the automatic creation of the 
matching generator type:

    namespace boost { namespace spirit { namespace karma
    {
        template <typename OutputIterator, typename Attr, typename Delimiter>
        inline bool
        generate_delimited(
            OutputIterator& sink
          , Attr const& attr
          , Delimiter const& delimiter
          , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit = delimit_flag::dont_predelimit);

        template <typename OutputIterator, typename Attr>
        inline bool
        generate(
            OutputIterator& sink
          , Attr const& attr);
    }}}

All functions above return `true` if none of the involved generator components
failed, and `false` otherwise. If during the process of the output generation
the underlying output stream reports an error, the return value will be `false`
as well.

The maximum number of supported arguments is limited by the preprocessor 
constant `SPIRIT_ARGUMENTS_LIMIT`. This constant defaults to the value defined
by the preprocessor constant `PHOENIX_LIMIT` (which in turn defaults to `10`). 

[note The variadic functions with two or more attributes internally combine 
      (constant) references to all passed attributes into a `fusion::vector` 
      and forward this as a combined attribute to the corresponding function
      taking one attribute.]

The `generate_delimited` functions not taking an explicit `delimit_flag` as one 
of their arguments don't invoke the passed delimiter before starting to generate 
output from the generator expression. This can be enabled by using the other 
version of that function while passing `delimit_flag::predelimit` to the 
corresponding argument.

[heading Template parameters]

[table
    [[Parameter]                    [Description]]
    [[`OutputIterator`]             [__outputiter__ receiving the generated output.]]
    [[`Expr`]                       [An expression that can be converted to a Karma generator.]]
    [[`Delimiter`]                  [Generator used to delimit the output of the expression components.]]
    [[`Attr`]                       [An attribute type utilized to create the corresponding 
                                     generator type from.]]
    [[`Attr1`, `Attr2`, ..., `AttrN`][One or more attributes.]]
]

[endsect] [/ Iterator Based Generator API]

[//////////////////////////////////////////////////////////////////////////////]
[section:stream_api Stream Based Generator API]

[heading Description]

The library provides a couple of Standard IO __iomanip__ allowing to integrate
__karma__ output generation facilities with Standard output streams.
These generator manipulators have two forms. The first form, `format`, 
concatenates the output generated by the involved components without inserting
any output in between. The second, `format_delimited`, intersperses the output
generated by the involved components using the given delimiter generator. 
Both versions can take in attributes by (constant) reference that hold the 
attribute values to output.

[heading Header]

    // forwards to <boost/spirit/home/karma/stream/format_manip.hpp>
    #include <boost/spirit/include/karma_format.hpp>

For variadic attributes:

    // forwards to <boost/spirit/home/karma/stream/format_manip_attr.hpp>
    #include <boost/spirit/include/karma_format_attr.hpp>

The variadic attributes version of the API allows one or more
attributes to be passed into the `format` manipulators. The manipulators taking 
two or more attributes are usable when the generator expression is a 
__karma_sequence__ only. In this case each of the attributes passed have to 
match the corresponding part of the sequence.

For the API functions deducing the correct (matching) generator type from the 
supplied attribute type:

    // forwards to <boost/spirit/home/karma/format_auto.hpp>
    #include <boost/spirit/include/karma_format_auto.hpp>

Also, see __include_structure__.

[heading Namespace]

[table
    [[Name]]
    [[`boost::spirit::karma::format` ]]
    [[`boost::spirit::karma::format_delimited` ]]
    [[`boost::spirit::karma::delimit_flag::predelimit` ]]
    [[`boost::spirit::karma::delimit_flag::dont_predelimit` ]]
]

[heading Synopsis]

    namespace boost { namespace spirit { namespace karma
    {
        template <typename Expr>
        inline <unspecified> 
        format(
            Expr const& xpr);

        template <typename Expr
          , typename Attr1, typename Attr2, ..., typename AttrN>
        inline <unspecified> 
        format(
            Expr const& xpr
          , Attr1 const& attr1, Attr2 const& attr2, ..., AttrN const& attrN);

        template <typename Expr, typename Delimiter>
        inline <unspecified> 
        format_delimited(
            Expr const& expr
          , Delimiter const& d
          , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit = delimit_flag::dont_predelimit);

        template <typename Expr, typename Delimiter
          , typename Attr1, typename Attr2, ..., typename AttrN>
        inline <unspecified> 
        format_delimited(
            Expr const& expr
          , Delimiter const& d
          , Attr1 const& attr1, Attr2 const& attr2, ..., AttrN const& attrN);

        template <typename Expr, typename Delimiter
          , typename Attr1, typename Attr2, ..., typename AttrN>
        inline <unspecified> 
        format_delimited(
            Expr const& expr
          , Delimiter const& d
          , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit
          , Attr1 const& attr1, Attr2 const& attr2, ..., AttrN const& attrN);
    }}}

__karma__ generator API functions based on the automatic creation of the 
matching generator type:

    namespace boost { namespace spirit { namespace karma
    {
        template <typename Attr, typename Delimiter>
        inline <unspecified> 
        format_delimited(
            Attr const& attr
          , Delimiter const& d
          , BOOST_SCOPED_ENUM(delimit_flag) pre_delimit = delimit_flag::dont_predelimit);

        template <typename Attr>
        inline <unspecified> 
        format(
            Attr const& xpr);
    }}}

All functions above return a standard IO stream manipulator instance (see 
__iomanip__), which when streamed to an output stream will result in generating
the output as emitted by the embedded __karma__ generator expression. Any error
occurring during the invocation of the __karma__ generators will be reflected
in the streams status flag (`std::ios_base::failbit` will be set).

The maximum number of supported arguments is limited by the preprocessor 
constant `SPIRIT_ARGUMENTS_LIMIT`. This constant defaults to the value defined
by the preprocessor constant `PHOENIX_LIMIT` (which in turn defaults to `10`). 

[note The variadic manipulators with two or more attributes internally combine 
      (constant) references to all passed attributes into a `fusion::vector` 
      and forward this as a combined attribute to the corresponding manipulator
      taking one attribute.]

The `format_delimited` manipulators not taking an explicit `delimit_flag` as one 
of their arguments don't invoke the passed delimiter before starting to generate 
output from the generator expression. This can be enabled by using the other 
version of that manipulator while passing `delimit_flag::predelimit` to the 
corresponding argument.

[heading Template parameters]

[table
    [[Parameter]                    [Description]]
    [[`Expr`]                       [An expression that can be converted to a Karma generator.]]
    [[`Delimiter`]                  [Generator used to delimit the output of the expression components.]]
    [[`Attr`]                       [An attribute type utilized to create the corresponding 
                                     generator type from.]]
    [[`Attr1`, `Attr2`, ..., `AttrN`][One or more attributes.]]
]

[endsect] [/ Stream Based Generator API]

[//////////////////////////////////////////////////////////////////////////////]
[section:create_generator API for Automatic Generator Creation]

[heading Description]

The library implements a special API returning a generator instance for a 
supplied attribute type. This function finds the best matching generator type 
for the attribute based on a set of simple matching rules (as outlined in the 
table below) applied recursively to the attribute type. The returned generator 
can be utilized to emit output for the provided attribute.

[heading Header]

    // forwards to <boost/spirit/home/karma/auto.hpp>
    #include <boost/spirit/include/karma_auto.hpp>

Also, see __include_structure__.

[heading Namespace]

[table
    [[Name]]
    [[`boost::spirit::karma::create_generator`]]
    [[`boost::spirit::traits::create_generator_exists`]]
]

[heading Synopsis]

    namespace boost { namespace spirit { namespace karma
    {
        template <typename Attr>
        inline <unspecified> 
        create_generator();
    }}}

The returned instance can be directly passed as the generator (or the 
delimiting generator) to any of the __karma__ API functions. Additionally it
can be assigned to a rule as the rules right hand side expression. This 
function will return a valid generator type only if the meta function 
`traits::create_generator_exists` returns `mpl::true_`. Otherwise it will fail
compiling.

    namespace boost { namespace spirit { namespace traits
    {
        template <typename Attr>
        struct create_generator_exists;
    }}}

The meta function evaluates to `mpl::true_` if `create_generator` would return 
a valid generator for the given type `Attr`.

The following table outlines the mapping rules from the attribute type to the
generator type. These rules are applied recursively to create the generator 
type which can be used to generate output from the given attribute type.

[table 
    [[Attribute type]   [Generator type]]
    [[`char`, `wchar_t`]      [`standard::char_`, `standard_wide::char_`]]
    [[`short`, `int`, `long`] [`short_`, `int_`, `long_`]]
    [[`unsigned short`, `unsigned int`, `unsigned long`] 
                              [`ushort_`, `uint_`, `ulong_`]]
    [[`float`, `double`, `long double`] [`float_`, `double_`, `long_double`]]
    [[`short`, `int`, `long`] [`short_`, `int_`, `long_`]]
    [[`long long`, `unsigned long long`]
                              [`long_long`, `ulong_long`]]
    [[`bool`]                 [`bool_`]]
    [[Any string (`char const*`, `std::string`, etc.)]
                              [`string`]]
    [[Any (STL) container]    [Kleene Star (unary `'*'`)]]
    [[Any Fusion sequence]    [Sequence operator (`'<<'`)]]
    [[`boost::optional<>`]    [Optional operator (unary `'-'`)]]
    [[`boost::variant<>`]     [Alternative operator (`'|'`)]]
]

[important The mapping for the generators `long_long` and `ulong_long` are only 
        available on platforms where the preprocessor constant 
        `BOOST_HAS_LONG_LONG` is defined (i.e. on platforms having native 
        support for `long long` and `unsigned long long` (64 bit) signed and 
        unsigned integer types).]

[heading Template parameters]

[table
    [[Parameter]                    [Description]]
    [[`Attr`]                       [An attribute type utilized to create the corresponding 
                                     generator type from.]]
]

[endsect] [/ API for Automatic Generator Creation]

[endsect]
