PCL使ってみる

http://www.xmailserver.org/libpcl.html
とりあえず使い方をメモ。

#include <iostream>
#include <pcl.h>
struct co_wrap
{
  void (*func)(co_wrap &arg);
  std::pair<int, int> result;
  bool isEnd;

  co_wrap(void(*_func)(co_wrap &arg))
  : func(_func), isEnd(false)
  {}

  inline void run()
  {
    func(*this);
  }
};

void co_start(void *arg)
{
  co_wrap &wrap=*((co_wrap*)arg);
  wrap.run();
  wrap.isEnd=true;
  co_exit();
}

//------------------------------------------------------------//
// coroutineにやらせたい処理
void co_task(co_wrap &wrap)
{
  for(int y=0; y<4; ++y){
    for(int x=0; x<3; ++x){
      // 返り値
      wrap.result=std::make_pair(x, y);
      // 処理返す
      co_resume();
    }
  }
}

int main(int argc, char **argv)
{
  co_wrap wrap(&co_task);
  coroutine_t co=co_create(co_start, &wrap, NULL, 8192);

  // 間違い修正
  // while(!wrap.isEnd){
  for(co_call(co); !wrap.isEnd; co_call(co)){
    //co_call(co);
    std::cout << wrap.result.first << ',' << wrap.result.second << std::endl;
  }

  return 0;
}

はじめ、templateを使った凝ったラッパを作ったがやりすぎに思えたので中止。
構造体で、返り値と終了状況と処理内容への関数ポインタだけ束ねるようにしてみた。
ファイル読み込み時のトークン化とかツリーのトラバースに使えそうな気がしているが
慣れというかイディオムが必用だな。