Field3D
SparseField< Data_T >::iterator Class Reference

#include <SparseField.h>

Public Types

typedef SparseField< Data_T > class_type

Public Member Functions

 iterator (class_type &field, const Box3i &window, const V3i &currentPos, int blockOrder)
bool operator!= (const iterator &rhs) const
Data_T & operator* ()
const iteratoroperator++ ()
Data_T * operator-> ()
bool operator== (const iterator &rhs) const

Public Attributes

int x
int y
int z

Private Types

typedef Sparse::SparseBlock
< Data_T > 
Block

Private Member Functions

void setupNextBlock (int i, int j, int k)
 Convenience.

Private Attributes

int m_blockI
 Current block index.
int m_blockId
int m_blockJ
int m_blockK
int m_blockOrder
 Block size.
int m_blockStepsTicker
 Ticker for how many more steps to take before resetting the pointer.
class_typem_field
 Reference to field we're traversing.
bool m_isEmptyBlock
 Whether we're at an empty block and we don't increment m_p.
Data_T * m_p
 Current pointed-to element.
Box3i m_window
 Window to traverse.

Detailed Description

template<class Data_T>
class SparseField< Data_T >::iterator

Todo:
Code duplication between this and const_iterator !!!!!!!!!!!!!

Definition at line 803 of file SparseField.h.

Member Typedef Documentation

template<class Data_T>
typedef SparseField<Data_T> SparseField< Data_T >::iterator::class_type

Definition at line 806 of file SparseField.h.

template<class Data_T>
typedef Sparse::SparseBlock<Data_T> SparseField< Data_T >::iterator::Block
private

Definition at line 894 of file SparseField.h.

Constructor & Destructor Documentation

template<class Data_T>
SparseField< Data_T >::iterator::iterator ( class_type field,
const Box3i window,
const V3i currentPos,
int  blockOrder 
)
inline

Definition at line 807 of file SparseField.h.

: x(currentPos.x), y(currentPos.y), z(currentPos.z),
m_blockId(-1), m_window(window), m_field(&field)
{
}

Member Function Documentation

template<class Data_T>
const iterator& SparseField< Data_T >::iterator::operator++ ( )
inline

Definition at line 816 of file SparseField.h.

References SparseField< Data_T >::m_blockOrder, and WritableField< Data_T >::iterator::x.

{
bool resetPtr = false;
// Check against end of data window
if (x == m_window.max.x) {
if (y == m_window.max.y) {
x = m_window.min.x;
y = m_window.min.y;
++z;
resetPtr = true;
} else {
x = m_window.min.x;
++y;
resetPtr = true;
}
} else {
++x;
}
// These can both safely be incremented here
// ... but only step forward if we're in a non-empty block
++m_p;
// Check if we've reached the end of this block
resetPtr = true;
if (resetPtr) {
// If we have, we need to reset the current block, etc.
}
return *this;
}
template<class Data_T>
bool SparseField< Data_T >::iterator::operator== ( const iterator rhs) const
inline

Definition at line 849 of file SparseField.h.

References WritableField< Data_T >::iterator::x, WritableField< Data_T >::iterator::y, and WritableField< Data_T >::iterator::z.

{
return x == rhs.x && y == rhs.y && z == rhs.z;
}
template<class Data_T>
bool SparseField< Data_T >::iterator::operator!= ( const iterator rhs) const
inline

Definition at line 853 of file SparseField.h.

References WritableField< Data_T >::iterator::x, WritableField< Data_T >::iterator::y, and WritableField< Data_T >::iterator::z.

{
return x != rhs.x || y != rhs.y || z != rhs.z;
}
template<class Data_T>
Data_T& SparseField< Data_T >::iterator::operator* ( )
inline

Definition at line 857 of file SparseField.h.

References Msg::print(), and Msg::SevWarning.

{
assert(false && "Dereferencing iterator on a dynamic-read sparse field");
Msg::print(Msg::SevWarning, "Dereferencing iterator on a dynamic-read "
"sparse field");
return *m_p;
}
// If the block is currently empty, we must allocate it
// Touch the voxel to allocate the block
// Set up the block again
}
return *m_p;
}
template<class Data_T>
Data_T* SparseField< Data_T >::iterator::operator-> ( )
inline

Definition at line 874 of file SparseField.h.

References Msg::print(), and Msg::SevWarning.

{
assert(false && "Dereferencing iterator on a dynamic-read sparse field");
Msg::print(Msg::SevWarning, "Dereferencing iterator on a dynamic-read "
"sparse field");
return m_p;
}
// If the block is currently empty, we must allocate it
// Touch the voxel to allocate the block
// Set up the block again
}
return m_p;
}
template<class Data_T>
void SparseField< Data_T >::iterator::setupNextBlock ( int  i,
int  j,
int  k 
)
inlineprivate

Convenience.

Definition at line 896 of file SparseField.h.

References Sparse::SparseBlock< Data_T >::emptyValue, Sparse::SparseBlock< Data_T >::isAllocated, SparseField< Data_T >::m_blockOrder, and Sparse::SparseBlock< Data_T >::value().

{
return;
}
int vi, vj, vk;
m_field->getVoxelInBlock(i, j, k, vi, vj, vk);
if (block.isAllocated) {
m_p = &block.value(vi, vj, vk, m_blockOrder);
m_isEmptyBlock = false;
} else {
m_p = &block.emptyValue;
}
}

Member Data Documentation

template<class Data_T>
int SparseField< Data_T >::iterator::x

Definition at line 892 of file SparseField.h.

template<class Data_T>
int SparseField< Data_T >::iterator::y

Definition at line 892 of file SparseField.h.

template<class Data_T>
int SparseField< Data_T >::iterator::z

Definition at line 892 of file SparseField.h.

template<class Data_T>
Data_T* SparseField< Data_T >::iterator::m_p
private

Current pointed-to element.

Definition at line 918 of file SparseField.h.

template<class Data_T>
bool SparseField< Data_T >::iterator::m_isEmptyBlock
private

Whether we're at an empty block and we don't increment m_p.

Definition at line 920 of file SparseField.h.

template<class Data_T>
int SparseField< Data_T >::iterator::m_blockStepsTicker
private

Ticker for how many more steps to take before resetting the pointer.

Definition at line 922 of file SparseField.h.

template<class Data_T>
int SparseField< Data_T >::iterator::m_blockOrder
private

Block size.

Definition at line 924 of file SparseField.h.

template<class Data_T>
int SparseField< Data_T >::iterator::m_blockI
private

Current block index.

Definition at line 926 of file SparseField.h.

template<class Data_T>
int SparseField< Data_T >::iterator::m_blockJ
private

Definition at line 926 of file SparseField.h.

template<class Data_T>
int SparseField< Data_T >::iterator::m_blockK
private

Definition at line 926 of file SparseField.h.

template<class Data_T>
int SparseField< Data_T >::iterator::m_blockId
private

Definition at line 926 of file SparseField.h.

template<class Data_T>
Box3i SparseField< Data_T >::iterator::m_window
private

Window to traverse.

Definition at line 928 of file SparseField.h.

template<class Data_T>
class_type* SparseField< Data_T >::iterator::m_field
private

Reference to field we're traversing.

Definition at line 930 of file SparseField.h.


The documentation for this class was generated from the following file: