16 Şubat 2018 Cuma

spirit karma

Giriş
Şu satırı dahil ederiz.
#include <boost/spirit/include/karma.hpp>
Şu satırı dahil ederiz.
namespace ka = boost::spirit::karma;
format metodu
Örnek
Şöyle yaparız.
#include <boost/spirit/include/karma.hpp>

struct Nil final {};

using FooVariant = boost::variant<Nil, std::string, int>;

template<typename OutputIt = boost::spirit::ostream_iterator>
struct FooGenerator : boost::spirit::karma::grammar<OutputIt, FooVariant()>
{
  FooGenerator()
    : FooGenerator::base_type(start_)
  {
    ...
    start_  = ...;
  }

  boost::spirit::karma::rule<OutputIt, FooVariant()> start_;
};

int main() {
  for (auto fo : { FooVariant{}, {FooVariant{42}}, {FooVariant{"Hello\r\nWorld!"}} }) {
    std::cout << boost::spirit::karma::format(FooGenerator<>(), fo) << std::endl;
  }
}
generate metodu
Örnek
Elimizde bir karma grameri olsun
template<typename Iterator>
struct MyKarmaGrammar : ka::grammar<Iterator, MyStruct()> {
  ...
};
Şöyle yaparız. İlk parametre iterator, ikinci parametre gramer, üçüncü parametre girdi olan veridir.
auto request  MyStruct { ... };
std::string generated;
std::back_insert_iterator<std::string> sink(generated);

MyKarmaGrammar<std::back_insert_iterator<std::string>> serializer;

ka::generate(sink, serializer, request);
Örnek - columns
Gramer olarak bir struct'ı html'te iki tane yanyana sütun olacak şekilde çevirmek olsun. Şöyle yaparız.
using Attr = client::employee;
rule<Sink, Attr()> small_box  = "<B>" << string << "<1>"
                                      << string << "<2>"
                                      << string << "<3>";

ka::generate(sink, columns(2, "<nth_delimiter>\n") [+small_box], employees);
Her satır <B> ile başlar, iki tane employee nesnesi içerir. Satır sonu nth_delimeter kelimesi ile biter. Satır şöyledir
<B>int<1>f1.1<2>f1.2<3><B>float<1>f2.1<2>f2.3<3><nth_delimiter>
Örnek - columns + %eol
Şöyle yaparız. Her employee nesnesinden sonra satır sonu yapılır. Her iki employee nesnesinden sonra nt_delimeter kelimesi eklenir.
generate(sink, columns(2, "<nth_delimiter>") [small_box % eol], employees);

Hiç yorum yok:

Yorum Gönder