CLX C++ Libraries - tokenizer
Author: clown

CLX C++ Libraries
Home >> tokenizer

# Declrations

    template <
        class TokenizerFunc,
        class Type = std::string,
        class Container = std::vector<Type>
    >
    class basic_tokenizer;

    typedef basic_tokenizer<char_separator<char>, std::string> tokenizer;
    typedef basic_tokenizer<escape_separator<char>, std::string> csvtokenizer;
    typedef basic_tokenizer<format_separator<char>, std::string> strftokenizer;
    #ifdef CLX_USE_WCHAR
    typedef basic_tokenizer<char_separator<wchar_t>, std::wstring> wtokenizer;
    typedef basic_tokenizer<escape_separator<wchar_t>, std::wstring> wcsvtokenizer;
    typedef basic_tokenizer<format_separator<wchar_t>, std::wstring> wstrftokenizer;
    #endif

# 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 typename functor::char_type char_type;
    typedef std::basic_string<char_type> string_type;

    typedef Type value_type;
    typedef Container container;
    typedef typename container::size_type size_type;
    typedef typename container::const_iterator const_iterator;
    typedef typename container::iterator iterator;

# Construction and Member Functions

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

    template <class InputIterator>
    explicit basic_tokenizer(InputIterator first, InputIterator last, functor f = functor());

    virtual ~basic_tokenzier();

コンストラクタには，分割を行う文字列，または文字列のイテレータを指定します． 分割した文字列は Container で指定されたクラスへ格納されます．tokenizer は， Container クラスを継承しているので，分割された各トークンへのアクセスは Container で提供されている各メソッドを利用して行います．

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

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

    virtual void reset();

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

    const value_type& operator[](size_type pos) const;
    const value_type& at(size_type pos) const;
    const value_type& front() const;
    const value_type& back() 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 container& data() const;

assign() メソッドによって分割されたトークンへアクセスするためのメソッド群です． トークンは読み取り専用で，値の変更等を行うことはできません．

# Related Pages

1. CLX C++ Libraries - tokenizer_func

# References

1. Boost C++ Libraries - Boost Tokenizer Overview
2. Boost C++ Libraries - TokenizerFunction Concept