CLX C++ Libraries - tokenizer_func
Author: clown

CLX C++ Libraries
Home >> tokenizer >> tokenizer_func

# Overview

TokenizerFunc は，tokenizer が文字列の分割を行う際の， 分割方法を定義した Functor です．現在，char_separator，escape_separator，format_separator の 3 種類を提供しています．

## char_separator

    template <
        class CharT,
        class Traits = std::char_traits<CharT>
    >
    class char_separator {
    public:
        typedef CharT char_type;
        typedef typename std::basic_string<CharT, Traits> string_type;

        char_separator();
        explicit char_separator(char_type c, bool x = false);
        explicit char_separator(const char_type* c, bool x = false);
        explicit char_separator(const string_type& c, bool x = false);
    };

char_separator は，ある文字を区切り文字として文字列を分割するための Functor です．boost::char_separator と同様の働きをします． char_separator は，引数 c に1文字を指定した場合はその文字を， 文字列を指定した場合はその文字列に含まれる全ての文字を区切り文字として分割します． デフォルトのコンストラクタを呼び出した場合，cは空白文字となります．

引数 x は空のトークンを許すかどうかを指定するための引数で，true の場合は，連続する 2 つの区切り文字が現れた場合に 2 つのトークンとして文字列を分割します （片方のトークンは空）．

## escape_separator

    template <
        class CharT,
        class Traits = std::char_traits<CharT>
    >
    class escape_separator {
    public:
        typedef CharT char_type;
        typedef typename std::basic_string<CharT, Traits> string_type;

        escape_separator();
        explicit escape_separator(char_type c, char_type q, char_type e, bool x = false);
        explicit escape_separator(const char_type* c, const char_type* q,
            const char_type* e, bool x = false);
        explicit escape_separator(const string_type& c, const string_type& q,
            const string_type& e, bool x = false);
    };

escape_separator は，CSV のような規則に基づいて文字列を分割するための Functor です．boost::escaped_list_separator と同様の働きをします． escape_separator は，引数 c で与えられた文字（または， 与えられた文字列に含まれる全ての文字）を区切り文字として文字列を分割します． ただし，文字 q で括られた中の文字列に関しては，区切り文字も通常の文字として扱い， 分割は行いません．また，文字 e の直後にある文字は必ず通常の文字として扱い， 区切り文字であったとしても分割は行いません．デフォルトのコンストラクタが呼び出された場合， c は ","（カンマ），q は """（引用符）， e は "\"（バックスラッシュ，または円マーク）となります．

引数 x は空のトークンを許すかどうかを指定するための引数で，true の場合は，連続する 2 つの区切り文字が現れた場合に 2 つのトークンとして文字列を分割します （片方のトークンは空）．

## format_separator

    template <
        class CharT,
        class Traits = std::char_traits<CharT>
    >
    class format_separator {
    public:
        typedef CharT char_type;
        typedef typename std::basic_string<CharT, Traits> string_type;
        typedef typename string_type::iterator iterator;

        format_separator();
        explicit format_separator(const char_type* fmt, char_type idset = 's',
            bool x = true);
        explicit format_separator(const string_type& fmt, char_type idset = 's',
            bool x = true);
        explicit format_separator(const char_type* fmt, const char_type* idset,
            bool x = true);
        explicit format_separator(const string_type& fmt, const string_type& idset,
            bool x = true);
    };

format_separator は，scanf() のように書式に基づいて文字列を分割するための Functor です．format_separator は，引数 fmt で与えられた文字列に基づいて文字列を分割します． デフォルトのコンストラクタが呼び出された場合，fmt は "%s" となります （すなわち，与えられた文字列が 1 つのトークンと見なされ，分割は行われない）．

引数 idset には，型修飾子として許す文字列を指定します（ tokenmap の Functor として用いるときに使用するもので， tokenizer では基本的に "s" に固定）．

引数 x は空白文字を読み飛ばすかどうかを指定するための変数で，true の場合は文字列に含まれる空白文字は意味を持たなくなります．ただし，引数 fmt に空白文字が含まれる場合は，該当箇所に空白文字が含まれていないとマッチしません．

# Information

独自に TokenizerFunc を作成する場合には，以下の型およびメソッドを定義する必要があります．

    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);
    };

# Related Pages

1. CLX C++ Libraries - tokenizer
2. CLX C++ Libraries - tokenmap

# References

1. Boost C++ Libraries - TokenizerFunction Concept