Declaration
template < class TokenizerFunc, class KeyT = char, class ValueT = std::string, class Container = std::map<KeyT, ValueT> > class basic_tokenmap : private comparable_container_generator<Container>, public map_accessor<Container>; typedef basic_tokenmap<format_separator<char>, char, std::string> tokenmap; #ifdef CLX_USE_WCHAR typedef basic_tokenmap<format_separator<char>, wchar_t, std::wstring> wtokenmap; #endif
Overview
tokenmap クラスは,分割されたトークンに対して何らかの識別子を割り当て, 連想配列を用いて各トークンを管理するためのクラスです.例えば,y(=year),m(=month), d(=date),...と言ったように日付・時刻に識別子を設定し,分割後はx['y']と言った形式で, それぞれの要素へアクセスします.ポリシークラス(TokenizerFunc)を作成する場合には, 以下の型およびメソッドを定義する必要があります.
template <class CharT> class separator { public: typedef CharT char_type; void reset(); template <class InIter, class Key, class Token> bool operator()(InIter& next, InIter last, Key& key, Token& dest); };
尚,tokenizer のためにあらかじめ用意してあるのポリシークラス(tokenizer_func) のうち,format_separator は tokenmap のポリシークラスとしても使用することができます.tokenmap で format_separator をポリシークラスとして使用する場合,変換指定の最後に,"s" ではなく前述した識別子(日付を分割する場合は "ymd" など) を指定します.この場合に指定できる識別子は,"一文字の文字"となります. ただし,"%"," "(一文字の半角スペース) を識別子として指定することはできません.
Example
#include <iostream> #include <string> #include "clx/tokenmap.h" typedef clx::basic_tokenmap<clx::format_separator<char> > date_map; int main(int argc, char* argv[]) { std::string dateset = "ymdHMS"; std::string infmt = "%04y/%02m/%02d %2H:%02M:%02S"; std::string sdate = "2006/06/06 17:27:00"; std::cout << "Format: " << infmt << std::endl; std::cout << "Input: " << sdate << std::endl; clx::format_separator<char> f(infmt, dateset); date_map m(f); m.assign(sdate); std::cout << std::endl; std::cout << "Result" << std::endl; std::cout << "--------------------" << std::endl; for (clx::tokenmap::const_iterator p = m.begin(); p != m.end(); p++) { std::cout << "map[" << p->first << "] = " << p->second << std::endl; } return 0; }
Result Format: %04y/%02m/%02d %2H:%02M:%02S Input: 2006/06/06 17:27:00 Result -------------------- map[H] = 17 map[M] = 27 map[S] = 00 map[d] = 06 map[m] = 06 map[y] = 2006
Template Parameters
- TokenizerFunc
- 文字列を分割するためのポリシーを指定します.
- Container
- 分割した文字列群を格納するためのコンテナを指定します. デフォルト値は,std::map<char, std::string>
Related Types
typedef TokenizerFunc functor; typedef typename functor::char_type char_type; typedef std::basic_string<char_type> string_type; typedef KeyT key_type; typedef ValueT value_type; typedef Container container;
Construction and Member Functions
explicit basic_tokenmap(functor f = functor()); explicit basic_tokenmap(const string_type& s, functor f = functor()); explicit basic_tokenmap(const char_type* s, functor f = functor()); template <class InIter> basic_tokenmap(IntIter first, InIter last, functor f = functor()); virtual ~basic_tokenmap() throw();
コンストラクタには,分割を行う文字列,または文字列のイテレータを指定します. コンストラクタは,assign() メソッドを実行して指定された文字列を分割します. assign() メソッドに関しては後述します.
basic_tokenmap& assign(const string_type& s); basic_tokenmap& assign(const char_type* s); template <class InIter> basic_tokenmap& assign(InIter first, InIter last); void reset();
assign() メソッドは,TokenizerFunc にしたがって指定された文字列を分割します. 分割した文字列は Container で指定されたクラスへ格納されます.tokenmap は, Container クラスを継承しているので,分割された各トークンへのアクセスは Container で提供されている各メソッドを利用して行います.
Container (の継承)に関する詳細は,container_wrapper を参照して下さい.