vtkのコンテナであるが妙に使いにくい。
vtkActorCollection* pActorCollection = pvtkRenderer->GetActors();
pActorCollection->InitTraversal(); //The data pointer is set at the beginning of the list.
while( ( vtkActor* pActor = pActorCollection ) != nullptr )
{
//Some
}
イテレータをつくるとfor_eachなどで回すことができるようになる。
class SomeClass
{
public;
class Iterator : std::iterator< std::forward_iterator_tag, vtkProp*>
{
public:
Iterator() : mpCollection(nullptr), mpProp(nullptr) {};
explicit Iterator( vtkProp3DCollection* pPropCollection ) : mpCollection( pPropCollection )
{
mpProp = mpCollection->GetNextProp();
}
Iterator(const Iterator& other) : mpCollection(other.mpCollection), mpProp(other.mpProp) {};
Iterator& operator++() { Increment(); return *this; };
Iterator& operator++(int) { Iterator old(*this); Increment(); return old; };
bool operator==(const Iterator& other) { return Equal( other ); };
bool operator!=(const Iterator& other) { return !Equal( other ); };
vtkProp* operator->() { return mpProp;};
vtkProp* operator*() { return mpProp;};
protected:
void Increment() { mpProp = mpCollection->GetNextProp(); };
bool Equal( const Iterator& other ) { return mpProp == other.mpProp ? true : false; };
vtkProp3DCollection* mpCollection;
vtkProp3D* mpProp;
};
Iterator begin() { return Iterator(this); };
Iterator end() { return Iterator(); };
protected:
vtkSmartPointer<vtkProp3DCollection> mpProps;
};
//Sample
std::for_each( someClass.begin(), someClass.end(), [](vtkProp3D* prop)
{
double* pos = prop->GetPosition();
std::for_each( pos, pos+3, []( double p ) { std::cout << std::setw(15) << p; } );
std::cout << std::endl;
}
);
一度作ればvtkCollection独特の回し方に悩まなくてよい。
他にはoperator[]やsize()もつくっておけば、よりその後の効率はよくなるだろう。