Boost.Range

  • STLのコンテナの要件を緩めたConcept
  • 日常書くコードへの影響の大きいライブラリ
  • begin(),end()をユーザに書かせなくてよくなる
  • istream_iteratorのような変わった使い方をユーザに要求しなくてよくなる
  • リソースの管理をrangeにまかせることができる
  • ソースコード倉庫


[]#include[][] <boost/test/unit_test.hpp>[]
[]#include[][] <iostream>[]
[]#include[][] <vector>[]
[]#include[][] <string>[]

[]#include[][] "../../biscuit/biscuit.hpp"[]

[]using[] []namespace[] []biscuit[];

[]struct[] []my_grammar[] : []grammar[]<[]std[]::[]vector[]<[]std[]::[]string[]>, []my_grammar[]>
{
[]std[]::[]string[] []text0[]() { []return[] []"hello"[]; };
[]std[]::[]string[] []text1[]() { []return[] []"grammar"[]; };
[]std[]::[]string[] []text2[]() { []return[] []"value"[]; };

[]struct[] []start[] :
[]sequence[]<
[]grm_value[]<&[]my_grammar[]::[]text0[]>,
[]grm_value[]<&[]my_grammar[]::[]text1[]>,
[]grm_value[]<&[]my_grammar[]::[]text2[]>
>
{ };
};

[]void[] []grm_value_test[]()
{
[]std[]::[]cout[] << []"grm_value_test ing..."[] << []std[]::[]endl[];

[]std[]::[]vector[]<[]std[]::[]string[]> []texts[];
[]texts[].[]push_back[]([]std[]::[]string[]([]"hello"[]));
[]texts[].[]push_back[]([]std[]::[]string[]([]"grammar"[]));
[]texts[].[]push_back[]([]std[]::[]string[]([]"value"[]));

[]my_grammar[] []the_grammar[];
[]// texts is the range![]
[]BOOST_CHECK[]( []match[]<[]my_grammar[]::[]start[]>([]texts[], []the_grammar[]) );
}