Field3D
|
This subclass of Field stores data in a contiguous std::vector. More...
#include <DenseField.h>
Classes | |
class | const_iterator |
class | iterator |
Public Types | |
typedef ResizableField< Data_T > | base |
typedef DenseField< Data_T > | class_type |
typedef CubicGenericFieldInterp < DenseField< Data_T > > | CubicInterp |
typedef LinearGenericFieldInterp < DenseField< Data_T > > | LinearInterp |
typedef boost::intrusive_ptr < DenseField > | Ptr |
typedef std::vector< Ptr > | Vec |
Public Member Functions | |
virtual void | clear (const Data_T &value) |
Clears all the voxels in the storage. | |
Data_T & | fastLValue (int i, int j, int k) |
Write access to voxel. Notice that this is non-virtual. | |
const Data_T & | fastValue (int i, int j, int k) const |
Read access to voxel. Notice that this is non-virtual. | |
const FIELD3D_VEC3_T< size_t > & | internalMemSize () const |
Returns the internal memory size in each dimension. This is used for example in LinearInterpolator, where it optimizes random access to voxels. | |
Constructors & destructor | |
DenseField () | |
Constructs an empty buffer. | |
From Field | |
virtual Data_T | value (int i, int j, int k) const |
virtual long long int | memSize () const |
From WritableField | |
virtual Data_T & | lvalue (int i, int j, int k) |
Iterators | |
const_iterator | cbegin () const |
Const iterator to first element. "cbegin" matches the tr1 c++ standard. | |
const_iterator | cbegin (const Box3i &subset) const |
Const iterator to first element of specific subset. | |
const_iterator | cend () const |
Const iterator pointing one element past the last valid one. | |
const_iterator | cend (const Box3i &subset) const |
Const iterator pointing one element past the last valid one (for a subset) | |
iterator | begin () |
Iterator to first element. | |
iterator | begin (const Box3i &subset) |
Iterator to first element of specific subset. | |
iterator | end () |
Iterator pointing one element past the last valid one. | |
iterator | end (const Box3i &subset) |
Iterator pointing one element past the last valid one (for a subset) | |
From FieldBase | |
virtual std::string | className () const |
virtual FieldBase::Ptr | clone () const |
Static Public Member Functions | |
static const char * | classType () |
static DEFINE_FIELD_RTTI_CONCRETE_CLASS const char * | staticClassName () |
Protected Member Functions | |
virtual void | sizeChanged () |
Subclasses should re-implement this if they need to perform memory allocations, etc. every time the size of the storage changes. | |
Protected Attributes | |
std::vector< Data_T > | m_data |
Field storage. | |
FIELD3D_VEC3_T< size_t > | m_memSize |
Memory allocation size in each dimension. | |
size_t | m_memSizeXY |
X scanline * Y scanline size. | |
Private Member Functions | |
Data_T * | ptr (int i, int j, int k) |
Returns a pointer to a given element. Used by the iterators mainly. | |
const Data_T * | ptr (int i, int j, int k) const |
Returns a pointer to a given element. Used by the iterators mainly. | |
Static Private Attributes | |
static TemplatedFieldType < DenseField< Data_T > > | ms_classType |
This subclass of Field stores data in a contiguous std::vector.
Refer to using_fields for examples of how to use this in your code.
Definition at line 66 of file DenseField.h.
typedef boost::intrusive_ptr<DenseField> DenseField::Ptr |
Reimplemented from ResizableField< Data_T >.
Definition at line 89 of file DenseField.h.
typedef std::vector<Ptr> DenseField::Vec |
Definition at line 90 of file DenseField.h.
typedef LinearGenericFieldInterp<DenseField<Data_T> > DenseField::LinearInterp |
Definition at line 92 of file DenseField.h.
typedef CubicGenericFieldInterp<DenseField<Data_T> > DenseField::CubicInterp |
Definition at line 93 of file DenseField.h.
typedef ResizableField<Data_T> DenseField::base |
Reimplemented from ResizableField< Data_T >.
Definition at line 95 of file DenseField.h.
typedef DenseField<Data_T> DenseField::class_type |
Reimplemented from ResizableField< Data_T >.
Definition at line 122 of file DenseField.h.
DenseField::DenseField | ( | ) |
Constructs an empty buffer.
Definition at line 403 of file DenseField.h.
Referenced by clone().
: base(), m_memSize(0), m_memSizeXY(0) { // Empty }
void DenseField::clear | ( | const Data_T & | value | ) | [virtual] |
Clears all the voxels in the storage.
Definition at line 413 of file DenseField.h.
Data_T DenseField::value | ( | int | i, |
int | j, | ||
int | k | ||
) | const [virtual] |
Definition at line 421 of file DenseField.h.
{ return fastValue(i, j, k); }
long long int DenseField::memSize | ( | ) | const [virtual] |
Definition at line 429 of file DenseField.h.
{ long long int superClassMemSize = base::memSize(); long long int vectorMemSize = m_data.capacity() * sizeof(Data_T); return sizeof(*this) + vectorMemSize + superClassMemSize; }
static DEFINE_FIELD_RTTI_CONCRETE_CLASS const char* DenseField::staticClassName | ( | ) | [inline, static] |
Reimplemented from ResizableField< Data_T >.
Definition at line 125 of file DenseField.h.
Referenced by className().
{ return "DenseField"; }
static const char* DenseField::classType | ( | ) | [inline, static] |
Reimplemented from ResizableField< Data_T >.
Definition at line 130 of file DenseField.h.
{ return DenseField<Data_T>::ms_classType.name(); }
Data_T & DenseField::lvalue | ( | int | i, |
int | j, | ||
int | k | ||
) | [virtual] |
Definition at line 439 of file DenseField.h.
{ return fastLValue(i, j, k); }
const Data_T & DenseField::fastValue | ( | int | i, |
int | j, | ||
int | k | ||
) | const |
Read access to voxel. Notice that this is non-virtual.
Definition at line 447 of file DenseField.h.
{ assert (i >= base::m_dataWindow.min.x); assert (i <= base::m_dataWindow.max.x); assert (j >= base::m_dataWindow.min.y); assert (j <= base::m_dataWindow.max.y); assert (k >= base::m_dataWindow.min.z); assert (k <= base::m_dataWindow.max.z); // Add crop window offset i -= base::m_dataWindow.min.x; j -= base::m_dataWindow.min.y; k -= base::m_dataWindow.min.z; // Access data return m_data[i + j * m_memSize.x + k * m_memSizeXY]; }
Data_T & DenseField::fastLValue | ( | int | i, |
int | j, | ||
int | k | ||
) |
Write access to voxel. Notice that this is non-virtual.
Definition at line 466 of file DenseField.h.
{ assert (i >= base::m_dataWindow.min.x); assert (i <= base::m_dataWindow.max.x); assert (j >= base::m_dataWindow.min.y); assert (j <= base::m_dataWindow.max.y); assert (k >= base::m_dataWindow.min.z); assert (k <= base::m_dataWindow.max.z); // Add crop window offset i -= base::m_dataWindow.min.x; j -= base::m_dataWindow.min.y; k -= base::m_dataWindow.min.z; // Access data return m_data[i + j * m_memSize.x + k * m_memSizeXY]; }
DenseField< Data_T >::const_iterator DenseField::cbegin | ( | ) | const |
Const iterator to first element. "cbegin" matches the tr1 c++ standard.
Definition at line 486 of file DenseField.h.
References FieldRes::dataResolution().
{ if (FieldRes::dataResolution() == V3i(0)) return cend(); return const_iterator(*this, base::m_dataWindow, base::m_dataWindow.min); }
DenseField< Data_T >::const_iterator DenseField::cbegin | ( | const Box3i & | subset | ) | const |
Const iterator to first element of specific subset.
Definition at line 497 of file DenseField.h.
{ if (subset.isEmpty()) return cend(subset); return const_iterator(*this, subset, subset.min); }
DenseField< Data_T >::const_iterator DenseField::cend | ( | ) | const |
Const iterator pointing one element past the last valid one.
Definition at line 508 of file DenseField.h.
{ return const_iterator(*this, base::m_dataWindow, V3i(base::m_dataWindow.min.x, base::m_dataWindow.min.y, base::m_dataWindow.max.z + 1)); }
DenseField< Data_T >::const_iterator DenseField::cend | ( | const Box3i & | subset | ) | const |
Const iterator pointing one element past the last valid one (for a subset)
Definition at line 520 of file DenseField.h.
{ return const_iterator(*this, subset, V3i(subset.min.x, subset.min.y, subset.max.z + 1)); }
DenseField< Data_T >::iterator DenseField::begin | ( | ) |
Iterator to first element.
Definition at line 530 of file DenseField.h.
References FieldRes::dataResolution().
Referenced by DenseFieldIO::writeData(), and DenseFieldIO::readData().
{ if (FieldRes::dataResolution() == V3i(0)) return end(); return iterator(*this, base::m_dataWindow, base::m_dataWindow.min); }
DenseField< Data_T >::iterator DenseField::begin | ( | const Box3i & | subset | ) |
Iterator to first element of specific subset.
Definition at line 540 of file DenseField.h.
{ if (subset.isEmpty()) return end(subset); return iterator(*this, subset, subset.min); }
DenseField< Data_T >::iterator DenseField::end | ( | ) |
Iterator pointing one element past the last valid one.
Definition at line 551 of file DenseField.h.
{ return iterator(*this, base::m_dataWindow, V3i(base::m_dataWindow.min.x, base::m_dataWindow.min.y, base::m_dataWindow.max.z + 1)); }
DenseField< Data_T >::iterator DenseField::end | ( | const Box3i & | subset | ) |
Iterator pointing one element past the last valid one (for a subset)
Definition at line 563 of file DenseField.h.
{ return iterator(*this, subset, V3i(subset.min.x, subset.min.y, subset.max.z + 1)); }
const FIELD3D_VEC3_T<size_t>& DenseField::internalMemSize | ( | ) | const [inline] |
Returns the internal memory size in each dimension. This is used for example in LinearInterpolator, where it optimizes random access to voxels.
Definition at line 186 of file DenseField.h.
References m_memSize.
Referenced by DenseFieldIO::writeInternal().
{ return m_memSize; }
virtual std::string DenseField::className | ( | ) | const [inline, virtual] |
Definition at line 194 of file DenseField.h.
References staticClassName().
{ return staticClassName(); }
virtual FieldBase::Ptr DenseField::clone | ( | ) | const [inline, virtual] |
Definition at line 197 of file DenseField.h.
References DenseField().
{ return Ptr(new DenseField(*this)); }
void DenseField::sizeChanged | ( | ) | [protected, virtual] |
Subclasses should re-implement this if they need to perform memory allocations, etc. every time the size of the storage changes.
Reimplemented from ResizableField< Data_T >.
Definition at line 572 of file DenseField.h.
{ // Call base class base::sizeChanged(); // Calculate offsets m_memSize = base::m_dataWindow.max - base::m_dataWindow.min + V3i(1); m_memSizeXY = m_memSize.x * m_memSize.y; // Check that mem size is >= 0 in all dimensions if (base::m_dataWindow.max.x < base::m_dataWindow.min.x || base::m_dataWindow.max.y < base::m_dataWindow.min.y || base::m_dataWindow.max.z < base::m_dataWindow.min.z) throw Exc::ResizeException("Attempt to resize ResizableField object " "using negative size. Data window was: " + boost::lexical_cast<std::string>( base::m_dataWindow.min) + " - " + boost::lexical_cast<std::string>( base::m_dataWindow.max)); // Allocate memory try { std::vector<Data_T>().swap(m_data); m_data.resize(m_memSize.x * m_memSize.y * m_memSize.z); } catch (std::bad_alloc &e) { throw Exc::MemoryException("Couldn't allocate DenseField of size " + boost::lexical_cast<std::string>(m_memSize)); } }
Data_T * DenseField::ptr | ( | int | i, |
int | j, | ||
int | k | ||
) | [inline, private] |
Returns a pointer to a given element. Used by the iterators mainly.
Definition at line 606 of file DenseField.h.
const Data_T * DenseField::ptr | ( | int | i, |
int | j, | ||
int | k | ||
) | const [inline, private] |
Returns a pointer to a given element. Used by the iterators mainly.
Definition at line 619 of file DenseField.h.
FIELD3D_VEC3_T<size_t> DenseField::m_memSize [protected] |
Memory allocation size in each dimension.
Definition at line 211 of file DenseField.h.
Referenced by internalMemSize().
size_t DenseField::m_memSizeXY [protected] |
X scanline * Y scanline size.
Definition at line 213 of file DenseField.h.
std::vector<Data_T> DenseField::m_data [protected] |
Field storage.
Definition at line 215 of file DenseField.h.
TemplatedFieldType<DenseField<Data_T> > DenseField::ms_classType [static, private] |
Reimplemented from ResizableField< Data_T >.
Definition at line 221 of file DenseField.h.