Field3D
SparseField< Data_T >::const_iterator Class Reference

#include <SparseField.h>

Public Types

typedef SparseField< Data_T > class_type

Public Member Functions

 const_iterator (const class_type &field, const Box3i &window, const V3i &currentPos, int blockOrder)
template<class Iter_T>
bool operator!= (const Iter_T &rhs) const
const Data_T & operator* () const
const const_iteratoroperator++ ()
const Data_T * operator-> () const
template<class Iter_T>
bool operator== (const Iter_T &rhs) const
 ~const_iterator ()

Public Attributes

int x
 Current x/y/z coord.
int y
int z

Private Types

typedef Sparse::SparseBlock< Data_T > Block

Private Member Functions

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

Private Attributes

int m_blockI
 Current block index.
int m_blockId
bool m_blockIsActivated
 Used with delayed-load fields. Check if we've already activated the current blocks.
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.
const 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.
SparseFileManagerm_manager
 Pointer to the singleton file manager.
const Data_T * m_p
 Current pointed-to element.
Box3i m_window
 Window to traverse.

Detailed Description

template<class Data_T>
class SparseField< Data_T >::const_iterator
Todo
Code duplication between this and iterator!!!!!!!!!!!!!!!!!!!!!!

Definition at line 885 of file SparseField.h.

Member Typedef Documentation

◆ class_type

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

Definition at line 897 of file SparseField.h.

◆ Block

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

Definition at line 994 of file SparseField.h.

Constructor & Destructor Documentation

◆ const_iterator()

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

Definition at line 898 of file SparseField.h.

901 : x(currentPos.x), y(currentPos.y), z(currentPos.z),
902 m_p(NULL), m_blockIsActivated(false),
905 {
906 m_manager = m_field->m_fileManager;
907 setupNextBlock(x, y, z);
908 }
bool m_blockIsActivated
Used with delayed-load fields. Check if we've already activated the current blocks.
Box3i m_window
Window to traverse.
int m_blockStepsTicker
Ticker for how many more steps to take before resetting the pointer.
void setupNextBlock(int i, int j, int k)
SparseFileManager * m_manager
Pointer to the singleton file manager.
const class_type * m_field
Reference to field we're traversing.
int x
Current x/y/z coord.
const Data_T * m_p
Current pointed-to element.
This Field subclass stores voxel data in block-allocated arrays.

References SparseField< Data_T >::blockOrder(), m_blockId, m_blockIsActivated, m_blockOrder, m_blockStepsTicker, m_field, m_manager, m_p, m_window, setupNextBlock(), x, y, and z.

Referenced by operator++().

◆ ~const_iterator()

template<class Data_T>
SparseField< Data_T >::const_iterator::~const_iterator ( )
inline

Definition at line 909 of file SparseField.h.

909 {
910 if (m_manager && m_blockId >= 0 &&
911 m_blockId < static_cast<int>(m_field->m_numBlocks)) {
912 if (m_field->m_blocks[m_blockId].isAllocated)
913 m_manager->decBlockRef<Data_T>(m_field->m_fileId, m_blockId);
914 }
915 }

References m_blockId, m_field, and m_manager.

Member Function Documentation

◆ operator++()

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

Definition at line 916 of file SparseField.h.

917 {
918 bool resetPtr = false;
919 // Check against end of data window
920 if (x == m_window.max.x) {
921 if (y == m_window.max.y) {
922 x = m_window.min.x;
923 y = m_window.min.y;
924 ++z;
925 resetPtr = true;
926 } else {
927 x = m_window.min.x;
928 ++y;
929 resetPtr = true;
930 }
931 } else {
932 ++x;
933 }
934 // These can both safely be incremented here
936 // ... but only step forward if we're in a non-empty block
938 ++m_p;
939 // Check if we've reached the end of this block
940 if (m_blockStepsTicker == (1 << m_blockOrder))
941 resetPtr = true;
942 if (resetPtr) {
943 // If we have, we need to reset the current block, etc.
945 setupNextBlock(x, y, z);
946 }
947 return *this;
948 }
bool m_isEmptyBlock
Whether we're at an empty block and we don't increment m_p.

