Tt_clown ( 津川 知朗) 俺 Tokenizer を作る ~ Boost.Tokenizer のカスタマイズ~ 2009/12/121 Boost 勉強会.

Slides:



Advertisements
Similar presentations
アルゴリズムとプログラミン グ (Algorithms and Programming) 第6回:クラスとインスタンス クラスの宣言 アクセス修飾子 インスタンスの生成 (new キーワード) this キーワード フィールドとメソッドの実際の定義と使い 方 クラスの宣言 アクセス修飾子 インスタンスの生成.
Advertisements

オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
わんくま同盟 横浜勉強会 #1 - C++ Day Boost とその実装技術 ~ Boost の薄い話から濃い話まで~
プログラミング言語としてのR 情報知能学科 白井 英俊.
3日で作るtwitterクライアント clown (tt_clown)
Ex7. Search for Vacuum Problem
プログラミング基礎I(再) 山元進.
2008/03/01 D-BOF k.inaba はじめての initial D 2008/03/01 D-BOF k.inaba
コンポーネントの再利用に必要な情報 えムナウ (児玉宏之)
コンポーネントの再利用に必要な情報 えムナウ (児玉宏之)
とても使いやすい Boost の serialization
とても使いやすい Boost の serialization
独習Java ・ 10.6  Hashtableクラス ・ 10.7  String Tokenizerクラス  12月12日    小笠原 一恵.
第8回 プログラミングⅡ 第8回
Boost.勉強会 #8 大阪 ( ) C++ Tips 3 カンマ演算子編.
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
社会人学習講座 「Javaプログラミング概論」
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
第20章 Flyweight ~同じものを共有して無駄をなくす~
関数 関数とスタック.
演習問題の答え #include #include #define NUM 5 typedef struct { // 構造体の定義 float shincho; // 身長 float taiju; // 体重 } shintai; void hyouji(shintai.
第10回 プログラミングⅡ 第10回
コンパイラの解析 (2) GCJのデータ構造 - 1.
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
暗黙的に型付けされる構造体の Java言語への導入
プログラミング 4 記憶の割り付け.
変数のデータフローを考慮した API利用コード例の検索 井上研究室 竹之内 啓太.
Collection, Generics, Iterator
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
第11回 プログラミングⅡ 第11回
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
もっと詳しくArrayクラスについて調べるには → キーワード検索
プログラミング基礎B 文字列の扱い.
ソフトウェア制作論 平成30年11月21日.
パッケージ,アクセス修飾子 2008年4月27日 海谷 治彦.
Ex7. Search for Vacuum Problem
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
フロントエンドとバックエンドのインターフェース
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
記号表の検索と登録 長谷川啓
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
C言語 はじめに 2016年 吉田研究室.
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
C#プログラミング実習 第3回.
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
アルゴリズムとデータ構造1 2009年6月15日
第5回 プログラミングⅡ 第5回
Post-Kona paper 解説 P0083R1: Splicing Maps and Sets (Rev.3) 稲葉 一浩
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
プログラミング 4 文字列.
アルゴリズムとデータ構造 2010年6月17日
フレンド関数とフレンド演算子.
演算子のオーバーロード.
PROGRAMMING IN HASKELL
第7章 そろそろ int 以外も使ってみよう! ~データ型 double , bool~
情報処理Ⅱ 2005年11月25日(金).
プログラミング入門2 第5回 配列 変数宣言、初期化について
値渡しと参照渡しについて.
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
俺 Tokenizer を作る ~Boost.Tokenizer のカスタマイズ~
Presentation transcript:

tt_clown ( 津川 知朗) 俺 Tokenizer を作る ~ Boost.Tokenizer のカスタマイズ~ 2009/12/121 Boost 勉強会

自己紹介 ▌tt_clown (津川 知朗) ►tt_ プレフィクスは要らない子 ► 小さなベンチャー会社でコードを書いてます ▌ 公開しているもの ►CLX C++ Libraries: ◘FAQ: Q. 名前被ってね? A. ゴメンナサイ ▌Blog ►Life like a clown: /12/122 Boost 勉強会

目次 ▌ 今日の目標 : scanf () 風の機能を持つクラスの実 装 ▌ 実装指針 : Boost.Tokenizer をカスタマイズする ▌Boost.Tokenizer のポリシー・クラス ▌FormatSeparator ► 実装方針 ► サンプル・コード ▌Scanner クラスの実装 ▌ まとめ 2009/12/123 Boost 勉強会

