[/==============================================================================
    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 Operator]

Operators are used as a means for object composition and embedding.
Simple generators may be composed to form composites through operator
overloading, crafted to approximate the syntax of __peg__ (PEG). An
expression such as:

    a | b

yields a new generator type which is a composite of its operands, `a` and
`b`. 

This module includes different generators which get instantiated if one of the
overloaded operators is used with more primitive generator constructs. It 
includes sequences (`a << b`), alternatives (`a | b`), Kleene star (unary `*`), 
plus (unary `+`), optional (unary `-`), lists (`a % b`), and the two predicates, the 
/and/ predicate (unary `&`) and the /not/ predicate (unary `!`).

[heading Module Header]

    // forwards to <boost/spirit/home/karma/operator.hpp>
    #include <boost/spirit/include/karma_operator.hpp>

Also, see __include_structure__.

[/////////////////////////////////////////////////////////////////////////////]
[section:sequence Sequences (`a << b`)]

[heading Description]

Generator sequences are used to consecutively combine different, more primitive 
generators. All generators in a sequence are invoked from left to right as long 
as they succeed. 

[heading Header]

    // forwards to <boost/spirit/home/karma/operator/sequence.hpp>
    #include <boost/spirit/include/karma_sequence.hpp>

Also, see __include_structure__.

[heading Model of]

[:__nary_generator_concept__]

[heading Expression Semantics]

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

[table
    [[Expression]       [Semantics]]
    [[`a << b`]         [The generators `a` and `b` are executed sequentially
                         from left to right and as long as they succeed. A 
                         failed generator stops the execution of the entire 
                         sequence and makes the sequence fail as well.]]
]

It is important to note, that sequences don't perform any buffering of the
output generated by its elements. That means that any failing sequence might
have already generated some output, which is /not/ rolled back. 

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

        ``buffer[a << b << c]``

        which will /not/ generate any output in case of a failing sequence.]

[heading Attributes]

See __karma_comp_attr_notation__.

[table
    [[Expression]       [Attribute]]
    [[`a << b` (sequence)]  
[``a: A, b: B --> (a << b): tuple<A, B>
a: A, b: Unused --> (a << b): A
a: Unused, b: B --> (a << b): B
a: Unused, b: Unused --> (a << b): Unused

a: A, b: A --> (a << b): vector<A>
a: vector<A>, b: A --> (a << b): vector<A>
a: A, b: vector<A> --> (a << b): vector<A>
a: vector<A>, b: vector<A> --> (a << b): vector<A>``]]
]

