CLX C++ Libraries
Home >> tokenmap

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

example_tokenmap.cpp

#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 を参照して下さい.

Related Pages

  1. CLX C++ Libraries - tokenizer_func
  2. CLX C++ Libraries - container_wrapper