
Larry Evans wrote:
On 09/23/2004 02:35 PM, Hartmut Kaiser wrote: [snip]
My point wasn't the concrete syntax, this is volatile at this stage anyway. My point was the concept to implement a library, which is 'dual' to Spirit, based on the idea, that a grammar describes all possible matchable input sequences, so why not use this 'grammar' to specify, how to generate this input sequences.
Also, couldn't these 'dual' libraries be used to generate test cases for each other?
Sure. This would be good for performing a feature-by-feature comparison. Hooking the machinery into Boost.Test would be a good way of getting the results. Naturally, the test cases for each library should pass their own tests on supported platforms; the interesting cases will be the test cases from the other libraries. How do we implement the tests? I suggest that we split the information into: [1] the data type (type) being formatted, e.g. std::map< std::string, std::string > with the details of its contents; [2] for output -- the string (str) such that: type val = ...; ostringstream ss; ss << some_fn( val ); BOOST_TEST( ss.str() == str ); [3] for input, the string (str) such that: type val = ...; type read; istringstream ss( str ); ss >> some_fn( read ); BOOST_TEST( is_equal( read, val )); where is_equal( const T & a, const T & b ) returns true iff a == b. This would then provide a basis for comparison between the libraries, including: does the library support formatting of this form? and what are the differences in the code used to perform the formatting? For example: // review-style outfmt: ss << io::formatob( vec. io::containerfmt().format( "< ", " >" )); // new-style outfmt: ss << io::object( vec. fmt::container().decorate( "< ", " >" )); // Volodya-style outfmt: ss << io::object( vec, "< " + fmt::container() + " >" ); // Torjo-style outfmt: // note: $ is used because it would be infrequently used as // part of a decoration (escape = '\$') ss << io::object( vec, fmt::container()( "< $*$ >" )); // decoration-on-stream outfmt: ss << cdecorate( "< ", " >" ) << io::object( vec, fmt::container()); // type deduction in outfmt: ss << io::object( vec ).decorate( "< ", " >" ); Regards, Reece