toge's diary

コンピュータ関連の趣味をつらつらと。

C++でxtalのiteratorをもっと簡単に定義する

id:toge:20070524#1180029956 の続き。
id:xtalcoさんにもっと簡単な方法を聞きました。

#include "xtal/xtal.h"

class IterTest {
  int value_;

public:
  IterTest(int value)
    : value_(value)
  {}

  void iter_next(const xtal::VMachine& vm) {
    if (value_ > 10) {
      vm.return_result(xtal::Null());
      return;
    }
    vm.return_result(xtal::UserData<IterTest>::from_this(this), xtal::Any(value_));
    value_++;
  }
};

int main() {
  // Xtalの初期化
  xtal::initialize();

  try {
    xtal::TClass<IterTest> itertest("IterTest"); // IterTest クラスを構築

    itertest.inherit(xtal::Iterator());
    itertest.def("new", xtal::New<IterTest, int>().param(xtal::Named("value", 0)));
    itertest.method("iter_first", &IterTest::iter_next);
    itertest.method("iter_next", &IterTest::iter_next);

    xtal::lib().def("IterTest", itertest);

    xtal::Any ret = xtal::lib().member("iterator");
  }
  catch(xtal::Any ex) {
    std::cout << ex << std::endl;
  }
  return 0;
}