Declrations
template < class TokenizerFunc, class Type = std::string, class Container = std::vector<Type> > class basic_tokenizer : public Container; typedef basic_tokenizer<char_separator<char> > tokenizer; typedef basic_tokenizer<escape_separator<char> > csvtokenizer; typedef basic_tokenizer<format_separator<cahr> > strftokenizer;
Overview
tokenizer は,ポリシークラス (TokenizerFunc) に基づいて, 指定された文字列をトークン文字列群に分割するためのクラスです. boost::tokenizer をベースに実装しています.boost::tokenizer との違いは,分割したトークンをコンテナ (Container<Type>) に格納することによって,分割後の各トークンに対して, ランダムアクセスを行うことができる点です.
TokenizerFunc は,Boost TokenizerFunction と同様のインターフェースを採用しています. そのため,ポリシークラスとして Boost TokenizerFunction を利用することも可能です(逆に, CLXのTokenizerFuncもBoostで利用可能).独自にポリシークラス (TokenizerFunc) を作成する場合には,以下の型およびメソッドを定義する必要があります.標準で実装している TokenizerFunc については,tokenizer_func を参照して下さい.
template <class CharT> class separator { public: typedef CharT char_type; void reset(); template <class InputIterator, class Token> bool operator()(InputIterator& next, InputIterator last, Token& dest); };
Typeに文字列以外の型 (int,long,...) が指定された場合,コンテナに格納する直前に lexical_cast によるキャストを試みます. キャストに失敗した場合には,lexical_cast から例外が送出されます.
Examples
Tokenizer
// example_tokenizer.cpp #include <iostream> #include <string> #include "clx/tokenizer.h" int main(int argc, char* argv[]) { std::string s = "This is, a test"; clx::tokenizer tok(s); for (unsigned int i = 0; i < tok.size(); i++) { std::cout << '<' << tok.at(i) <&tl; "> "; } std::cout << std::endl; return 0; } Result <This> <is,> <a> <test>
Formatted Tokenizer
// example_strftokenizer.cpp #include <iostream> #include "clx/tokenizer.h" int main(int argc, char* argv[]) { std::string s = "23:30:25.030254 IP 192.168.1.2.100 > 192.168.1.3.200: . ack 12 win 256 <XXX>"; std::string fmt = "%s:%s:%s.%s IP %s > %s: %s ack %s win %s <%s>"; clx::format_separator<char> f(fmt); clx::strftokenizer tok(f); tok.assign(s); std::cout << "Member: " << tok.size() << std::endl; for (unsigned int i = 0; i < tok.size(); i++) { std::cout << '<' << tok[i] << "> "; } std::cout << std::endl; return 0; } Result Member: 10 <23> <30> <25> <030254> <192.168.1.2.100> <192.168.1.3.200> <.> <12> <256> <XXX>
strftokenizer は,C 標準ライブラリの scanf() のように与えられた書式に基づいて文字列を分割します. ただし,書式で与えられた型修飾子は無視し,分割後の各トークンの型はテンプレート引数の Type として認識するので,書式の型修飾子は "s" のみを用いて下さい.
Template Parameters
- TokenizerFunc
- 文字列を分割するためのポリシーを指定します.
- Type
- 分割したトークンの型を指定します.デフォルト値は,std::string
- Container
- Type型のトークンを格納するためのコンテナを指定します.デフォルト値は,std::vector
Related Types
typedef TokenizerFunc functor; typedef Type value_type; typedef typename functor::char_type char_type; typedef std::basic_string<char_type> string_type; typedef Container< container; typedef typename container::size_type size_type;
Construction and Member Functions
explicit basic_tokenizer(const functor& f = functor()); explicit basic_tokenizer(const string_type& s, const functor& f = functor()); explicit basic_tokenizer(const char_type* s, const functor& f = functor()); template <class InputIterator> explicit basic_tokenizer(InputIterator first, InputIterator last, const functor& f = functor()); virtual ~basic_tokenzier();
コンストラクタには,分割を行う文字列,または文字列のイテレータを指定します. 分割した文字列は Container で指定されたクラスへ格納されます.tokenizer は, Container クラスを継承しているので,分割された各トークンへのアクセスは Container で提供されている各メソッドを利用して行います.
basic_tokenizer& assign(const string_type& s); basic_tokenizer& assign(const char_type* s); template <class InputIterator> basic_tokenizer& assign(InputIterator first, InputIterator last); virtual void reset();