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

    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:directive Directive]

This module includes different generator directives. It includes alignment 
directives (`left_align[]`, `center[]`, and `right_align[]`), repetition 
(`repeat[]`), directives controlling automatic delimiting (`verbatim[]`, 
`no_delimit[]`, and `delimit[]`), controlling case sensitivity (`upper[]` and 
`lower[]`), field width (`maxwidth[]`), buffering (`buffer[]`), splitting into 
columns (`columns[]`) and attribute handling (`duplicate[]`, `omit[]`, and 
`skip[]`).

[heading Module Header]

    // forwards to <boost/spirit/home/karma/directive.hpp>
    #include <boost/spirit/include/karma_directive.hpp>

Also, see __include_structure__.

[/////////////////////////////////////////////////////////////////////////////]
[section:alignment Alignment Directives (`left_align[]`, `center[]`, `right_align[]`)]

[heading Description]

The alignment directives allow to left align, right align or center output 
emitted by other generators into columns of a specified width while using 
an arbitrary generator to create the padding.

[heading Header]

For the `left_align[]` directive:

    // forwards to <boost/spirit/home/karma/directive/left_alignment.hpp>
    #include <boost/spirit/include/karma_left_alignment.hpp>

For the `center[]` directive:

    // forwards to <boost/spirit/home/karma/directive/center_alignment.hpp>
    #include <boost/spirit/include/karma_center_alignment.hpp>

For the `right_align[]` directive:

    // forwards to <boost/spirit/home/karma/directive/right_alignment.hpp>
    #include <boost/spirit/include/karma_right_alignment.hpp>

Also, see __include_structure__.

[heading Namespace]

[table
    [[Name]]
    [[`boost::spirit::left_align  // alias: boost::spirit::karma::left_align` ]]
    [[`boost::spirit::center      // alias: boost::spirit::karma::center` ]]
    [[`boost::spirit::right_align // alias: boost::spirit::karma::right_align` ]]
]

[heading Model of]

[:__unary_generator_concept__]

[variablelist Notation
    [[`a`]            [A generator object]]
    [[`pad`]          [A generator object, or a __karma_lazy_argument__ that 
                       evaluates to a generator object]]
    [[`A`, `Pad`]     [Attribute types of the generators `a` and `pad`]]
    [[`width`]        [Numeric literal, any unsigned integer value, or
                       a __karma_lazy_argument__ that evaluates to an unsigned 
                       integer value]]]

[heading Expression Semantics]

Semantics of an expression is defined only where it differs from, or is not
defined in __unary_generator_concept__.

[table 
    [[Expression]                   [Semantics]]
    [[`left_align[a]`]              [Generate `a` left aligned in a column of 
                                     width as defined by the preprocessor constant
                                     `BOOST_KARMA_DEFAULT_FIELD_LENGTH` 
                                     (default: 10), while using `space` to emit 
                                     the necessary padding. This generator succeeds as 
                                     long as its embedded generator `a` does not 
                                     fail (unless the underlying output stream 
                                     reports an error).]]
    [[`left_align(width)[a]`]       [Generate `a` left aligned in a column of 
                                     the given `width`, while using `space` to emit 
                                     the necessary padding. This generator succeeds as 
                                     long as its embedded generator `a` does not 
                                     fail (unless the underlying output stream 
                                     reports an error).]]
    [[`left_align(pad)[a]`]         [Generate `a` left aligned in a column of 
                                     width as defined by the preprocessor constant
                                     `BOOST_KARMA_DEFAULT_FIELD_LENGTH` 
                                     (default: 10), while using the generator `pad` 
                                     to emit the necessary padding. This generator 
                                     succeeds as long as its embedded and padding 
                                     generators `a` and `pad` do not fail (except 
                                     if the underlying output stream reports an 
                                     error).]]
    [[`left_align(width, pad)[a]`]  [Generate `a` left aligned in a column of 
                                     the given `width`, while using the generator 
                                     `pad` to emit the necessary padding. This 
                                     generator succeeds as long as its embedded 
                                     and padding generators `a` and `pad` do not 
                                     fail (unless the underlying output stream 
                                     reports an error).]]

    [[`center[a]`]                  [Generate `a` centered in a column of 
                                     width as defined by the preprocessor constant
                                     `BOOST_KARMA_DEFAULT_FIELD_LENGTH` 
                                     (default: 10), while using `space` to emit 
                                     the necessary padding. This generator succeeds as 
                                     long as its embedded generator `a` does not 
                                     fail (unless the underlying output stream 
                                     reports an error).]]
    [[`center(width)[a]`]           [Generate `a` centered in a column of 
                                     the given `width`, while using `space` to emit 
                                     the necessary padding. This generator succeeds as 
                                     long as its embedded generator `a` does not 
                                     fail (unless the underlying output stream 
                                     reports an error).]]
    [[`center(pad)[a]`]             [Generate `a` centered in a column of 
                                     width as defined by the preprocessor constant
                                     `BOOST_KARMA_DEFAULT_FIELD_LENGTH` 
                                     (default: 10), while using the generator `pad` 
                                     to emit the necessary padding. This generator 
                                     succeeds as long as its embedded and padding 
                                     generators `a` and `pad` do not fail (except 
                                     if the underlying output stream reports an 
                                     error).]]
    [[`center(width, pad)[a]`]      [Generate `a` centered in a column of 
                                     the given `width`, while using the generator 
                                     `pad` to emit the necessary padding. This 
                                     generator succeeds as long as its embedded 
                                     and padding generators `a` and `pad` do not 
                                     fail (unless the underlying output stream 
                                     reports an error).]]

    [[`right_align[a]`]             [Generate `a` right aligned in a column of 
                                     width as defined by the preprocessor constant
                                     `BOOST_KARMA_DEFAULT_FIELD_LENGTH` 
                                     (default: 10), while using `space` to emit 
                                     the necessary padding. This generator succeeds as 
                                     long as its embedded generator `a` does not 
                                     fail (unless the underlying output stream 
                                     reports an error).]]
    [[`right_align(width)[a]`]      [Generate `a` right aligned in a column of 
                                     the given `width`, while using `space` to emit 
                                     the necessary padding. This generator succeeds as 
                                     long as its embedded generator `a` does not 
                                     fail (unless the underlying output stream 
                                     reports an error).]]
    [[`right_align(pad)[a]`]        [Generate `a` right aligned in a column of 
                                     width as defined by the preprocessor constant
                                     `BOOST_KARMA_DEFAULT_FIELD_LENGTH` 
                                     (default: 10), while using the generator `pad` 
                                     to emit the necessary padding. This generator 
                                     succeeds as long as its embedded and padding 
                                     generators `a` and `pad` do not fail (except 
                                     if the underlying output stream reports an 
                                     error).]]
    [[`right_align(width, pad)[a]`] [Generate `a` right aligned in a column of 
                                     the given `width`, while using the generator 
                                     `pad` to emit the necessary padding. This 
                                     generator succeeds as long as its embedded 
                                     and padding generators `a` and `pad` do not 
                                     fail (unless the underlying output stream 
                                     reports an error).]]
]

[note   None of the generator directives listed above limits the emitted output 
        to the respective column width. If the emitted output is longer than 
        the specified (or implied) column width, the generated output overruns
        the column to the right.

        If the output needs to be limited to a specified column width, use the
        `maxwidth[]` directive, for instance:
        ``
            maxwidth(8)[right_align(12)["1234567890"]]
        ``
        which will output (without the quotes): ``"  123456"``
]

[heading Attributes]

See __karma_comp_attr_notation__.

[table 
    [[Expression]       [Attribute]]
    [[`left_align[]`]
[``a: A --> left_align[a]: A
a: Unused --> left_align[a]: Unused``]]
    [[`left_align(width)[]`]
[``a: A --> left_align(width)[a]: A
a: Unused --> left_align(width)[a]: Unused``]]
    [[`left_align(pad)[]`]
[``a: A, pad: Pad --> left_align(pad)[a]: A
a: Unused, pad: Pad --> left_align(pad)[a]: Unused``]]
    [[`left_align(pad, width)[]`]
[``a: A, pad: Pad --> left_align(pad, width)[a]: A
a: Unused, pad: Pad --> left_align(pad, width)[a]: Unused``]]

    [[`center[]`]
[``a: A --> center[a]: A
a: Unused --> center[a]: Unused``]]
    [[`center(width)[]`]
[``a: A --> center(width)[a]: A
a: Unused --> center(width)[a]: Unused``]]
    [[`center(pad)[]`]
[``a: A, pad: Pad --> center(pad)[a]: A
a: Unused, pad: Pad --> center(pad)[a]: Unused``]]
    [[`center(pad, width)[]`]
[``a: A, pad: Pad --> center(pad, width)[a]: A
a: Unused, pad: Pad --> center(pad, width)[a]: Unused``]]

    [[`right_align[]`]
[``a: A --> right_align[a]: A
a: Unused --> right_align[a]: Unused``]]
    [[`right_align(width)[]`]
[``a: A --> right_align(width)[a]: A
a: Unused --> right_align(width)[a]: Unused``]]
    [[`right_align(pad)[]`]
[``a: A, pad: Pad --> right_align(pad)[a]: A
a: Unused, pad: Pad --> right_align(pad)[a]: Unused``]]
    [[`right_align(pad, width)[]`]
[``a: A, pad: Pad --> right_align(pad, width)[a]: A
a: Unused, pad: Pad --> right_align(pad, width)[a]: Unused``]]
]

[heading Complexity]

[:The overall complexity of the alignment generator directives is defined by 
  the complexity of its embedded and padding generator. The complexity of the 
  left alignment directive generator itself is O(1). The complexity of the 
  center and right alignment directive generators itself is O(N). where `N`
  is the number of characters emitted by the embedded and padding generators.]

[heading Example]

[note The test harness for the example(s) below is presented in the
      __karma_basics_examples__ section.]

Some includes:

[reference_karma_includes]

Some using declarations:

[reference_karma_using_declarations_alignment]

Basic usage of the alignment generators:

[reference_karma_alignment]

[endsect] [/ alignment]

[/////////////////////////////////////////////////////////////////////////////]
[section:repeat Repetition Directive (`repeat[]`)]

[heading Description]

The repetition directive allows to repeat an arbitrary generator expression 
while optionally specifying the lower and upper repetition counts. It provides 
a more powerful and flexible mechanism for repeating a generator. There are 
grammars that are impractical and cumbersome, if not impossible, for the basic 
EBNF iteration syntax ([karma_kleene unary `'*'`] and the [karma_plus unary `'+'`]) 
to specify. Examples:

* A file name may have a maximum of 255 characters only.
* A specific bitmap file format has exactly 4096 RGB color information.
* A 256 bit binary string (1..256 1s or 0s).

[heading Header]

    // forwards to <boost/spirit/home/karma/directive/repeat.hpp>
    #include <boost/spirit/include/karma_repeat.hpp>

Also, see __include_structure__.

[heading Namespace]

[table
    [[Name]]
    [[`boost::spirit::repeat    // alias: boost::spirit::karma::repeat` ]]
    [[`boost::spirit::inf       // alias: boost::spirit::karma::inf` ]]
]

[heading Model of]

[:__unary_generator_concept__]

[variablelist Notation
    [[`a`]              [A generator object]]
    [[`num, num1, num2`][Numeric literals, any unsigned integer value, or
                         a __karma_lazy_argument__ that evaluates to an 
                         unsigned integer value]]
    [[`inf`]            [Placeholder expression standing for 'no upper repeat 
                         limit']]
]

[heading Expression Semantics]

Semantics of an expression is defined only where it differs from, or is not
defined in __unary_generator_concept__.

[table 
    [[Expression]                   [Semantics]]
    [[`repeat[a]`]                  [Repeat the generator `a` zero or more times. 
                                     This generator succeeds as long as its 
                                     embedded generator `a` does not fail (except 
                                     if the underlying output stream reports an 
                                     error). This variant of `repeat[]` is 
                                     semantically equivalent to the 
                                     [karma_kleene Kleene Star operator `*a`]]]
    [[`repeat(num)[a]`]             [Repeat the generator `a` exactly `num` 
                                     times. This generator succeeds as long as its 
                                     embedded generator `a` does not fail and 
                                     as long as the associated attribute 
                                     (container) contains at least `num` elements
                                     (unless the underlying output stream 
                                     reports an error).]]
    [[`repeat(num1, num2)[a]`]      [Repeat the generator `a` at least `num1` 
                                     times but not more than `num2` times. This 
                                     generator succeeds as long as its 
                                     embedded generator `a` does not fail and 
                                     as long as the associated attribute 
                                     (container) contains at least `num1` elements
                                     (unless the underlying output stream 
                                     reports an error). If the associated
                                     attribute (container) does contain more 
                                     than `num2` elements, this directive 
                                     limits the repeat count to `num2`. ]]
    [[`repeat(num, inf)[a]`]        [Repeat the generator `a` at least `num1` 
                                     times. No upper limit for the repeat count
                                     is set. This generator succeeds as long as 
                                     its embedded generator `a` does not fail 
                                     and as long as the associated attribute 
                                     (container) contains at least `num` elements
                                     (unless the underlying output stream 
                                     reports an error).]]
]

[note All failing iterations of the embedded generator will consume one element
      from the supplied attribute. The overall `repeat[a]` will succeed as long 
      as the iteration criteria (number of successful invocations of the 
      embedded generator) is fulfilled (unless the underlying output stream 
      reports an error).]

[heading Attributes]

See __karma_comp_attr_notation__.

[table 
    [[Expression]             [Attribute]]
    [[`repeat[a]`]
[``a: A --> repeat[a]: vector<A>
a: Unused --> repeat[a]: Unused``]]
    [[`repeat(num)[a]`]
[``a: A --> repeat(num)[a]: vector<A>
a: Unused --> repeat(num)[a]: Unused``]]
    [[`repeat(num1, num2)[a]`]
[``a: A --> repeat(num1, num2)[a]: vector<A>
a: Unused --> repeat(num1, num2)[a]: Unused``]]
    [[`repeat(num, inf)[a]`]
[``a: A --> repeat(num, inf)[a]: vector<A>
a: Unused --> repeat(num, inf)[a]: Unused``]]
]

[important The table above uses `vector<A>` as placeholders only. 

           The notation of `vector<A>` stands for /any STL container/ holding
           elements of type `A`.]

It is important to note, that the `repeat[]` directive does not perform any 
buffering of the output generated by its embedded elements. That means that 
any failing element generator might have already generated some output, which 
is /not/ rolled back. 

[tip    The simplest way to force a `repeat[]` directive to behave as if it did 
        buffering is to wrap it into a buffering directive (see 
        __karma_buffer__):

        ``buffer[repeat[a]]``

        which will /not/ generate any output in case of a failing generator 
        `repeat[a]`. The expression:

        ``repeat[buffer[a]]``

        will not generate any partial output from a generator `a` if it fails
        generating in the middle of its output. The overall expression will 
        still generate the output as produced by all succeeded invocations of 
        the generator `a`.]

[heading Complexity]

[:The overall complexity of the repetition generator is defined by the 
  complexity of its embedded generator. The complexity of the repeat itself is 
  O(N), where N is the number of repetitions to execute.]

[heading Example]

[note The test harness for the example(s) below is presented in the
      __karma_basics_examples__ section.]

Some includes:

[reference_karma_includes]

Some using declarations:

[reference_karma_using_declarations_repeat]

Basic usage of `repeat` generator directive:

[reference_karma_repeat]

[endsect] [/ repeat]

[/////////////////////////////////////////////////////////////////////////////]
[section:delimit Directives Controlling Automatic Delimiting (`verbatim[]`, `no_delimit[]`, `delimit[]`)]

[heading Description]

The directives `delimit[]`, `no_delimit[]`, and `verbatim[]` can be used to 
control automatic delimiting. The directives `verbatim[]` and `no_delimit[]` 
disable any automatic delimiting, while the directive `delimit[]` (re-)enables 
automatic delimiting.

[heading Header]

For the `verbatim[]` directive:

    // forwards to <boost/spirit/home/karma/directive/verbatim.hpp>
    #include <boost/spirit/include/karma_verbatim.hpp>

For the `no_delimit[]` directive:

    // forwards to <boost/spirit/home/karma/directive/no_delimit.hpp>
    #include <boost/spirit/include/karma_no_delimit.hpp>

For the `delimit[]` directive:

    // forwards to <boost/spirit/home/karma/directive/delimit.hpp>
    #include <boost/spirit/include/karma_delimit.hpp>

Also, see __include_structure__.

[heading Namespace]

[table
    [[Name]]
    [[`boost::spirit::verbatim      // alias: boost::spirit::karma::verbatim` ]]
    [[`boost::spirit::no_delimit    // alias: boost::spirit::karma::no_delimit` ]]
    [[`boost::spirit::delimit       // alias: boost::spirit::karma::delimit` ]]
]

[heading Model of]

[:__unary_generator_concept__]

[variablelist Notation
    [[`a`]            [A generator object]]
    [[`d`]            [A generator object, or a __karma_lazy_argument__ that 
                       evaluates to a generator object]]
    [[`A`, `D`]       [Attribute types of the generators `a` and `d`]]]

[heading Expression Semantics]

Semantics of an expression is defined only where it differs from, or is not
defined in __unary_generator_concept__.

[table
    [[Expression]       [Semantics]]
    [[`delimit[a]`]     [Enable automatic delimiting for the embedded generator
                         `a` while using the `space` generator as the 
                         delimiting generator. If used inside a `verbatim[]` 
                         directive it re-enables the delimiter generator as used
                         outside of this `verbatim[]` instead. The directive succeeds
                         as long as the embedded generator succeeded (unless 
                         the underlying output stream reports an error).]]
    [[`delimit(d)[a]`]  [Enable automatic delimiting for the embedded generator
                         `a` while using the generator `d` as the 
                         delimiting generator. The directive succeeds
                         as long as the embedded generator succeeded (unless 
                         the underlying output stream reports an error).]]
    [[`verbatim[a]`]    [Disable automatic delimiting for the embedded generator
                         `a`. The directive succeeds
                         as long as the embedded generator succeeded (unless 
                         the underlying output stream reports an error). This 
                         directive it has no effect if it is used when no 
                         delimiting is active. When delimiting is active this
                         directive performs a post-delimit step (which is 
                         different from the behavior of `no_delimit[]`).]]
    [[`no_delimit[a]`]    [Disable automatic delimiting for the embedded generator
                         `a`. The directive succeeds
                         as long as the embedded generator succeeded (unless 
                         the underlying output stream reports an error). This 
                         directive it has no effect if it is used when no 
                         delimiting is active. When delimiting is active this
                         directive does not perform a post-delimit step (which is 
                         different from the behavior of `verbatim[]`.]]
]

[heading Attributes]

See __karma_comp_attr_notation__.

[table
    [[Expression]       [Attribute]]
    [[`delimit[a]`]
[``a: A --> delimit[a]: A
a: Unused --> delimit[a]: Unused``]]
    [[`delimit(d)[a]`]
[``a: A, d: D --> delimit(d)[a]: A
a: Unused, d: D --> delimit(d)[a]: Unused``]]
    [[`verbatim[a]`]
[``a: A --> verbatim[a]: A
a: Unused --> verbatim[a]: Unused``]]
    [[`no_delimit[a]`]
[``a: A --> no_delimit[a]: A
a: Unused --> no_delimit[a]: Unused``]]
]

[heading Complexity]

[:The overall complexity of the generator directives `delimit[]`, `verbatim[]`, 
  and `no_delimit[]` is defined by the complexity of its embedded generators. 
  The complexity of the directives themselves is O(1).]

[heading Example]

[note The test harness for the example(s) below is presented in the
      __karma_basics_examples__ section.]

Some includes:

[reference_karma_includes_simple]

Some using declarations:

[reference_karma_using_declarations_delimit]

Basic usage of `delimit` generator directive:

[reference_karma_delimit]

[endsect] [/ verbatim/delimit/no_delimit]

[/////////////////////////////////////////////////////////////////////////////]
[section:upperlower Directives Controlling Case Sensitivity (`upper[]`, `lower[]`)]

[heading Description]

The generator directives `ns::lower[]` and `ns::upper[]` force their embedded
generators to emit lower case or upper case only characters based on the 
interpretation of the generated characters in the character set defined by 
`ns` (see __karma_char_encoding_namespace__).

[heading Header]

    // forwards to <boost/spirit/home/karma/directive/upper_lower_case.hpp>
    #include <boost/spirit/include/karma_upper_lower_case.hpp>

Also, see __include_structure__.

[heading Namespace]

[table
    [[Name]]
    [[`ns::lower`]]
    [[`ns::upper`]]
]

In the table above, `ns` represents a __karma_char_encoding_namespace__. 

[heading Model of]

[:The model of `lower[]` and `upper[]` is the model of its subject generator.]

[variablelist Notation
    [[`a`]            [A generator object]]
    [[`A`]            [Attribute type of the generator `a`]]
    [[`ns`]           [A __karma_char_encoding_namespace__.]]]

[heading Expression Semantics]

The `lower[]` and `upper[]` directives have no special generator semantics. 
They are pure modifier directives. They indirectly influence the way all 
subject generators work. They add information (the `tag::upper` or `tag::lower`) 
to the `Modifier` template parameter used while transforming the `proto::expr`
into the corresponding generator expression. This is achieved by the
following specializations: 

    namespace boost { namespace spirit
    {
        template <typename CharEncoding>
        struct is_modifier_directive<
                karma::domain
              , tag::char_code<tag::lower, CharEncoding> >
          : mpl::true_ 
        {};

        template <typename CharEncoding>
        struct is_modifier_directive<
                karma::domain
              , tag::char_code<tag::upper, CharEncoding> >
          : mpl::true_ 
    }}

(for more details see the section describing the compilation process of the 
__boost_proto__ expression into the corresponding generator expressions).

[table
    [[Expression]       [Semantics]]
    [[`ns::lower[a]`]   [Generate `a` as lower case, interpreted in the 
                         character set defined by `ns`. The directive succeeds
                         as long as the embedded generator succeeded (unless 
                         the underlying output stream reports an error).]]
    [[`ns::upper[a]`]   [Generate `a` as upper case, interpreted in the 
                         character set defined by `ns`. The directive succeeds
                         as long as the embedded generator succeeded (unless 
                         the underlying output stream reports an error).]]
]

[note  If both directives are 'active' with regard to a generator, the  
       innermost of those directives takes precedence. For instance:
       ``
            generate(sink, ascii::lower['A' << ascii::upper['b']])
       ``
       will generate `"aB"` (without the quotes).

       Further, the directives will have no effect on generators emitting
       characters not having an upper case or lower case equivalent in the 
       character set defined by `ns`.
]

[heading Attributes]

See __karma_comp_attr_notation__.

[table
    [[Expression]       [Attribute]]
    [[`ns:lower[a]`]
[``a: A --> ns:lower[a]: A
a: Unused --> ns:lower[a]: Unused``]]
    [[`ns:upper[a]`]
[``a: A --> ns:upper[a]: A
a: Unused --> ns:upper[a]: Unused``]]
]

[heading Complexity]

[:The overall complexity of the generator directives `ns::lower[]` and `ns::upper[]` 
  is defined by the complexity of its embedded generators. The directives 
  themselves are compile time only directives, having no impact on runtime 
  performance.]

[heading Example]

[note The test harness for the example(s) below is presented in the
      __karma_basics_examples__ section.]

Some includes:

[reference_karma_includes_simple]

Some using declarations:

[reference_karma_using_declarations_upperlower]

Basic usage of the `upper` and `lower` generator directives:

[reference_karma_upperlower]

[endsect] [/ upper/lower]

[/////////////////////////////////////////////////////////////////////////////]
[section:maxwidth Controlling the Maximum Field Width (`maxwidth[]`)]

[heading Description]

The `maxwidth[]` directive allows to limit (truncate) the overall length of the 
output generated by the embedded generator.

[heading Header]

    // forwards to <boost/spirit/home/karma/directive/maxwidth.hpp>
    #include <boost/spirit/include/karma_maxwidth.hpp>

Also, see __include_structure__.

[table
    [[Name]]
    [[`boost::spirit::maxwidth // alias: boost::spirit::karma::maxwidth` ]]
]

[heading Model of]

[:__unary_generator_concept__]

[variablelist Notation
    [[`a`]            [A generator object]]
    [[`A`]            [Attribute type of the generator `a`]]
    [[`num`]          [Numeric literal, any unsigned integer value, or
                       a __karma_lazy_argument__ that evaluates to an unsigned 
                       integer value]]]

[heading Expression Semantics]

Semantics of an expression is defined only where it differs from, or is not
defined in __unary_generator_concept__.

[table
    [[Expression]           [Semantics]]
    [[`maxwidth[a]`]        [Limit the overall length of the emitted output of 
                             the embedded generator (including characters 
                             generated by automatic delimiting) to the number
                             of characters as defined by the preprocessor constant
                             `BOOST_KARMA_DEFAULT_FIELD_MAXWIDTH`. Any additional
                             output is truncated. The directive succeeds as long 
                             as the embedded generator succeeded (unless 
                             the underlying output stream reports an error).]]
    [[`maxwidth(num)[a]`]   [Limit the overall length of the emitted output of 
                             the embedded generator (including characters 
                             generated by automatic delimiting) to the number
                             of characters as defined by `num`. Any additional
                             output is truncated. The directive succeeds as long 
                             as the embedded generator succeeded (unless the 
                             underlying output stream reports an error).]]
]

[note   The `maxwidth[]` generator directive does not pad the generated output
        to fill the specified column width. If the emitted output is shorter 
        than the specified (or implied) column width, the generated output will
        be more narrow than the column width.

        If the output needs to always be equal to a specified column width, use 
        one of the alignment directives `left-align[]`, `center[]`, or 
        `right_align[]`, for instance:
        ``
            maxwidth(8)[left_align(8)["1234"]]
        ``
        which will output: `"1234    "` (without the quotes).
]

[heading Attributes]

See __karma_comp_attr_notation__.

[table
    [[Expression]       [Attribute]]
    [[`maxwidth[a]`]
[``a: A --> maxwidth[a]: A
a: Unused --> maxwidth[a]: Unused``]]
    [[`maxwidth(num)[a]`]
[``a: A --> maxwidth(num)[a]: A
a: Unused --> maxwidth(num)[a]: Unused``]]
]

[heading Complexity]

[:The overall complexity of the generator directive `maxwidth[]` 
  is defined by the complexity of its embedded generator. The complexity of the 
  directive itself is O(N), where `N` is the number of characters generated 
  by the maxwidth directive.]

[heading Example]

[note The test harness for the example(s) below is presented in the
      __karma_basics_examples__ section.]

Some includes:

[reference_karma_includes_simple]

Some using declarations:

[reference_karma_using_declarations_maxwidth]

Basic usage of `maxwidth` generator directive:

[reference_karma_maxwidth]

[endsect] [/ maxwidth]

[/////////////////////////////////////////////////////////////////////////////]
[section:buffer Temporary Output Buffering (`buffer[]`)]

[heading Description]

All generator components (except the __karma_alternative__ generator) pass 
their generated output directly to the underlying output stream. If a generator 
fails halfway through, the output generated so far is not 'rolled back'. The 
buffering generator directive allows to avoid this unwanted output to be 
generated. It temporarily redirects the output produced by the embedded 
generator into a buffer. This buffer is flushed to the underlying stream only
after the embedded generator succeeded, but is discarded otherwise.

[heading Header]

    // forwards to <boost/spirit/home/karma/directive/buffer.hpp>
    #include <boost/spirit/include/karma_buffer.hpp>

Also, see __include_structure__.

[table
    [[Name]]
    [[`boost::spirit::buffer // alias: boost::spirit::karma::buffer` ]]
]

[heading Model of]

[:__unary_generator_concept__]

[variablelist Notation
    [[`a`]     [A generator object]]
    [[`A`]     [Attribute type of generator `a`]]]

[heading Expression Semantics]

Semantics of an expression is defined only where it differs from, or is not
defined in __unary_generator_concept__.

[table
    [[Expression]       [Semantics]]
    [[`buffer[a]`]      [The embedded generator `a` is invoked but its output
                         is temporarily intercepted and stored in an internal
                         buffer. If `a` succeeds the buffer content is flushed
                         to the underlying output stream, otherwise the buffer
                         content is discarded. The buffer directive succeeds
                         as long as the embedded generator succeeded (unless 
                         the underlying output stream reports an error).]]
]

[tip  If you want to make the buffered generator succeed regardless of the 
      outcome of the embedded generator, simply wrap the `buffer[a]` into an
      additional optional: `-buffer[a]` (see __karma_optional__).]

[heading Attributes]

See __karma_comp_attr_notation__.

[table
    [[Expression]       [Attribute]]
    [[`buffer[a]`]
[``a: A --> buffer[a]: A
a: Unused --> buffer[a]: Unused``]]
]

[heading Complexity]

[:The overall complexity of the buffering generator directive is defined by the 
  complexity of its embedded generator. The complexity of the buffering 
  directive generator itself is O(N), where N is the number of characters 
  buffered.]

[heading Example]

[note The test harness for the example(s) below is presented in the
      __karma_basics_examples__ section.]

Some includes:

[reference_karma_includes]

Some using declarations:

[reference_karma_using_declarations_buffer]

Basic usage of a buffering generator directive. It shows how the partial 
output generated in the first example does not show up in the generated output
as the plus generator fails (no data is available, see __karma_plus__).

[reference_karma_buffer]

[endsect] [/ buffer]

[/////////////////////////////////////////////////////////////////////////////]
[section:omit Consume Attribute (`omit[]` and `skip[]`)]

[heading Description]

The directives `omit[]` and `skip[]` consumes the attribute type of the 
embedded generator without generating any output. The `omit[]` directive
will still execute the embedded generator while discarding the generated output
afterwards. The `skip[]` directive will not execute the embedded generator, but 
will use it only to extract the exposed attribute type.

[heading Header]

    // forwards to <boost/spirit/home/karma/directive/omit.hpp>
    #include <boost/spirit/include/karma_omit.hpp>

Also, see __include_structure__.

[table
    [[Name]]
    [[`boost::spirit::omit // alias: boost::spirit::karma::omit` ]]
    [[`boost::spirit::skip // alias: boost::spirit::karma::skip` ]]
]

[heading Model of]

[:__unary_generator_concept__]

[variablelist Notation
    [[`a`]     [A generator object]]
    [[`A`]     [Attribute type of generator `a`]]]

[heading Expression Semantics]

Semantics of an expression is defined only where it differs from, or is not
defined in __unary_generator_concept__.

[table
    [[Expression]       [Semantics]]
    [[`omit[a]`]        [The `omit` directive consumes the attribute type of the 
                         embedded generator `A` without generating any output. 
                         It succeeds always. The embedded generator is executed
                         and any generated output is discarded.]]
    [[`skip[a]`]        [The `skip` directive consumes the attribute type of the 
                         embedded generator `A` without generating any output. 
                         It succeeds always. The embedded generator is not 
                         executed.]]
]

[heading Attributes]

See __karma_comp_attr_notation__.

[table
    [[Expression]       [Attribute]]
    [[`omit[a]`]
[``a: A --> omit[a]: A
a: Unused --> omit[a]: Unused``]]
    [[`skip[a]`]
[``a: A --> skip[a]: A
a: Unused --> skip[a]: Unused``]]
]

[heading Complexity]

[:The overall complexity of the `omit[]` directive depends on the complexity
  of the embedded generator. The overall complexity of the `skip[]` generator 
  directive is O(1) as it does not generate any output.]

[heading Example]

[note The test harness for the example(s) below is presented in the
      __karma_basics_examples__ section.]

Some includes:

[reference_karma_includes]

Some using declarations:

[reference_karma_using_declarations_omit]

Basic usage of a `omit` generator directive. It shows how it consumes the first 
element of the provided attribute without generating anything, leaving the 
second element of the attribute to the non-wrapped `double_` generator.

[reference_karma_omit]

Generally, this directive is helpful in situations, where the attribute type 
contains more information (elements) than need to be used to generate the 
required output. Normally in such situations we would resolve to use semantic 
actions to explicitly pass the correct parts of the overall attribute to the 
generators. The `omit` directive helps achieving the same without having to use 
semantic actions. 

Consider the attribute type:

    typedef fusion::vector<int, double, std::string> attribute_type;

where we need to generate output only from the first and last element:

    typedef std::back_insert:iterator<std::string> iterator_type;

    karma::rule<iterator_type, attribute_type()> r;
    r = int_[_1 = phoenix::at_c<0>(_val)] << string[_1 = phoenix::at_c<2>(_val)];

    std::string str;
    iterator_type sink(str);
    generate(sink, r, attribute_type(1, 2.0, "example"));  // will generate: '1example'

This is error prone and not really readable. The same can be achieved by using 
the `omit` directive:

    r = int_ << omit[double_] << string;

which is at the same time more readable and more efficient as we don't have to 
use semantic actions.

The semantics of using the `skip[]` directive are identical to the `omit[]`
directive, except that it does not actually execute the embedded generator. 
For this reason it is usually preferable to utilize the `skip[]` directive 
instead of the `omit[]` directive. On the other hand, the `omit[]` directive
is very useful whenever the embedded generator produces side effects (has
semantic actions which need to be executed).

[endsect] [/ omit]

[/////////////////////////////////////////////////////////////////////////////]
[section:duplicate Duplicate Attribute (`duplicate[]`)]

[heading Description]

The directive `duplicate[]` duplicates its attribute to all elements of the 
embedded generator if this is a sequence generator. Otherwise it does nothing.

[heading Header]

    // forwards to <boost/spirit/home/karma/directive/duplicate.hpp>
    #include <boost/spirit/include/karma_duplicate.hpp>

Also, see __include_structure__.

[table
    [[Name]]
    [[`boost::spirit::duplicate // alias: boost::spirit::karma::duplicate` ]]
]

[heading Model of]

[:__unary_generator_concept__]

[variablelist Notation
    [[`a`]     [A generator object]]
    [[`A`]     [Attribute type of generator `a`]]]

[heading Expression Semantics]

Semantics of an expression is defined only where it differs from, or is not
defined in __unary_generator_concept__.

[table
    [[Expression]       [Semantics]]
    [[`duplicate[a]`]   [The `duplicate` directive duplicates the supplied 
                         attribute for all elements of a embedded sequence 
                         generator. For all other types of embedded generators
                         it has no effect. It succeeds as long as its embedded
                         generator does not fail.]]
]

[heading Attributes]

See __karma_comp_attr_notation__.

[table
    [[Expression]       [Attribute]]
    [[`duplicate[a]`]
[``a: A --> duplicate[a]: A
a: tuple<A, A, ...> --> duplicate[a]: A
a: Unused --> duplicate[a]: Unused``]]
]

If the embedded generator of the `duplicate[]` directive is a sequence it is
expected that all elements of this sequence expose either the same attribute 
type, an compatible attribute type, or `unused`. In this case, the 
`duplicate[]` directive exposes the attribute type of its first element. The 
behavior of the `duplicate[]` directive is undefined if the elements of an 
embedded sequence do not expose the same attributes. Most likely, the 
corresponding expression will not compile.

[heading Complexity]

[:The overall complexity of the `duplicate[]` directive depends on the complexity
  of the embedded generator.]

[heading Example]

[note The test harness for the example(s) below is presented in the
      __karma_basics_examples__ section.]

Some includes:

[reference_karma_includes]

Some using declarations:

[reference_karma_using_declarations_duplicate]

Basic usage of the `duplicate` generators:

[reference_karma_duplicate]

[endsect] [/ duplicate]

[/////////////////////////////////////////////////////////////////////////////]
[section:columns Separate Output Into Columns (`columns[]`)]

[heading Description]

The `columns[]` directive separates the output emitted by the embedded 
generator by inserting special column separators.

[heading Header]

    // forwards to <boost/spirit/home/karma/directive/columns.hpp>
    #include <boost/spirit/include/karma_columns.hpp>

Also, see __include_structure__.

[table
    [[Name]]
    [[`boost::spirit::columns // alias: boost::spirit::karma::columns` ]]
]

[heading Model of]

[:__unary_generator_concept__]

[variablelist Notation
    [[`a`]     [A generator object]]
    [[`g`]     [A generator object, or a __karma_lazy_argument__ that 
                evaluates to a generator object, will be used to emit column 
                separators]]
    [[`A`]     [Attribute type of generator `a`]
    [[`num`]   [Numeric literal, any unsigned integer value, or
                a __karma_lazy_argument__ that evaluates to an unsigned 
                integer value defining the number of items to emit in between
                the column separators]]]

[heading Expression Semantics]

Semantics of an expression is defined only where it differs from, or is not
defined in __unary_generator_concept__.

[table
    [[Expression]       [Semantics]]
    [[`columns[a]`]     [The `columns` directive invokes a generator after
                         each N-th element of the embedded generator has been 
                         emitted. The number of columns is defined by the 
                         preprocessor constant `BOOST_KARMA_DEFAULT_COLUMNS`.
                         The column separator used will be `karma::eol`.]]
    [[`columns(num)[a]`][The `columns` directive invokes a generator after
                         each N-th element of the embedded generator has been 
                         emitted. The number of columns is defined by the 
                         argument to the directive `num`.
                         The column separator used will be `karma::eol`.]]
    [[`columns(g)[a]`]  [The `columns` directive invokes a generator after
                         each N-th element of the embedded generator has been 
                         emitted. The number of columns is defined by the 
                         preprocessor constant `BOOST_KARMA_DEFAULT_COLUMNS`.
                         The column separator used will be `g`.]]
    [[`columns(num, g)[a]`]  [The `columns` directive invokes a generator after
                         each N-th element of the embedded generator has been 
                         emitted. The number of columns is defined by the 
                         argument to the directive `num`.
                         The column separator used will be `g`.]]
]

[heading Attributes]

See __karma_comp_attr_notation__.

[table
    [[Expression]       [Attribute]]
    [[`columns[a]`]
[``a: A --> columns[a]: A
a: Unused --> columns[a]: Unused``]]
    [[`columns(num)[a]`]
[``a: A --> columns(num)[a]: A
a: Unused --> columns(num)[a]: Unused``]]
    [[`columns(g)[a]`]
[``a: A --> columns(g)[a]: A
a: Unused --> columns(g)[a]: Unused``]]
    [[`columns(num, g)[a]`]
[``a: A --> columns(num, g)[a]: A
a: Unused --> columns(num, g)[a]: Unused``]]
]

[heading Complexity]

[:The overall complexity of the `columns` generator directive depends on the 
complexity of the embedded generator. The complexity of the `columns` generator 
directive itself is O(N), where `N` is the number of inserted column 
separators.]

[heading Example]

[note The test harness for the example(s) below is presented in the
      __karma_basics_examples__ section.]

Some includes:

[reference_karma_includes]

Some using declarations:

[reference_karma_using_declarations_columns]

Basic usage of the `columns` generators:

[reference_karma_columns]

[endsect] [/ columns]

[endsect] [/ directives]
