boost/python/stl_iterator.hpp

はじめに

<boost/python/stl_iterator.hpp> は、Python の走査可能オブジェクトから C++ のイテレータを作成する型を提供する。

クラス

stl_input_iterator クラステンプレート

template<class ValueType>
struct stl_input_iterator

stl_input_iterator<T> のインスタンスは Python のイテレータを保持し、それを STL アルゴリズムで使用できるよう適合させる。stl_input_iterator<T>入力イテレータの要件を満たす。

テンプレートパラメータ

ValueType --

stl_input_iterator<T> のインスタンスを参照剥がしすると ValueType 型の rvalue が返る。

要件

ValueType がコピー構築可能でなければならない。

stl_input_iterator クラステンプレートの概要

namespace boost { namespace python
{
  template <class ValueType>
  struct stl_input_iterator
  {
      typedef std::ptrdiff_t difference_type;
      typedef ValueType value_type;
      typedef ValueType* pointer;
      typedef ValueType reference;
      typedef std::input_iterator_tag iterator_category;

      stl_input_iterator();
      stl_input_iterator(object const& ob);

      stl_input_iterator& operator++();
      stl_input_iterator operator++(int);

      ValueType operator*() const;

      friend bool operator==(stl_input_iterator const& lhs, stl_input_iterator const& rhs);
      friend bool operator!=(stl_input_iterator const& lhs, stl_input_iterator const& rhs);
  private:
      object it; // 説明のためにのみ記載
      object ob; // 説明のためにのみ記載
  };
}}

stl_input_iterator クラステンプレートのコンストラクタ

stl_input_iterator()
効果

シーケンスの終端を表すのに使用する、末尾の直後を指す入力イテレータを作成する。

事後条件

this が末尾の直後。

例外

なし。

stl_input_iterator(object const &ob)
効果

ob.attr("__iter__")() を呼び出し、結果の Python のイテレータオブジェクトを this->it に格納する。次に this->it.attr("next")() を呼び出し、結果を this->ob に格納する。シーケンスに走査するものが残っていない場合は this->obobject() を設定する。

事後条件

this が参照剥がし可能か末尾の直後。

stl_input_iterator クラステンプレートの変更メソッド

stl_input_iterator &operator++()
効果

this->it.attr("next")() を呼び出し、結果を this->ob に格納する。シーケンスに走査するものが残っていない場合は this->obobject() を設定する。

事後条件

this が参照剥がし可能か末尾の直後。

戻り値

*this

stl_input_iterator operator++(int)
効果

stl_input_iterator tmp = *this; ++*this; return tmp;

事後条件

this が逆参照可能か末尾の直後。

stl_input_iterator クラステンプレートのオブザーバ

ValueType operator*() const
効果

シーケンス内の現在の要素を返す。

戻り値

extract<ValueType>(this->ob)

friend bool operator==(stl_input_iterator const &lhs, stl_input_iterator const &rhs)
効果

両方のイテレータが参照剥がし可能であるか両方のイテレータが末尾の直後であれば真、それ以外は偽を返す。

戻り値

(lhs.ob == object()) == (rhs.ob == object())

friend bool operator!=(stl_input_iterator const &lhs, stl_input_iterator const &rhs)
効果

両方のイテレータが参照剥がし可能であるか両方のイテレータが末尾の直後であれば偽、それ以外は真を返す。

戻り値

!(lhs == rhs)

#include <boost/python/object.hpp>
#include <boost/python/stl_iterator.hpp>

#include <list>

using namespace boost::python;
std::list<int> sequence_to_int_list(object const& ob)
{
    stl_input_iterator<int> begin(ob), end;
    return std::list<int>(begin, end);
}