| [/============================================================================== |
| 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 Stream] |
| |
| This module includes the description of the different variants of the `stream` |
| generator. It can be used to utilize existing streaming operators |
| (`operator<<(std::ostream&, ...)`) for output generation. |
| |
| [heading Header] |
| |
| // forwards to <boost/spirit/home/karma/stream.hpp> |
| #include <boost/spirit/include/karma_stream.hpp> |
| |
| Also, see __include_structure__. |
| |
| [section:stream Stream (`stream`, `wstream`, etc.)] |
| |
| [heading Description] |
| |
| The `stream_generator` is a primitive which allows to use pre-existing standard |
| streaming operators for output generation integrated with __karma__. It |
| provides a wrapper generator dispatching the value to output to the stream |
| operator of the corresponding type. Any value `a` to be formatted using the |
| `stream_generator` will result in invoking the standard streaming operator |
| for its type `A`, for instance: |
| |
| std::ostream& operator<< (std::ostream&, A const&); |
| |
| [heading Header] |
| |
| // forwards to <boost/spirit/home/karma/stream.hpp> |
| #include <boost/spirit/include/karma_stream.hpp> |
| |
| Also, see __include_structure__. |
| |
| [heading Namespace] |
| |
| [table |
| [[Name]] |
| [[`boost::spirit::stream // alias: boost::spirit::karma::stream`]] |
| [[`boost::spirit::wstream // alias: boost::spirit::karma::wstream`]] |
| ] |
| |
| [heading Synopsis] |
| |
| template <typename Char> |
| struct stream_generator; |
| |
| [heading Template parameters] |
| |
| [table |
| [[Parameter] [Description] [Default]] |
| [[`Char`] [The character type to use to generate |
| the output. This type will be used while |
| assigning the generated characters to the |
| underlying output iterator.] [`char`]] |
| ] |
| |
| [heading Model of] |
| |
| [:__primitive_generator_concept__] |
| |
| [variablelist Notation |
| [[`s`] [A variable instance of any type with a defined matching |
| streaming `operator<<()` or a __karma_lazy_argument__ that |
| evaluates to any type with a defined matching streaming |
| `operator<<()`.]] |
| ] |
| |
| [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]] |
| [[`stream`] [Call the streaming `operator<<()` for the type |
| of the mandatory attribute. The output emitted |
| by this operator will be the result of the |
| `stream` generator. This generator never fails |
| (unless the underlying output stream reports an |
| error). The character type of the I/O ostream |
| is assumed to be `char`.]] |
| [[`stream(s)`] [Call the streaming `operator<<()` for the type |
| of the immediate value `s`. The output emitted |
| by this operator will be the result of the |
| `stream` generator. This generator never fails |
| (unless the underlying output stream reports an |
| error). The character type of the I/O ostream |
| is assumed to be `char`.]] |
| [[`wstream`] [Call the streaming `operator<<()` for the type |
| of the mandatory attribute. The output emitted |
| by this operator will be the result of the |
| `stream` generator. This generator never fails |
| (unless the underlying output stream reports an |
| error). The character type of the I/O ostream |
| is assumed to be `wchar_t`.]] |
| [[`wstream(s)`] [Call the streaming `operator<<()` for the type |
| of the immediate value `s`. The output emitted |
| by this operator will be the result of the |
| `stream` generator. This generator never fails |
| (unless the underlying output stream reports an |
| error). The character type of the I/O ostream |
| is assumed to be `wchar_t`.]] |
| ] |
| |
| All generators listed in the table above are predefined specializations of the |
| `stream_generator<Char>` basic stream generator type described below. It is |
| possible to directly use this type to create stream generators using an |
| arbitrary underlying character type. |
| |
| [table |
| [[Expression] [Semantics]] |
| [ |
| [``stream_generator< |
| Char |
| >()``] [Call the streaming `operator<<()` for the type |
| of the mandatory attribute. The output emitted |
| by this operator will be the result of the |
| `stream` generator. This generator never fails |
| (unless the underlying output stream reports an |
| error). The character type of the I/O ostream |
| is assumed to be `Char`]] |
| [ |
| [``stream_generator< |
| Char |
| >()(s)``] [Call the streaming `operator<<()` for the type |
| of the immediate value `s`. The output emitted |
| by this operator will be the result of the |
| `stream` generator. This generator never fails |
| (unless the underlying output stream reports an |
| error). The character type of the I/O ostream |
| is assumed to be `Char`.]] |
| ] |
| |
| [heading Additional Requirements] |
| |
| All of the stream generators listed above require the type of the value to |
| generate output for (either the immediate value or the associated attribute) to |
| implement a streaming operator conforming to the usual I/O streams conventions |
| (where `attribute_type` is the type of the value to generate output for): |
| |
| template <typename Ostream> |
| Ostream& operator<< (Ostream& os, attribute_type const& attr) |
| { |
| // type specific output generation |
| return os; |
| } |
| |
| This operator will be called by the stream generators to gather the output for |
| the attribute of type `attribute_type`. All data streamed into the given |
| `Ostream` will end up being generated by the corresponding stream generator |
| instance. |
| |
| [note If the `stream` generator is invoked inside a [karma_format `format`] |
| (or [karma_format `format_delimited`]) stream manipulator the `Ostream` |
| passed to the `operator<<()` will have registered (imbued) the same |
| standard locale instance as the stream the [karma_format `format`] (or |
| [karma_format `format_delimited`]) manipulator has been used with. |
| This ensures all facets registered (imbued) with the original I/O |
| stream object are used during output generation. |
| ] |
| |
| [heading Attributes] |
| |
| [table |
| [[Expression] [Attribute]] |
| [[`stream`] [`hold_any`, attribute is mandatory (otherwise compilation will fail)]] |
| [[`stream(s)`] [__unused__]] |
| [[`wstream`] [`hold_any`, attribute is mandatory (otherwise compilation will fail)]] |
| [[`wstream(s)`] [__unused__]] |
| [[`stream_generator<Char>()`] [`hold_any`, attribute is mandatory (otherwise compilation will fail)]] |
| [[`stream_generator<Char>()(s)`] [__unused__]] |
| ] |
| |
| [important The attribute type `hold_any` exposed by some of the stream |
| generators is semantically and syntactically equivalent to |
| the type implemented by __boost_any__. It has been added to /Spirit/ |
| as it has better a performance and a smaller footprint if compared to |
| __boost_any__. |
| ] |
| |
| [note In addition to their usual attribute of type `Attrib` all listed generators |
| accept an instance of a `boost::optional<Attrib>` as well. If the |
| `boost::optional<>` is initialized (holds a value) the generators behave |
| as if their attribute was an instance of `Attrib` and emit the value stored |
| in the `boost::optional<>`. Otherwise the generators will fail.] |
| |
| [heading Complexity] |
| |
| [:O(N), where N is the number of characters emitted by the stream 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_stream] |
| |
| And a class definition used in the examples: |
| |
| [reference_karma_complex] |
| [reference_karma_stream_complex] |
| |
| Basic usage of `stream` generators: |
| |
| [reference_karma_stream] |
| |
| [endsect] |
| |
| [endsect] |