References const_iterator(), m_blockIsActivated, m_blockOrder, m_blockStepsTicker, m_isEmptyBlock, m_manager, m_p, m_window, setupNextBlock(), x, y, and z.

◆ operator==()

template<class Data_T>
template<class Iter_T>
bool SparseField< Data_T >::const_iterator::operator== ( const Iter_T & rhs) const
inline

Definition at line 950 of file SparseField.h.

951 {
952 return x == rhs.x && y == rhs.y && z == rhs.z;
953 }

References x, y, and z.

◆ operator!=()

template<class Data_T>
template<class Iter_T>
bool SparseField< Data_T >::const_iterator::operator!= ( const Iter_T & rhs) const
inline

Definition at line 955 of file SparseField.h.

956 {
957 return x != rhs.x || y != rhs.y || z != rhs.z;
958 }

References x, y, and z.

◆ operator*()

template<class Data_T>
const Data_T & SparseField< Data_T >::const_iterator::operator* ( ) const
inline

Definition at line 959 of file SparseField.h.

960 {
962 m_manager->activateBlock<Data_T>(m_field->m_fileId, m_blockId);
963 m_blockIsActivated = true;
964 const Block &block = m_field->m_blocks[m_blockId];
965 int vi, vj, vk;
966 m_field->getVoxelInBlock(x, y, z, vi, vj, vk);
968 }
969 return *m_p;
970 }
Sparse::SparseBlock< Data_T > Block
virtual Data_T value(int i, int j, int k) const
Read access to a voxel. The coordinates are in integer voxel space .

References m_blockId, m_blockIsActivated, m_blockOrder, m_field, m_isEmptyBlock, m_manager, m_p, Sparse::SparseBlock< Data_T >::value(), x, y, and z.

◆ operator->()

template<class Data_T>
const Data_T * SparseField< Data_T >::const_iterator::operator-> ( ) const
inline

Definition at line 971 of file SparseField.h.

972 {
974 SparseFileManager *manager = m_field->m_fileManager;
976 m_blockIsActivated = true;
977 const Block &block = m_field->m_blocks[m_blockId];
978 int vi, vj, vk;
979 m_field->getVoxelInBlock(x, y, z, vi, vj, vk);
981 }
982 return m_p;
983 }
void activateBlock(const int blockId) const
Activates a given block.

References SparseFileManager::activateBlock(), m_blockId, m_blockIsActivated, m_blockOrder, m_field, m_isEmptyBlock, m_manager, m_p, Sparse::SparseBlock< Data_T >::value(), x, y, and z.

◆ setupNextBlock()

template<class Data_T>
void SparseField< Data_T >::const_iterator::setupNextBlock ( int i,
int j,
int k )
inlineprivate

Definition at line 998 of file SparseField.h.

999 {
1000 m_field->applyDataWindowOffset(i, j, k);
1001 m_field->getBlockCoord(i, j, k, m_blockI, m_blockJ, m_blockK);
1002 int oldBlockId = m_blockId;
1004 if (m_manager && oldBlockId != m_blockId &&
1005 oldBlockId >= 0 &&
1006 oldBlockId < static_cast<int>(m_field->m_numBlocks) &&
1007 m_field->m_blocks[oldBlockId].isAllocated) {
1008 m_manager->decBlockRef<Data_T>(m_field->m_fileId, oldBlockId);
1009 }
1010 if (m_blockId >= m_field->m_blockXYSize * m_field->m_blockRes.z) {
1011 m_isEmptyBlock = true;
1012 return;
1013 }
1014
1015 const Block &block = m_field->m_blocks[m_blockId];
1016 int vi, vj, vk;
1017 m_field->getVoxelInBlock(i, j, k, vi, vj, vk);
1019 if (block.isAllocated) {
1020 if (m_manager && oldBlockId != m_blockId && m_blockId >= 0) {
1021 m_manager->incBlockRef<Data_T>(m_field->m_fileId, m_blockId);
1022 // this is a managed field, so the block may not be loaded
1023 // yet, so don't bother setting m_p yet (it'll get set in the
1024 // * and -> operators when the block is activated)
1025 } else {
1026 // only set m_p to the voxel's address if this is not a
1027 // managed field, i.e., if the data is already in memory.
1029 }
1030 m_isEmptyBlock = false;
1031 } else {
1032 m_p = &block.emptyValue;
1033 m_isEmptyBlock = true;
1034 }
1035 if (m_field->m_fileManager) {
1036 m_blockIsActivated = false;
1037 }
1038 }
int m_blockI
Current block index.