今日の目標 ▌scanf() のような機能を持つクラス scanner を 作る ► int main() { std::string s = “2009/12/12T13:10:25” std::string format = “%s/%s/%sT%s:%s:%s”; int year = 0, mon = 0, day = 0; int hour = 0, min = 0, sec = 0; scanner(s, format) % year % mon % sec % hour % min % sec; // 結果を表示するためのコードを書く. return 0; } このクラスを実装する 2009/12/124 Boost 勉強会

実装の指針 ▌Boost.Tokenizer をカスタマイズ ► ポリシー・クラスの自作によるカスタマイズの一例 ▌ ポリシー・クラスとは? ►Modern C++ Design [1] で広まった設計思想 ► あるクラスの鍵となる「動作」に Interface を決め ておく ◘ この Interface に合致するクラスがポリシー・クラス ▌ ポリシー・クラスのメリット ► 状況に応じて「動作」を選択できるため拡張性が高 い 2009/12/12 Boost 勉強会 5 [1] アンドレイ・アレキサンドレスク (訳:村上 雅章), “Modern C++ Design” , 2001.

Boost.Tokenizer のポリシー・クラ ス 2009/12/12 Boost 勉強会 6 template < class TokenizerFunc, class Iterator = std::string::const_iterator, class Type = std::string > class tokenizer; ここにポリシー・クラスを指定する Boost.Tokenizer の宣言 class tokenizer_func_skelton { public: template bool operator()(InIter& next, InIter last, Token& dest); void reset(); }; TokenizerFunc の Interface [next, last) から次のトークンを切り出して dest へ格納する. 切り出しに成功した場合は true ,それ以外は false を返す.

FormatSeparator ▌scanf() 風の文字列分割を実現するための Boost.Tokenizer のポリシー・クラス 2009/12/12 Boost 勉強会 7 class format_separator { public: format_separator(const string_type& fmt, bool x = true) : fmt_(fmt), skipws_(x), cur_(fmt_.begin()) {} void reset() {... } template bool operator()(InIter& next, InIter last, Token& dest) {.... } };

FormatSeparator 実装方針 ▌ 変換指定 *1 以外の文字列マッチで判定 ▌ 型修飾子は s のみ (%d, %f, %x, などを許さな い) ► 型変換は, scanner に任せる ◘ 代入直前に lexical_cast を用いて変換する ▌ 空白文字の扱いを scanf() に似せる 2009/12/12 Boost 勉強会 8 書式: %s foo %s bar %s 入力: hoge foo fuga bar boke () 演算子が呼ばれる度に dest にセットする文字列 *1 ``%’’ で始まる文字列

FormatSeparator サンプルコード 2009/12/12 Boost 勉強会 9 int main() { std::string s = “Sat Dec 12 13:10:25 JST 2009”; std::string format = “%s %s %s %s:%s:%s %s %s”; typedef boost::tokenizer fmttokenizer; format_separator sep(format); fmttokenizer token(s, sep); std::cout << “source: “ << s << std::endl; for (fmttokenizer::iterator pos = token.begin(); pos != token.end(); ++pos) { std::cout “; } std::cout << std::endl; return 0; }

Scanner の実装 2009/12/12 Boost 勉強会 10 class scanner { public: scanner(const string_type& s, const string_type& fmt) : v_(), cur_() { format_separator sep(fmt); boost::tokenizer x(s, sep); v_.assign(x.begin(), x.end()); cur_ = v_.begin(); } template scanner& operator%(Type& dest) { if (cur_ != v_.end()) { dest = boost::lexical_cast (*cur_++); } return *this; } };

まとめ ▌scanf() 風の機能を持つクラスの実装 ▌Boost.Tokenizer のカスタマイズと言うアプ ローチ ► ポリシー・クラスの作成 / 利用方法の一例として紹 介 ▌ ポリシーに基づくクラス設計のメリット ► 鍵となる「動作」を Interface として抽象化してお く ◘ それ以外の部分の再利用性が高まる ► 状況に応じたポリシー・クラスを選択できる ◘ 高いカスタマイズ性を確保できる 2009/12/12 Boost 勉強会 11

関連 URL ▌clx::scanner ► ▌clx::tokenizer_func ► ▌boost::tokenizer で scanf を作ってみる ► 2009/12/12 Boost 勉強会 12