CLX C++ Libraries - tokenmap
Author: clown

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;

    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"

    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;
    typedef typename container::size_type size_type;
    typedef typename container::const_iterator const_iterator;

# 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 InputIterator>
    explicit basic_tokenmap(InputIteraotr first, InputIterator last, functor f = functor());

    virtual ~basic_tokenmap();

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

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

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

    virtual void reset();

assign() メソッドは，結果を格納したコンテナを返します．

    value_type& operator[](const key_type& key);
    value_type operator[](const key_type& key) const;

    bool empty() const;
    size_type size() const;

    const_iterator begin() const;
    const_iterator end() const;
    const_iterator rbegin() const;
    const_iterator rend() const;

    const_iterator find(const key_type& x) const;
    bool exist(const key_type& x) const;

    container& data();
    const container& data() const;

assign() メソッドによって分割されたトークンへアクセスするためのメソッド群です．

# Related Pages

1. CLX C++ Libraries - tokenizer_func