2
0
mirror of https://github.com/boostorg/spirit.git synced 2026-01-19 04:42:11 +00:00
Files
spirit/example/karma/num_matrix.cpp
Nikita Kniazev f44479bcd3 Remove boost/config/warning_disable.hpp usage
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.
2021-08-24 03:14:12 +03:00

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;
}