« 2007年6月17日 - 2007年6月23日 | トップページ | 2007年7月8日 - 2007年7月14日 »

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*の宣伝)

| | コメント (0) | トラックバック (1)

« 2007年6月17日 - 2007年6月23日 | トップページ | 2007年7月8日 - 2007年7月14日 »