[/==============================================================================
    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:char Char]

This module includes different character oriented generators allowing to output
single characters. Currently, it includes literal chars (e.g. `'x'`, `L'x'`), 
`char_` (single characters, ranges and character sets) and the encoding 
specific character classifiers (`alnum`, `alpha`, `digit`, `xdigit`, etc.). 

[heading Module Header]

    // forwards to <boost/spirit/home/karma/char.hpp>
    #include <boost/spirit/include/karma_char.hpp>

Also, see __include_structure__.

[/////////////////////////////////////////////////////////////////////////////]
[section:char_generator Character Generators (`char_`, `lit`)]

[heading Description]

The character generators described in this section are:

The `char_` generator emits single characters. The `char_` generator has an
associated __karma_char_encoding_namespace__. This is needed when doing basic
operations such as forcing lower or upper case and dealing with
character ranges.

There are various forms of `char_`. 

[heading char_]

The no argument form of `char_` emits any character in the associated
__karma_char_encoding_namespace__.

    char_               // emits any character as supplied by the attribute

[heading char_(ch)]

The single argument form of `char_` (with a character argument) emits
the supplied character. 

    char_('x')          // emits 'x'
    char_(L'x')         // emits L'x'
    char_(x)            // emits x (a char)

[heading char_(first, last)]

`char_` with two arguments, emits any character from a range of characters as 
supplied by the attribute.

    char_('a','z')      // alphabetic characters
    char_(L'0',L'9')    // digits

A range of characters is created from a low-high character pair. Such a
generator emits a single character that is in the range, including both
endpoints. Note, the first character must be /before/ the second,
according to the underlying __karma_char_encoding_namespace__.

Character mapping is inherently platform dependent. It is not guaranteed
in the standard for example that `'A' < 'Z'`, that is why in Spirit2, we
purposely attach a specific __karma_char_encoding_namespace__ (such as ASCII,
ISO-8859-1) to the `char_` generator to eliminate such ambiguities.

[note *Sparse bit vectors*

To accommodate 16/32 and 64 bit characters, the char-set statically
switches from a `std::bitset` implementation when the character type is
not greater than 8 bits, to a sparse bit/boolean set which uses a sorted
vector of disjoint ranges (`range_run`). The set is constructed from
ranges such that adjacent or overlapping ranges are coalesced.

`range_runs` are very space-economical in situations where there are lots
of ranges and a few individual disjoint values. Searching is O(log n)
where n is the number of ranges.]

[heading char_(def)]

Lastly, when given a string (a plain C string, a `std::basic_string`,
etc.), the string is regarded as a char-set definition string following
a syntax that resembles posix style regular expression character sets
(except that double quotes delimit the set elements instead of square
brackets and there is no special negation ^ character). Examples:

    char_("a-zA-Z")     // alphabetic characters
    char_("0-9a-fA-F")  // hexadecimal characters
    char_("actgACTG")   // DNA identifiers
    char_("\x7f\x7e")   // Hexadecimal 0x7F and 0x7E

These generators emit any character from a range of characters as 
supplied by the attribute.

[heading lit(ch)]

`lit`, when passed a single character, behaves like the single argument
`char_` except that `lit` does not consume an attribute. A plain
`char` or `wchar_t` is equivalent to a `lit`.

[note `lit` is reused by the [karma_string String Generators], the
      char generators, and the Numeric Generators (see [signed_int signed integer], 
      [unsigned_int unsigned integer], and [real_number real number] generators). In 
      general, a char generator is created when you pass in a
      character, a string generator is created when you pass in a string, and a 
      numeric generator is created when you use a numeric literal. The
      exception is when you pass a single element literal string, e.g.
      `lit("x")`. In this case, we optimize this to create a char generator
      instead of a string generator.] 

Examples:

    'x'
    lit('x')
    lit(L'x')
    lit(c)      // c is a char

[heading Header]

    // forwards to <boost/spirit/home/karma/char/char.hpp>
    #include <boost/spirit/include/karma_char_.hpp>

Also, see __include_structure__.

[heading Namespace]

[table
    [[Name]]
    [[`boost::spirit::lit // alias: boost::spirit::karma::lit` ]]
    [[`ns::char_`]]
]

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

[heading Model of]

[:__primitive_generator_concept__]

[variablelist Notation
    [[`ch`, `ch1`, `ch2`]
                  [Character-class specific character (See __char_class_types__),
                   or a __karma_lazy_argument__ that evaluates to a 
                   character-class specific character value]]
    [[`cs`]       [Character-set specifier string (See 
                   __char_class_types__), or a __karma_lazy_argument__ that 
                   evaluates to a character-set specifier string, or a 
                   pointer/reference to a null-terminated array of characters.
                   This string specifies a char-set definition string following 
                   a syntax that resembles posix style regular expression character 
                   sets (except the square brackets and the negation `^` character).]]
    [[`ns`]       [A __karma_char_encoding_namespace__.]]
    [[`cg`]       [A char generator, a char range generator, or a char set generator.]]]

[heading Expression Semantics]

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

[table
    [[Expression]           [Description]]
    [[`ch`]                 [Generate the character literal `ch`. This generator 
                             never fails (unless the underlying output stream 
                             reports an error).]]
    [[`lit(ch)`]            [Generate the character literal `ch`. This generator 
                             never fails (unless the underlying output stream 
                             reports an error).]]
    [[`ns::char_`]          [Generate the character provided by a mandatory 
                             attribute interpreted in the character set defined 
                             by `ns`. This generator never fails (unless the 
                             underlying output stream reports an error).]]
    [[`ns::char_(ch)`]      [Generate the character `ch` as provided by the 
                             immediate literal value the generator is initialized 
                             from. If this generator has an associated attribute 
                             it succeeds only as long as the attribute is equal 
                             to the immediate literal (unless the underlying 
                             output stream reports an error). Otherwise this 
                             generator fails and does not generate any output.]]
    [[`ns::char_("c")`]     [Generate the character `c` as provided by the 
                             immediate literal value the generator is initialized 
                             from. If this generator has an associated attribute 
                             it succeeds only as long as the attribute is equal 
                             to the immediate literal (unless the underlying 
                             output stream reports an error). Otherwise this 
                             generator fails and does not generate any output.]]
    [[`ns::char_(ch1, ch2)`][Generate the character provided by a mandatory 
                             attribute interpreted in the character set defined 
                             by `ns`. The generator succeeds as long as the 
                             attribute belongs to the character range `[ch1, ch2]` 
                             (unless the underlying output stream reports an 
                             error). Otherwise this generator fails and does not 
                             generate any output.]]
    [[`ns::char_(cs)`]      [Generate the character provided by a mandatory 
                             attribute interpreted in the character set defined 
                             by `ns`. The generator succeeds as long as the 
                             attribute belongs to the character set `cs` 
                             (unless the underlying output stream reports an 
                             error). Otherwise this generator fails and does not 
                             generate any output.]]
    [[`~cg`]                [Negate `cg`. The result is a negated char generator 
                             that inverts the test condition of the character
                             generator it is attached to.]]
]

A character `ch` is assumed to belong to the character range defined by
`ns::char_(ch1, ch2)` if its character value (binary representation) 
interpreted in the character set defined by `ns` is not smaller than the 
character value of `ch1` and not larger then the character value of `ch2` (i.e. 
`ch1 <= ch <= ch2`).

The `charset` parameter passed to `ns::char_(charset)` must be a string
containing more than one character. Every single character in this string is 
assumed to belong to the character set defined by this expression. An exception 
to this is the `'-'` character which has a special meaning if it is not 
specified as the first and not the last character in `charset`. If the `'-'` 
is used in between to characters it is interpreted as spanning a character 
range. A character `ch` is considered to belong to the defined character set 
`charset` if it matches one of the characters as specified by the string 
parameter described above. For example

[table
    [[Example]              [Description]]
    [[`char_("abc")`]       ['a', 'b', and 'c']]
    [[`char_("a-z")`]       [all characters (and including) from 'a' to 'z']]
    [[`char_("a-zA-Z")`]    [all characters (and including) from 'a' to 'z' and 'A' and 'Z']]
    [[`char_("-1-9")`]      ['-' and all characters (and including) from '1' to '9']]
]

[heading Attributes]

[table
    [[Expression]           [Attribute]]
    [[`ch`]                 [__unused__]]
    [[`lit(ch)`]            [__unused__]]
    [[`ns::char_`]          [`Ch`, attribute is mandatory (otherwise compilation 
                             will fail). `Ch` is the character type of the 
                             __karma_char_encoding_namespace__, `ns`.]]
    [[`ns::char_(ch)`]      [`Ch`, attribute is optional, if it is supplied, the 
                             generator compares the attribute with `ch` and 
                             succeeds only if both are equal, failing otherwise.
                             `Ch` is the character type of the 
                             __karma_char_encoding_namespace__, `ns`.]]
    [[`ns::char_("c")`]     [`Ch`, attribute is optional, if it is supplied, the 
                             generator compares the attribute with `c` and 
                             succeeds only if both are equal, failing otherwise.
                             `Ch` is the character type of the 
                             __karma_char_encoding_namespace__, `ns`.]]
    [[`ns::char_(ch1, ch2)`][`Ch`, attribute is mandatory (otherwise compilation 
                             will fail), the generator succeeds if the attribute 
                             belongs to the character range `[ch1, ch2]` 
                             interpreted in the character set defined by `ns`.
                             `Ch` is the character type of the 
                             __karma_char_encoding_namespace__, `ns`.]]
    [[`ns::char_(cs)`]      [`Ch`, attribute is mandatory (otherwise compilation 
                             will fail), the generator succeeds if the attribute 
                             belongs to the character set `cs`, interpreted 
                             in the character set defined by `ns`.
                             `Ch` is the character type of the 
                             __karma_char_encoding_namespace__, `ns`.]]
    [[`~cg`]                [Attribute of `cg`]]
]

[note  In addition to their usual attribute of type `Ch` all listed generators 
       accept an instance of a `boost::optional<Ch>` as well. If the 
       `boost::optional<>` is initialized (holds a value) the generators behave 
       as if their attribute was an instance of `Ch` and emit the value stored
       in the `boost::optional<>`. Otherwise the generators will fail.]

[heading Complexity]

[:O(1)]

The complexity of `ch`, `lit(ch)`, `ns::char_`, `ns::char_(ch)`, and 
`ns::char_("c")` is constant as all generators emit exactly one character per 
invocation.

The character range generator (`ns::char_(ch1, ch2)`) additionally requires 
constant lookup time for the verification whether the attribute belongs to
the character range.

The character set generator (`ns::char_(cs)`) additionally requires 
O(log N) lookup time for the verification whether the attribute belongs to
the character set, where N is the number of characters in the character set.

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

Basic usage of `char_` generators:

[reference_karma_char]

[endsect]

[/////////////////////////////////////////////////////////////////////////////]
[section:char_class Character Classification (`alnum`, `digit`, etc.)]

[heading Description]

The library has the full repertoire of single character generators for
character classification. This includes the usual `alnum`, `alpha`,
`digit`, `xdigit`, etc. generators. These generators have an associated
__karma_char_encoding_namespace__. This is needed when doing basic operations
such as forcing lower or upper case. 

[heading Header]

    // forwards to <boost/spirit/home/karma/char/char_class.hpp>
    #include <boost/spirit/include/karma_char_class.hpp>

Also, see __include_structure__.

[heading Namespace]

[table
    [[Name]]
    [[`ns::alnum`]]
    [[`ns::alpha`]]
    [[`ns::blank`]]
    [[`ns::cntrl`]]
    [[`ns::digit`]]
    [[`ns::graph`]]
    [[`ns::lower`]]
    [[`ns::print`]]
    [[`ns::punct`]]
    [[`ns::space`]]
    [[`ns::upper`]]
    [[`ns::xdigit`]]
]

In the table above, `ns` represents a __karma_char_encoding_namespace__ used by the 
corresponding character class generator. All listed generators have a mandatory 
attribute `Ch` and will not compile if no attribute is associated.


[heading Model of]

[:__primitive_generator_concept__]

[variablelist Notation
    [[`ns`]       [A __karma_char_encoding_namespace__.]]]

[heading Expression Semantics]

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

[table
    [[Expression]       [Semantics]]
    [[`ns::alnum`]      [If the mandatory attribute satisfies the concept of 
                         `std::isalnum` in the __karma_char_encoding_namespace__
                         the generator succeeds after emitting 
                         its attribute (unless the underlying output stream 
                         reports an error). This generator fails otherwise 
                         while not generating anything.]]
    [[`ns::alpha`]      [If the mandatory attribute satisfies the concept of 
                         `std::isalpha` in the __karma_char_encoding_namespace__
                         the generator succeeds after emitting 
                         its attribute (unless the underlying output stream 
                         reports an error). This generator fails otherwise 
                         while not generating anything.]]
    [[`ns::blank`]      [If the mandatory attribute satisfies the concept of 
                         `std::isblank` in the __karma_char_encoding_namespace__
                         the generator succeeds after emitting 
                         its attribute (unless the underlying output stream 
                         reports an error). This generator fails otherwise 
                         while not generating anything.]]
    [[`ns::cntrl`]      [If the mandatory attribute satisfies the concept of 
                         `std::iscntrl` in the __karma_char_encoding_namespace__
                         the generator succeeds after emitting 
                         its attribute (unless the underlying output stream 
                         reports an error). This generator fails otherwise 
                         while not generating anything.]]
    [[`ns::digit`]      [If the mandatory attribute satisfies the concept of 
                         `std::isdigit` in the __karma_char_encoding_namespace__
                         the generator succeeds after emitting 
                         its attribute (unless the underlying output stream 
                         reports an error). This generator fails otherwise 
                         while not generating anything.]]
    [[`ns::graph`]      [If the mandatory attribute satisfies the concept of 
                         `std::isgraph` in the __karma_char_encoding_namespace__
                         the generator succeeds after emitting 
                         its attribute (unless the underlying output stream 
                         reports an error). This generator fails otherwise 
                         while not generating anything.]]
    [[`ns::print`]      [If the mandatory attribute satisfies the concept of 
                         `std::isprint` in the __karma_char_encoding_namespace__
                         the generator succeeds after emitting 
                         its attribute (unless the underlying output stream 
                         reports an error). This generator fails otherwise 
                         while not generating anything.]]
    [[`ns::punct`]      [If the mandatory attribute satisfies the concept of 
                         `std::ispunct` in the __karma_char_encoding_namespace__
                         the generator succeeds after emitting 
                         its attribute (unless the underlying output stream 
                         reports an error). This generator fails otherwise 
                         while not generating anything.]]
    [[`ns::xdigit`]      [If the mandatory attribute satisfies the concept of 
                         `std::isxdigit` in the __karma_char_encoding_namespace__
                         the generator succeeds after emitting 
                         its attribute (unless the underlying output stream 
                         reports an error). This generator fails otherwise 
                         while not generating anything.]]
    [[`ns::lower`]      [If the mandatory attribute satisfies the concept of 
                         `std::islower` in the __karma_char_encoding_namespace__
                         the generator succeeds after emitting 
                         its attribute (unless the underlying output stream 
                         reports an error). This generator fails otherwise 
                         while not generating anything.]]
    [[`ns::upper`]      [If the mandatory attribute satisfies the concept of 
                         `std::isupper` in the __karma_char_encoding_namespace__
                         the generator succeeds after emitting 
                         its attribute (unless the underlying output stream 
                         reports an error). This generator fails otherwise 
                         while not generating anything.]]
    [[`ns::space`]      [If the optional attribute satisfies the concept of 
                         `std::isspace` in the __karma_char_encoding_namespace__
                         the generator succeeds after emitting 
                         its attribute (unless the underlying output stream 
                         reports an error). This generator fails otherwise 
                         while not generating anything.If no attribute is 
                         supplied this generator emits a single space 
                         character in the character set defined by `ns`.]]
]

Possible values for `ns` are described in the section __karma_char_encoding_namespace__.

[note   The generators `alpha` and `alnum` might seem to behave unexpected if 
        used inside a `lower[]` or `upper[]` directive. Both directives 
        additionally apply the semantics of `std::islower` or `std::isupper`
        to the respective character class. Some examples:
``
    std::string s;
    std::back_insert_iterator<std::string> out(s);
    generate(out, lower[alpha], 'a');               // succeeds emitting 'a'
    generate(out, lower[alpha], 'A');               // fails 
``
        The generator directive `upper[]` behaves correspondingly.
]

[heading Attributes]

[:All listed character class generators can take any attribute `Ch`. All 
  character class generators (except `space`) require an attribute and will
  fail compiling otherwise.]

[note  In addition to their usual attribute of type `Ch` all listed generators 
       accept an instance of a `boost::optional<Ch>` as well. If the 
       `boost::optional<>` is initialized (holds a value) the generators behave 
       as if their attribute was an instance of `Ch` and emit the value stored
       in the `boost::optional<>`. Otherwise the generators will fail.]

[heading Complexity]

[:O(1)]

The complexity is constant as the generators emit not more than one character 
per invocation.

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

Basic usage of an `alpha` generator:

[reference_karma_char_class]

[endsect]

[endsect]
