/*============================================================================= Copyright (c) 2002-2010 Hartmut Kaiser Copyright (c) 2002-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) =============================================================================*/ /////////////////////////////////////////////////////////////////////////////// // // This sample demonstrates a generator formatting and printing a matrix // of integers taken from a simple vector of vectors. The size and the // contents of the printed matrix is generated randomly. // /////////////////////////////////////////////////////////////////////////////// #include #include #include #include #include #include #include namespace karma = boost::spirit::karma; namespace client { /////////////////////////////////////////////////////////////////////////// // Our matrix generator /////////////////////////////////////////////////////////////////////////// //[tutorial_karma_nummatrix_grammar template struct matrix_grammar : karma::grammar >()> { matrix_grammar() : matrix_grammar::base_type(matrix) { using karma::int_; using karma::right_align; using karma::eol; element = right_align(10)[int_]; row = '|' << *element << '|'; matrix = row % eol; } karma::rule >()> matrix; karma::rule()> row; karma::rule element; }; //] //[tutorial_karma_nummatrix template bool generate_matrix(OutputIterator& sink , std::vector > const& v) { matrix_grammar matrix; return karma::generate( sink, // destination: output iterator matrix, // the generator v // the data to output ); } //] } //////////////////////////////////////////////////////////////////////////// // Main program //////////////////////////////////////////////////////////////////////////// int main() { std::cout << "/////////////////////////////////////////////////////////\n\n"; std::cout << "\tPrinting integers in a matrix using Spirit...\n\n"; std::cout << "/////////////////////////////////////////////////////////\n\n"; // here we put the data to generate std::vector > v; // now, generate the size and the contents for the matrix std::srand((unsigned int)std::time(NULL)); std::size_t rows = std::rand() / (RAND_MAX / 10); std::size_t columns = std::rand() / (RAND_MAX / 10); v.resize(rows); for (std::size_t row = 0; row < rows; ++row) { v[row].resize(columns); std::generate(v[row].begin(), v[row].end(), std::rand); } // ok, we got the matrix, now print it out std::string generated; std::back_insert_iterator sink(generated); if (!client::generate_matrix(sink, v)) { std::cout << "-------------------------\n"; std::cout << "Generating failed\n"; std::cout << "-------------------------\n"; } else { std::cout << "-------------------------\n"; std::cout << "Generated:\n" << generated << "\n"; std::cout << "-------------------------\n"; } return 0; }