References Sparse::SparseBlock< Data_T >::emptyValue, Sparse::SparseBlock< Data_T >::isAllocated, m_blockI, m_blockId, m_blockIsActivated, m_blockJ, m_blockK, m_blockOrder, m_blockStepsTicker, m_field, m_isEmptyBlock, m_manager, m_p, and Sparse::SparseBlock< Data_T >::value().

Referenced by const_iterator(), and operator++().

Member Data Documentation

◆ x

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

Current x/y/z coord.

Definition at line 988 of file SparseField.h.

Referenced by const_iterator(), operator!=(), operator*(), operator++(), operator->(), and operator==().

◆ y

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

Definition at line 988 of file SparseField.h.

Referenced by const_iterator(), operator!=(), operator*(), operator++(), operator->(), and operator==().

◆ z

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

Definition at line 988 of file SparseField.h.

Referenced by const_iterator(), operator!=(), operator*(), operator++(), operator->(), and operator==().

◆ m_p

template<class Data_T>
const Data_T* SparseField< Data_T >::const_iterator::m_p
mutableprivate

Current pointed-to element.

Definition at line 1041 of file SparseField.h.

Referenced by const_iterator(), operator*(), operator++(), operator->(), and setupNextBlock().

◆ m_isEmptyBlock

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

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

Definition at line 1043 of file SparseField.h.

Referenced by operator*(), operator++(), operator->(), and setupNextBlock().

◆ m_blockIsActivated

template<class Data_T>
bool SparseField< Data_T >::const_iterator::m_blockIsActivated
mutableprivate

Used with delayed-load fields. Check if we've already activated the current blocks.

Definition at line 1046 of file SparseField.h.

Referenced by const_iterator(), operator*(), operator++(), operator->(), and setupNextBlock().

◆ m_blockStepsTicker

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

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

Definition at line 1048 of file SparseField.h.

Referenced by const_iterator(), operator++(), and setupNextBlock().

◆ m_blockOrder

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

Block size.

Definition at line 1050 of file SparseField.h.

Referenced by const_iterator(), operator*(), operator++(), operator->(), and setupNextBlock().

◆ m_blockI

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

Current block index.

Definition at line 1052 of file SparseField.h.

Referenced by setupNextBlock().

◆ m_blockJ

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

Definition at line 1052 of file SparseField.h.

Referenced by setupNextBlock().

◆ m_blockK

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

Definition at line 1052 of file SparseField.h.

Referenced by setupNextBlock().

◆ m_blockId

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

◆ m_window

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

Window to traverse.

Definition at line 1054 of file SparseField.h.

Referenced by const_iterator(), and operator++().

◆ m_field

template<class Data_T>
const class_type* SparseField< Data_T >::const_iterator::m_field
private

Reference to field we're traversing.

Definition at line 1056 of file SparseField.h.

Referenced by const_iterator(), operator*(), operator->(), setupNextBlock(), and ~const_iterator().

◆ m_manager

template<class Data_T>
SparseFileManager* SparseField< Data_T >::const_iterator::m_manager
private

Pointer to the singleton file manager.

Definition at line 1058 of file SparseField.h.

Referenced by const_iterator(), operator*(), operator++(), operator->(), setupNextBlock(), and ~const_iterator().


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