PSLのvariableにiteratorをつけてrange-based forに対応させてみた

PSL自体をC++11で書くことは(少なくとも今はまだ)出来ないが、
C++11の機能に対応させておくことは可能であろう.

というわけで、PSL::variableにiteratorをつけました.
多分単純なforward_iteratorだと思いますが、
必要な要件を本当に満たしているかは分かりません.
その気になればrandom_access_iteratorに出来るんですが、まあ取り敢えず.
beginとendが使えます.

まずは単純に

	variable v("a", "b", "c", "d");
	for (auto x : v)
		printf("%s\n", x.toString().c_str());

こういうことが出来ます.

勿論、単に参照するだけでなく、書き換えることも可能です.

	variable v(1, 2, 10, 100);
	for (auto x : v)
		x *= 2;
	for (auto x : v) // 分かり易い様にループを別にする
		printf("%s\n", x.toString().c_str());

連想配列には対応させていませんが、

	variable v;
	v["p"] = 1;
	v["q"] = 2;
	v["r"] = 3;
	v["s"] = 4;
	auto keys = v.keys();
	for (auto x : keys)
		printf("%s,%s\n", x.toString().c_str(), v[x].toString().c_str());

こういうことは可能です.

そこで思ったんですが、

	variable v;
	v["p"] = 1;
	v["q"] = 2;
	v["r"] = 3;
	v["s"] = 4;
	for (auto x : v.keys())
		printf("%s,%s\n", x.toString().c_str(), v[x].toString().c_str());

直接こうやってもいけますね.
勿論、keysが無駄に何度も呼ばれている様なことはありません.

ということはですね.

	PSLVM p;
	variable range = p.get("range");
	for (auto x : range(10))
		printf("%s\n", x.toString().c_str());

これも出来てしまいます.
PSLの標準関数にC++から簡単にアクセスする方法は用意しておいた方がいいのだろうか…

因みに直接intで受け取ることも可能です.

	PSLVM p;
	variable range = p.get("range");
	for (int i : range(10, 20, 2))
		printf("%d\n", i);

可能です.

std::for_eachとかでも使えました.
ふーむ、これはiteratorをもっと高機能にしておいてもいいかもしれないな.

カテゴリー: コンピューターとインターネット パーマリンク

コメントを残す