[important The table above uses `tuple<A, B>` and `vector<A>` as placeholders 
           only. 

           The notation `tuple<A, B>` stands for /any fusion sequence of two 
           elements/, where `A` is the type of its first element and `B` is the 
           type of its second element.

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

The attribute composition and propagation rules as shown in the table above make 
sequences somewhat special as they can operate in two modes if all elements have
the same attribute type: consuming fusion sequences and consuming STL 
containers. The selected mode depends on the type of the attribute supplied.

[heading Complexity]

[:The overall complexity of the sequence generator is defined by the sum of the 
  complexities of its elements. The complexity of the sequence itself is O(N), 
  where N is the number of elements in the sequence.]

[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_sequence]

Basic usage of a sequence:

[reference_karma_sequence]

[endsect]

[/////////////////////////////////////////////////////////////////////////////]
[section:alternative Alternative (`a | b`)]

[heading Description]

Generator alternatives are used to combine different, more primitive generators
into alternatives. All generators in an alternative are invoked from left to 
right until one of them succeeds. 

[heading Header]

    // forwards to <boost/spirit/home/karma/operator/alternative.hpp>
    #include <boost/spirit/include/karma_alternative.hpp>

Also, see __include_structure__.

[heading Model of]

[:__nary_generator_concept__]

[heading Expression Semantics]

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

[table
    [[Expression]       [Semantics]]
    [[`a | b`]          [The generators `a` and `b` are executed sequentially
                         from left to right until one of them succeeds. A 
                         failed generator forces the alternative generator to 
                         try the next one. The alternative fails as a whole 
                         only if all elements of the alternative fail. Each
                         element of the alternative gets passed the whole 
                         attribute of the alternative.]]
]

Alternatives intercept and buffer the output of the currently executed element.
This allows to avoid partial outputs from failing elements as the buffered 
content will be forwarded to the actual output only after an element succeeded.

[heading Attributes]

See __karma_comp_attr_notation__.

[table
    [[Expression]        [Attribute]]
    [[`a | b` (alternative)]
[``a: A, b: B --> (a | b): variant<A, B>
a: A, b: Unused --> (a | b): A
a: Unused, b: B --> (a | b): B
a: Unused, b: Unused --> (a | b): Unused
a: A, b: A --> (a | b): A``]]
]

[important The table above uses `variant<A, B>` as a placeholder only. The 
           notation `variant<A, B>` stands for the type `boost::variant<A, B>`.
]

The attribute handling of Alternatives is special as their behavior is 
not completely defined at compile time. First of all the selected alternative 
element depends on the actual type of the attribute supplied to the alternative 
generator (i.e. what is stored in the variant). The attribute type supplied at 
/runtime/ narrows the set of considered alternatives to those being compatible 
attribute wise. The remaining alternatives are tried sequentially until the 
first of them succeeds. See below for an example of this behavior.

[heading Complexity]

[:The overall complexity of the alternative generator is defined by the sum of 
  the complexities of its elements. The complexity of the alternative itself is 
  O(N), where N is the number of elements in the alternative.]

[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_alternative]

Basic usage of an alternative. While being only the second alternative, the 
`double_` generator is chosen for output formatting because the supplied 
attribute type is not compatible (i.e. not convertible) to the attribute type 
of the `string` alternative.

[reference_karma_alternative1]

The same formatting rules may be used to output a string. This time we supply
the string `"example"`, resulting in the first alternative to be chosen for the 
generated output.

[reference_karma_alternative2]

[endsect]

[/////////////////////////////////////////////////////////////////////////////]
[section:kleene Kleene Star (`*a`)]

[heading Description]

Kleene star generators are used to repeat the execution of an embedded generator 
zero or more times. Regardless of the success of the embedded generator, the
Kleene star generator always succeeds.

[heading Header]

    // forwards to <boost/spirit/home/karma/operator/kleene.hpp>
    #include <boost/spirit/include/karma_kleene.hpp>

Also, see __include_structure__.

[heading Model of]

[:__unary_generator_concept__]

[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]]
    [[`*a`]             [The generator `a` is executed zero or more times 
                         depending on the availability of an attribute. The 
                         execution of `a` stops after the attribute values
                         passed to the Kleene star generator are exhausted.
                         The Kleene star always succeeds (unless the 
                         underlying output stream reports an error).]]
]

[note All failing iterations of the embedded generator will consume one element
      from the supplied attribute.]

[heading Attributes]

See __karma_comp_attr_notation__.

[table
    [[Expression]           [Attribute]]
    [[`*a` (Kleene star, unary `*`)]
[``a: A --> *a: vector<A>
a: Unused --> *a: Unused``]]
]

[important The table above uses `vector<A>` as a placeholder only. The notation 
           of `vector<A>` stands for /any STL container/ holding elements of 
           type `A`.]

The Kleene star generator will execute its embedded generator once for each 
element in the provided container attribute as long as the embedded 
generator succeeds. On each iteration it will pass the next consecutive element 
from the container attribute to the embedded generator. Therefore the number of 
iterations will not be larger than the number of elements in the container 
passed as its attribute. An empty container will make the Kleene star 
generate no output at all.

It is important to note, that the Kleene star 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 Kleene star to behave as if it did 
        buffering is to wrap it into a buffering directive (see 
        __karma_buffer__):

        ``buffer[*a]``

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

        ``*(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 successful invocations of 
        the generator `a`.]

[heading Complexity]

[:The overall complexity of the Kleene star generator is defined by the 
  complexity of its embedded generator multiplied by the number of executed 
  iterations. The complexity of the Kleene star itself is O(N), where N is the 
  number of elements in the container passed as its attribute.]

[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_kleene]

Basic usage of a Kleene star generator:

[reference_karma_kleene]

[endsect]

[/////////////////////////////////////////////////////////////////////////////]
[section:plus Plus (`+a`)]

[heading Description]

The Plus generator is used to repeat the execution of an embedded generator 
one or more times. It succeeds if the embedded generator has been successfully
executed at least once.

[heading Header]

    // forwards to <boost/spirit/home/karma/operator/plus.hpp>
    #include <boost/spirit/include/karma_plus.hpp>

Also, see __include_structure__.

[heading Model of]

[:__unary_generator_concept__]

[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]]
    [[`+a`]             [The generator `a` is executed one or more times 
                         depending on the availability of an attribute. The 
                         execution of `a` stops after the attribute values
                         passed to the plus generator are exhausted.
                         The plus generator succeeds as long as its embedded 
                         generator has been successfully executed at least once 
                         (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 `+a` will succeed as long as at 
      least one invocation of the embedded generator will succeed (unless the 
      underlying output stream reports an error).]

[heading Attributes]

See __karma_comp_attr_notation__.

[table
    [[Expression]         [Attribute]]
    [[`+a` (unary `+`)]
[``a: A --> +a: vector<A>
a: Unused --> +a: Unused``]]
]

[important The table above uses `vector<A>` as a placeholder only. The notation 
           of `vector<A>` stands for /any STL container/ holding elements of 
           type `A`.]

The Plus generator will execute its embedded generator once for each 
element in the provided container attribute as long as the embedded 
generator succeeds. On each iteration it will pass the next consecutive element 
from the container attribute to the embedded generator. Therefore the number of 
iterations will not be larger than the number of elements in the container 
passed as its attribute. An empty container will make the plus generator fail.

It is important to note, that the plus generator 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 plus generator to behave as if it did 
        buffering is to wrap it into a buffering directive (see 
        __karma_buffer__):

        ``buffer[+a]``

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

        ``+(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 successful invocations of 
        the generator `a`.]

[heading Complexity]

[:The overall complexity of the plus generator is defined by the 
  complexity of its embedded generator multiplied by the number of executed 
  iterations. The complexity of the plus generator itself is O(N), where N is 
  the number of elements in the container passed as its attribute.]

[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_plus]

Basic usage of a plus generator:

[reference_karma_plus1]

A more sophisticated use case showing how to leverage the fact that plus is 
failing for empty containers passed as its attribute:

[reference_karma_plus2]

[endsect]

[/////////////////////////////////////////////////////////////////////////////]
[section:list Lists (`a % b`)]

[heading Description]

The list generator is used to repeat the execution of an embedded generator 
and intersperse it with the output of another generator one or more times. 
It succeeds if the embedded generator has been successfully executed at least 
once.

[heading Header]

    // forwards to <boost/spirit/home/karma/operator/list.hpp>
    #include <boost/spirit/include/karma_list.hpp>

Also, see __include_structure__.

[heading Model of]

[:__binary_generator_concept__]

[heading Expression Semantics]

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

[table
    [[Expression]       [Semantics]]
    [[`a % b`]          [The generator `a` is executed one or more times 
                         depending on the availability of an attribute. The 
                         output generated by `a` is interspersed with the output 
                         generated by `b`. The list generator succeeds if 
                         its first embedded generator has been 
                         successfully executed at least once  (unless the 
                         underlying output stream reports an error).]]
]

The list expression `a % b` is a shortcut for `a << *(b << a)`. It is almost
semantically equivalent, except for the attribute of `b`, which gets ignored 
in the case of the list generator.

[note All failing iterations of the embedded generator will consume one element
      from the supplied attribute. The overall `a % b` will succeed as long as at 
      least one invocation of the embedded generator, `a`, will succeed (unless 
      the underlying output stream reports an error).]

[heading Attributes]

See __karma_comp_attr_notation__.

[table
    [[Expression]         [Attribute]]
    [[`a % b` (list)]
[``a: A, b: B --> (a % b): vector<A>
a: Unused, b: B --> (a % b): Unused``]]
]

[important The table above uses `vector<A>` as a placeholder only. The notation 
           of `vector<A>` stands for /any STL container/ holding elements of 
           type `A`.]

The list generator will execute its embedded generator once for each 
element in the provided container attribute and as long as the embedded 
generator succeeds. The output generated by its first generator will be 
interspersed by the output generated by the second generator. On each iteration 
it will pass the next consecutive element from the container attribute to the 
first embedded generator. The second embedded generator does not get passed 
any attributes (it gets invoked using an `unused_type` as its attribute). 
Therefore the number of iterations will not be larger than the number of 
elements in the container passed as its attribute. An empty container will make 
the list generator fail.

[tip    If you want to use the list generator and still allow for an empty
        attribute, you can use the optional operator (see __karma_optional__):

        ``-(a % b)``

        which will succeed even if the provided container attribute does not
        contain any elements.
]

[heading Complexity]

[:The overall complexity of the list generator is defined by the 
  complexity of its embedded generators multiplied by the number of executed 
  iterations. The complexity of the list generator itself is O(N), where N is 
  the number of elements in the container passed as its attribute.]

[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_list]

Basic usage of a list generator:

[reference_karma_list]

[endsect]

[/////////////////////////////////////////////////////////////////////////////]
[section:optional Optional (`-a`)]

[heading Description]

The optional generator is used to conditionally execute an embedded generator. 
It succeeds always.

[heading Header]

    // forwards to <boost/spirit/home/karma/operator/optional.hpp>
    #include <boost/spirit/include/karma_optional.hpp>

Also, see __include_structure__.

[heading Model of]

[:__unary_generator_concept__]

[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]]
    [[`-a`]             [The generator `a` is executed depending on the 
                         availability of an attribute. The optional generator 
                         succeeds if its embedded generator succeeds 
                         (unless the underlying output stream reports an 
                         error).]]
]

[heading Attributes]

See __karma_comp_attr_notation__.

[table
    [[Expression]           [Attribute]]
    [[`-a` (optional, unary `-`)]
[``a: A --> -a: optional<A>
a: Unused --> -a: Unused``]]
]

[important The table above uses `optional<A>` as a placeholder only. The 
           notation of `optional<A>` stands for the data type 
           `boost::optional<A>`.]

The optional generator will execute its embedded generator once if the provided
attribute holds a valid value. It forwards the value held in its attribute
to the embedded generator.

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

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

        ``buffer[-a]``

        which will /not/ generate any output in case of a failing generator `-a`.
]

[heading Complexity]

[:The overall complexity of the optional generator is defined by the 
  complexity of its embedded generator. The complexity of the optional 
  generator itself 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]

Some using declarations:

[reference_karma_using_declarations_optional]

Basic usage of an optional generator:

[reference_karma_optional1]

Usage and result of an empty optional generator:

[reference_karma_optional2]

[endsect]

[/////////////////////////////////////////////////////////////////////////////]
[section:and_predicate And-Predicate (`&a`)]

[heading Description]

The and-predicate generator is used to test, whether the embedded generator 
succeeds without generating any output. It succeeds if the embedded generator
succeeds.

[heading Header]

    // forwards to <boost/spirit/home/karma/operator/and_predicate.hpp>
    #include <boost/spirit/include/karma_and_predicate.hpp>

Also, see __include_structure__.

[heading Model of]

[:__unary_generator_concept__]

[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]]
    [[`&a`]             [The generator `a` is executed for the sole purpose of
                         testing whether it succeeds. The and-predicate 
                         generator succeeds if its embedded generator 
                         succeeds (unless the underlying output stream 
                         reports an error). The and-predicate never produces 
                         any output.]]
]

The and generator is implemented by redirecting all output produced by its 
embedded generator into a discarding device. 

[heading Attributes]

See __karma_comp_attr_notation__.

[table
    [[Expression]                 [Attribute]]
    [[`&a` (and-predicate, unary `&`)]  [`a: A --> &a: A`]]
]

[note The attribute of the and-predicate is not always `unused_type`, which is 
      different from Qi's and-predicate. This is necessary as the generator the
      and predicate is attached to most of the time needs an attribute.
]

[heading Complexity]

[:The overall complexity of the and-predicate generator is defined by the 
  complexity of its embedded generator. The complexity of the and-predicate
  generator itself 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]

Some using declarations:

[reference_karma_using_declarations_and_predicate]

Basic usage of an and predicate generator:

[reference_karma_and_predicate]

[endsect]

[/////////////////////////////////////////////////////////////////////////////]
[section:not_predicate Not-Predicate (`!a`)]

[heading Description]

The not-predicate generator is used to test, whether the embedded generator 
fails, without generating any output. It succeeds if the embedded generator
fails.

[heading Header]

    // forwards to <boost/spirit/home/karma/operator/not_predicate.hpp>
    #include <boost/spirit/include/karma_not_predicate.hpp>

Also, see __include_structure__.

[heading Model of]

[:__unary_generator_concept__]

[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]]
    [[`!a`]             [The generator `a` is executed for the sole purpose of
                         testing whether it succeeds. The not-predicate 
                         generator succeeds if its embedded generator 
                         fails (unless the underlying output stream 
                         reports an error). The not-predicate never produces 
                         any output.]]
]

The not generator is implemented by redirecting all output produced by its 
embedded generator into a discarding device. 

[heading Attributes]

See __karma_comp_attr_notation__.

[table
    [[Expression]                 [Attribute]]
    [[`!a` (not-predicate, unary `!`)]  [`a: A --> !a: A`]]
]

[note The attribute of the not-predicate is not always `unused_type`, which is 
      different from Qi's not-predicate. This is necessary as the generator the
      and-predicate is attached to most of the time needs an attribute.
]

[heading Complexity]

[:The overall complexity of the not-predicate generator is defined by the 
  complexity of its embedded generator. The complexity of the not-predicate
  generator itself 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]

Some using declarations:

[reference_karma_using_declarations_not_predicate]

Basic usage of a not predicate generator:

[reference_karma_not_predicate]

[endsect]

[endsect]
