1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- // Copyright (c) 2001-2010 Hartmut Kaiser
- //
- // 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)
- ///////////////////////////////////////////////////////////////////////////////
- //
- // Several small snippets generating different C++ code constructs
- //
- // [ HK October 08, 2009 ] Spirit V2.2
- //
- ///////////////////////////////////////////////////////////////////////////////
- #include <boost/config/warning_disable.hpp>
- #include <boost/spirit/include/karma.hpp>
- #include <boost/spirit/include/phoenix.hpp>
- #include <iostream>
- #include <string>
- #include <complex>
- namespace client
- {
- namespace karma = boost::spirit::karma;
- namespace phoenix = boost::phoenix;
- // create for instance: int name[5] = { 1, 2, 3, 4, 5 };
- template <typename Iterator>
- struct int_array : karma::grammar<Iterator, std::vector<int>()>
- {
- int_array(char const* name) : int_array::base_type(start)
- {
- using karma::int_;
- using karma::uint_;
- using karma::eol;
- using karma::lit;
- using karma::_val;
- using karma::_r1;
- start = array_def(phoenix::size(_val)) << " = " << initializer
- << ';' << eol;
- array_def = "int " << lit(name) << "[" << uint_(_r1) << "]";
- initializer = "{ " << -(int_ % ", ") << " }";
- }
- karma::rule<Iterator, void(unsigned)> array_def;
- karma::rule<Iterator, std::vector<int>()> initializer;
- karma::rule<Iterator, std::vector<int>()> start;
- };
- typedef std::back_insert_iterator<std::string> iterator_type;
- bool generate_array(char const* name, std::vector<int> const& v)
- {
- std::string generated;
- iterator_type sink(generated);
- int_array<iterator_type> g(name);
- if (karma::generate(sink, g, v))
- {
- std::cout << generated;
- return true;
- }
- return false;
- }
- }
- ///////////////////////////////////////////////////////////////////////////////
- // Main program
- ///////////////////////////////////////////////////////////////////////////////
- int main()
- {
- // generate an array of integers with initializers
- std::vector<int> v;
- v.push_back(1);
- v.push_back(2);
- v.push_back(3);
- v.push_back(4);
- client::generate_array("array1", v);
- return 0;
- }
|