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 : public 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 InputIterator, class Key, class Token>
    bool operator()(InputIterator& next, InputIterator 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"

int main(int argc, char* argv[]) {
    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::tokenmap m(infmt);
    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 Container container;
typedef KeyT key_type;
typedef ValueT value_type;
typedef typename functor::char_type char_type;
typedef std::basic_string<char_type> string_type;

Construction and Member Functions

basic_tokenmap();
explicit basic_tokenmap(const functor& f = functor());
explicit basic_tokenmap(const string_type& s, const functor& f = functor());
explicit basic_tokenmap(const char_type* s, const functor& f = functor());

template <class InputIterator>
explicit basic_tokenmap(InputIteraotr first, InputIterator last,
    const functor& f = functor());
virtual ~basic_tokenmap();

コンストラクタには,分割を行う文字列,または文字列のイテレータを指定します. 分割した文字列は Container で指定されたクラスへ格納されます.tokenmap は, Container クラスを継承しているので,分割された各トークンへのアクセスは Container で提供されている各メソッドを利用して行います.ただし,tokenmap は,型の定義などを std::map をベースに行っているので,std::map の型定義, およびメソッドと互換のあるものしか指定することができません.

basic_tokenmap& assign(const string_type& s);
basic_tokenmap& assign(const char_type* s);

template <class InputIterator>
basic_tokenmap& assign(InputIterator first, InputIterator last);

virtual void reset();

Related Pages

  1. CLX C++ Libraries - tokenizer_func