mirror of
https://github.com/boostorg/spirit.git
synced 2026-01-19 04:42:11 +00:00
It is better to manage warnings on our side to know what warnings we need to fix or suppress, and the only thing that header does is disabling deprecation warnings on MSVC and ICC which we would prefer to not show to users.
114 lines
3.7 KiB
C++
114 lines
3.7 KiB
C++
/*=============================================================================
|
|
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 <boost/spirit/include/karma.hpp>
|
|
|
|
#include <iostream>
|
|
#include <string>
|
|
#include <vector>
|
|
#include <cstdlib>
|
|
#include <ctime>
|
|
|
|
namespace karma = boost::spirit::karma;
|
|
|
|
namespace client
|
|
{
|
|
///////////////////////////////////////////////////////////////////////////
|
|
// Our matrix generator
|
|
///////////////////////////////////////////////////////////////////////////
|
|
//[tutorial_karma_nummatrix_grammar
|
|
template <typename OutputIterator>
|
|
struct matrix_grammar
|
|
: karma::grammar<OutputIterator, std::vector<std::vector<int> >()>
|
|
{
|
|
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<OutputIterator, std::vector<std::vector<int> >()> matrix;
|
|
karma::rule<OutputIterator, std::vector<int>()> row;
|
|
karma::rule<OutputIterator, int()> element;
|
|
};
|
|
//]
|
|
|
|
//[tutorial_karma_nummatrix
|
|
template <typename OutputIterator>
|
|
bool generate_matrix(OutputIterator& sink
|
|
, std::vector<std::vector<int> > const& v)
|
|
{
|
|
matrix_grammar<OutputIterator> 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<std::vector<int> > 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<std::string> 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;
|
|
}
|
|
|
|
|