« C言語でSingleton 2 | トップページ | C言語でAdapter »

2007年7月 1日 (日)

C言語でIterator

C言語でSingleton
C言語でSingleton 2
に続いてIteratorをC言語で実装してみます。

とりあえず、これをみてください。

#include <stdio.h>
#include "book_shelf.h"
#include "iterator.h"
#include "book.h"

int main()
{
    BookShelf bookShelf;
    Iterator  it;

    bookShelf = new_BookShelf(4);
    bookShelf->appendBook("Around the World in 80 Days");
    bookShelf->appendBook("Bible");
    bookShelf->appendBook("Cinderella");
    bookShelf->appendBook("Daddy-Long-Legs");

    it = bookShelf->iterator();
    while (it->hasNext()) {
        Book book = (Book)it->next();
        printf("%s\n", book);
    }

    return 0;
}

実行結果が

Around the World in 80 Days
Bible
Cinderella
Daddy-Long-Legs

ループを回すのに配列の大きさを意識しなくていいことと、裏の仕組みを後で書きかえれる事が利点。
今回はファイルが多いので、zipファイルでまとめて公開。
「Iterator.zip」をダウンロード
展開すると下のリストのように展開されます。とりあえず、まとめてコンパイルすれば実行形式ファイルはつくれます。

  • main.c : 上のやつ
  • iterator.h : Iterator構造体の定義
  • aggregate.h : Aggregate構造体の定義
  • book.h : Book変数の定義
  • book_shelf.h : BookShelf構造体の定義
  • book_shelf.c : BookShelfの実装
  • book_shelf_iterator.h : BookShelfIterator構造体の定義
  • book_shelf_iterator.c : BookShelfIteratorの実装

この書き方はJavaでの実装をそのままC言語に落としただけだから、C言語っぽくはないのだと思う。

gccだと、

tree_stmt_iterator si;

for (si = tsi_start (node); !tsi_end_p (si); tsi_next (&si))
  {
    if (!first)
 newline_and_indent (buffer, spc);
    else
      first = false;
  dump_generic_node (buffer, tsi_stmt (si), spc, flags, true);
  }
}
http://gcc.yokinihakarae.com/S/824.html#L862

のように使用するIteratorを使っている。内部的には連結リストになっていて、リストの先頭をtsi_startで取得して、それをtsi_nextでたどっていく。NULLをさすようになったらtsi_end_pが真を返すようになる。みたいな感じ。

詳しくは、
http://wikiwiki.jp/aloha/?cmd=read&page=ssa_op_iter
なりを参考にソースを読んでください。(とGCC 解読室 Wiki*の宣伝)

|

« C言語でSingleton 2 | トップページ | C言語でAdapter »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/126478/15609742

この記事へのトラックバック一覧です: C言語でIterator:

» アバクロンビー&フィッチ(Abercrombie [アバクロンビー&フィッチ(Abercrombie]
トゥルーレリジョン(TRUE RELIGION)を買いたい方の為のサイトです。 少しでもお役に立てたら良いと思います。 [続きを読む]

受信: 2007年7月 1日 (日) 午後 09時34分

« C言語でSingleton 2 | トップページ | C言語でAdapter »