Różnice między wybraną wersją a wersją aktualną.
Next revision Both sides next revision | |||
tokenizer [2008/04/12 13:45] mplacht1 utworzono |
tokenizer [2008/04/12 15:27] mplacht1 |
||
---|---|---|---|
Linia 1: | Linia 1: | ||
====== Biblioteka boost Tokenizer ====== | ====== Biblioteka boost Tokenizer ====== | ||
- | Biblioteka boost Tokenizer zapewnia elastyczny i łatwy w użyciu mechanizm dzielenia dowolnych łańcuchów znakowych na serię tokenów, grup znaków o podanych cechach. Biblioteka umożliwia wybór metody podziału łańcucha poprzez parametryzowane funktory TokenizerFunction. | + | Biblioteka boost Tokenizer zapewnia elastyczny i łatwy w użyciu mechanizm dzielenia dowolnych łańcuchów znakowych na serię podciągów (tokens), grup znaków o podanych cechach. Biblioteka umożliwia wybór metody podziału łańcucha poprzez parametryzowane funktory TokenizerFunction. |
===== Klasa Tokenizer ===== | ===== Klasa Tokenizer ===== | ||
- | Powyższa klasa umożliwia widok na sekwencję znaków jak na kontener zawierający tokeny. Dostęp do tokenów zawartych w takim kontenerze zapewniony jest za pomocą iteratorów zdefiniowanych w bibliotece. Klasa tokenizer jest klasą szablonową pozwalającą tworzyć obiekty dzielące sekwencje znakowe określonego typu według okrślonego sposobu podziału. Warto zauważyć,że podany łańcuch znakowy nie jest dzielony w czasie inicjalizacj obiektu, lecz na żądanie. | + | Powyższa klasa umożliwia widok na sekwencję znaków jak na kontener zawierający podciągi. Dostęp do podciągów zawartych w takim kontenerze zapewniony jest za pomocą iteratorów zdefiniowanych w bibliotece. Klasa tokenizer jest klasą szablonową pozwalającą tworzyć obiekty dzielące sekwencje znakowe określonego typu według określonego sposobu podziału. Warto zauważyć,że podany łańcuch znakowy nie jest dzielony w czasie inicjalizacj obiektu, lecz na żądanie. |
<code cpp> | <code cpp> | ||
Linia 13: | Linia 13: | ||
class tokenizer | class tokenizer | ||
</code> | </code> | ||
- | Parametrami szablonu są: | + | Parametry szablonu: |
* TokenizerFunc - funktor używany do dzielenia sekwencji | * TokenizerFunc - funktor używany do dzielenia sekwencji | ||
* Iterator - typ iteratora specyfikującego sekwencję | * Iterator - typ iteratora specyfikującego sekwencję | ||
- | * Type - typ sekwencji | + | * Type - typ sekwencji\\ |
- | ---- | + | \\ |
Prosty przykład użycia biblioteki: | Prosty przykład użycia biblioteki: | ||
<code cpp> | <code cpp> | ||
Linia 49: | Linia 48: | ||
</code> | </code> | ||
+ | Lista konstruktorów oraz funkcji składowych | ||
+ | <code cpp> | ||
+ | //konstuktory | ||
+ | tokenizer(Iterator first, Iterator last,const TokenizerFunc& f = TokenizerFunc()) | ||
- | ===== Iteratory Token Iterator ===== | + | template<class Container> |
+ | tokenizer(const Container& c,const TokenizerFunc& f = TokenizerFunc()) | ||
+ | //fukcja zmieniająca iteratory wskazujące na początek i za koniec sekwencji na nowe | ||
+ | void assign(Iterator first, Iterator last) | ||
- | ===== Funktory TokenizerFunction ===== | + | //fukcja zmieniająca iteratory wskazujące na początek i za koniec sekwencji oraz funkce podziału na nowe |
+ | void assign(Iterator first, Iterator last, const TokenizerFunc& f) | ||
+ | //fukcja zmieniająca kontener przechowujący sekwencję na nowy | ||
+ | template<class Container> | ||
+ | void assign(const Container& c) | ||
+ | |||
+ | //fukcja zmieniająca kontener przechowujący sekwencję oraz funkcję podziału na nowe | ||
+ | template<class Container> | ||
+ | void assign(const Container& c, const TokenizerFunc& f) | ||
+ | |||
+ | //iterator wskazujący na pierwszy podciąg | ||
+ | iterator begin() const | ||
+ | |||
+ | //iterator wskazujący za ostatni podciąg | ||
+ | iterator end() const | ||
+ | |||
+ | /* c - kontener zawierający sekwencję do podziału | ||
+ | * f - funktor służący do podziału sekwencji | ||
+ | * first - iteraor wskazujący na początek dzielonej sekwencji | ||
+ | * last - iteraor wskazujący za dzieloną sekwencję | ||
+ | */ | ||
+ | </code> | ||
+ | |||
+ | ===== Klasa Token Iterator ===== | ||
+ | Klasa zapewnia dostęp do podciągów dzielonej sekwencji jak przzy użyciu zeykłego iteratora. | ||
+ | <code cpp> | ||
+ | template < | ||
+ | class TokenizerFunc = char_delimiters_separator<char>, | ||
+ | class Iterator = std::string::const_iterator, | ||
+ | class Type = std::string | ||
+ | > | ||
+ | class token_iterator_generator | ||
+ | </code> | ||
+ | Parametry szablonu: | ||
+ | * TokenizerFunc - funktor używany do dzielenia sekwencji | ||
+ | * Iterator - typ iteratora specyfikującego sekwencję | ||
+ | * Type - typ sekwencji\\ | ||
+ | \\ | ||
+ | W celu utorzenia iteratora musimy podać iterator wskazujący na początek dzielonej sekwencji ''begin'', interator wskazujący dokładnie za dzieloną sekwencję ''end'' oraz funkcję podziału sekwencji ''fun''. | ||
+ | <code cpp> | ||
+ | template<class Type, class Iterator, class TokenizerFunc> | ||
+ | typename token_iterator_generator<TokenizerFunc,Iterator,Type>::type | ||
+ | make_token_iterator(Iterator begin, Iterator end,const TokenizerFunc& fun) | ||
+ | </code> | ||
+ | \\ | ||
+ | Przykład użycia orzy wykorzystaniu funktora offset_separator dzielącego łańcuch znakowy na podciągi o określonej długości. | ||
+ | <code cpp> | ||
+ | #include<iostream> | ||
+ | #include<boost/token_iterator.hpp> | ||
+ | #include<string> | ||
+ | |||
+ | int main(){ | ||
+ | using namespace std; | ||
+ | using namespace boost; | ||
+ | string s = "12252001"; | ||
+ | int offsets[] = {2,2,4}; | ||
+ | offset_separator f(offsets, offsets+3); | ||
+ | typedef token_iterator_generator<offset_separator>::type Iter; | ||
+ | Iter beg = make_token_iterator<string>(s.begin(),s.end(),f); | ||
+ | Iter end = make_token_iterator<string>(s.end(),s.end(),f); | ||
+ | for(;beg!=end;++beg){ | ||
+ | cout << *beg << "\n"; | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ===== Funktory TokenizerFunction ===== | ||
+ | TokenizerFunction jest funktorem, którego zadaniem jest dzielenie podanej sekwencji znaków dopóki zostanie znaleziony dokładnie jeden podciąg lub osiągnięty koniec sekwencji. Następnie uaktualnia podciąg i informuje o położeniu w sekwencji elementu znajdującgo się dokładnie za za znalezionym podciągiem.\\ | ||
+ | Biblioteka zawiera trzy klasy funktorów TokenizerFunction: | ||
+ | * char_separator | ||
+ | * escaped_list_separator | ||
+ | * offset_separator\\ | ||
+ | \\ | ||
==== Klasa char_separator ==== | ==== Klasa char_separator ==== | ||