4 #ifndef OPENVDB_TREE_LEAFBUFFER_HAS_BEEN_INCLUDED 5 #define OPENVDB_TREE_LEAFBUFFER_HAS_BEEN_INCLUDED 10 #include <tbb/spin_mutex.h> 16 #include <type_traits> 29 template<
typename T, Index Log2Dim>
36 static const Index SIZE = 1 << 3 * Log2Dim;
61 bool empty()
const {
return !mData || this->isOutOfCore(); }
115 inline void setOutOfCore(
bool b) { mOutOfCore = b; }
118 inline void loadValues()
const {
if (this->isOutOfCore()) this->doLoad(); }
119 inline void doLoad()
const;
120 inline bool detachFromFile();
122 using FlagsType = std::atomic<Index32>;
128 FlagsType mOutOfCore;
129 tbb::spin_mutex mMutex;
134 friend class ::TestLeaf;
143 template<
typename T, Index Log2Dim>
147 template<
typename T, Index Log2Dim>
157 template<
typename T, Index Log2Dim>
162 this->detachFromFile();
169 template<
typename T, Index Log2Dim>
173 , mOutOfCore(other.mOutOfCore.load())
177 }
else if (other.
mData !=
nullptr) {
182 while (n--) *target++ = *source++;
187 template<
typename T, Index Log2Dim>
197 template<
typename T, Index Log2Dim>
201 if (&other !=
this) {
203 this->detachFromFile();
208 mOutOfCore.store(other.mOutOfCore.load(std::memory_order_acquire),
209 std::memory_order_release);
211 }
else if (other.
mData !=
nullptr) {
216 while (n--) *target++ = *source++;
223 template<
typename T, Index Log2Dim>
227 this->detachFromFile();
228 if (
mData !=
nullptr) {
231 while (n--) *target++ = val;
236 template<
typename T, Index Log2Dim>
243 if (!target && !source)
return true;
244 if (!target || !source)
return false;
251 template<
typename T, Index Log2Dim>
261 auto tmp = other.mOutOfCore.load(std::memory_order_acquire);
262 tmp = mOutOfCore.exchange(std::move(tmp));
263 other.mOutOfCore.store(std::move(tmp), std::memory_order_release);
267 template<
typename T, Index Log2Dim>
271 size_t n =
sizeof(*this);
274 return static_cast<Index>(n);
278 template<
typename T, Index Log2Dim>
283 if (
mData ==
nullptr) {
286 tbb::spin_mutex::scoped_lock lock(self->mMutex);
292 template<
typename T, Index Log2Dim>
297 if (
mData ==
nullptr) {
299 tbb::spin_mutex::scoped_lock lock(mMutex);
306 template<
typename T, Index Log2Dim>
314 if (
mData)
return mData[i];
else return sZero;
318 template<
typename T, Index Log2Dim>
331 template<
typename T, Index Log2Dim>
341 tbb::spin_mutex::scoped_lock lock(self->mMutex);
344 std::unique_ptr<FileInfo> info(self->mFileInfo);
345 assert(info.get() !=
nullptr);
346 assert(info->mapping.get() !=
nullptr);
347 assert(info->meta.get() !=
nullptr);
350 self->mData =
nullptr;
354 std::istream is(buf.get());
359 is.seekg(info->maskpos);
362 is.seekg(info->bufpos);
365 self->setOutOfCore(
false);
369 template<
typename T, Index Log2Dim>
376 this->setOutOfCore(
false);
387 template<Index Log2Dim>
416 if (
mData.isOn(i))
return sOn;
else return sOff;
456 #endif // OPENVDB_TREE_LEAFBUFFER_HAS_BEEN_INCLUDED void swap(LeafBuffer &)
Exchange this buffer's values with the other buffer's values.
Definition: LeafBuffer.h:253
bool isExactlyEqual(const T0 &a, const T1 &b)
Return true if a is exactly equal to b.
Definition: Math.h:444
WordType StorageType
Definition: LeafBuffer.h:394
Templated block class to hold specific data types and a fixed number of values determined by Log2Dim...
Definition: LeafNode.h:37
LeafBuffer & operator=(const LeafBuffer &)
Copy the other buffer's values into this buffer.
Definition: LeafBuffer.h:199
SharedPtr< MappedFile > Ptr
Definition: io.h:136
LeafBuffer(const NodeMaskType &other)
Definition: LeafBuffer.h:405
LeafBuffer(PartialCreate, const ValueType &)
Construct a buffer but don't allocate memory for the full array of values.
Definition: LeafBuffer.h:54
typename NodeMaskType::Word WordType
Definition: LeafBuffer.h:392
const WordType * data() const
Return a const pointer to the C-style array of words encoding the bits.
Definition: LeafBuffer.h:435
Index memUsage() const
Return the memory footprint of this buffer in bytes.
Definition: LeafBuffer.h:269
void readCompressedValues(std::istream &is, ValueT *destBuf, Index destCount, const MaskT &valueMask, bool fromHalf)
Definition: Compression.h:465
ValueType ValueType
Definition: LeafBuffer.h:33
bool empty() const
Return true if memory for this buffer has not yet been allocated.
Definition: LeafBuffer.h:61
~LeafBuffer()
Definition: LeafBuffer.h:407
bool ValueType
Definition: LeafBuffer.h:393
std::shared_ptr< T > SharedPtr
Definition: Types.h:114
const bool & operator[](Index i) const
Definition: LeafBuffer.h:418
void fill(const ValueType &)
Populate this buffer with a constant value.
Definition: LeafBuffer.h:225
bool operator==(const LeafBuffer &other) const
Definition: LeafBuffer.h:420
LeafBuffer(const LeafBuffer &other)
Definition: LeafBuffer.h:406
bool allocate()
Allocate memory for this buffer if it has not already been allocated.
Definition: LeafBuffer.h:63
void load(std::istream &is)
Definition: NodeMasks.h:569
WordType * data()
Return a pointer to the C-style array of words encoding the bits.
Definition: LeafBuffer.h:432
static const Index32 WORD_COUNT
Definition: NodeMasks.h:315
std::streamoff maskpos
Definition: LeafBuffer.h:42
LeafBuffer & operator=(const LeafBuffer &b)
Definition: LeafBuffer.h:409
static Index size()
Definition: LeafBuffer.h:428
OPENVDB_API void setStreamMetadataPtr(std::ios_base &, SharedPtr< StreamMetadata > &, bool transfer=true)
Associate the given stream with (a shared pointer to) an object that stores metadata (file format...
bool isOutOfCore() const
Return true if this buffer's values have not yet been read from disk.
Definition: LeafBuffer.h:59
OPENVDB_API bool getHalfFloat(std::ios_base &)
Return true if floating-point values should be quantized to 16 bits when writing to the given stream ...
void swap(LeafBuffer &other)
Definition: LeafBuffer.h:425
ValueType StorageType
Definition: LeafBuffer.h:34
const ValueType & getValue(Index i) const
Return a const reference to the i'th element of this buffer.
Definition: LeafBuffer.h:69
Definition: Exceptions.h:13
const bool & getValue(Index i) const
Definition: LeafBuffer.h:411
LeafBuffer()
Default constructor.
Definition: LeafBuffer.h:48
Definition: LeafBuffer.h:38
Index64 Word
Definition: NodeMasks.h:316
void setValue(Index i, const ValueType &)
Set the i'th value of this buffer to the specified value.
Definition: LeafBuffer.h:189
bool operator!=(const LeafBuffer &other) const
Definition: LeafBuffer.h:421
Index32 Index
Definition: Types.h:54
const ValueType * data() const
Return a const pointer to the array of voxel values.
Definition: LeafBuffer.h:280
io::MappedFile::Ptr mapping
Definition: LeafBuffer.h:43
static Index size()
Return the number of values contained in this buffer.
Definition: LeafBuffer.h:91
bool operator==(const LeafBuffer &) const
Return true if the contents of the other buffer exactly equal the contents of this buffer...
Definition: LeafBuffer.h:238
ValueType * mData
Definition: LeafBuffer.h:125
static const bool sOn
Definition: LeafBuffer.h:400
const ValueType & operator[](Index i) const
Return a const reference to the i'th element of this buffer.
Definition: LeafBuffer.h:71
Bit mask for the internal and leaf nodes of VDB. This is a 64-bit implementation. ...
Definition: NodeMasks.h:307
Array of fixed size 23Log2Dim that stores the voxel values of a LeafNode.
Definition: LeafBuffer.h:30
Tag dispatch class that distinguishes constructors during file input.
Definition: Types.h:650
bool operator!=(const LeafBuffer &other) const
Return true if the contents of the other buffer are not exactly equal to the contents of this buffer...
Definition: LeafBuffer.h:83
SharedPtr< io::StreamMetadata > meta
Definition: LeafBuffer.h:44
std::streamoff bufpos
Definition: LeafBuffer.h:41
Index memUsage() const
Definition: LeafBuffer.h:427
static const Index SIZE
Definition: LeafBuffer.h:36
~LeafBuffer()
Destructor.
Definition: LeafBuffer.h:159
static const bool sOff
Definition: LeafBuffer.h:401
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition: version.h.in:116
bool operator==(const Vec3< T0 > &v0, const Vec3< T1 > &v1)
Equality operator, does exact floating point comparisons.
Definition: Vec3.h:477
LeafBuffer(bool on)
Definition: LeafBuffer.h:404
FileInfo()
Definition: LeafBuffer.h:40
void setValue(Index i, bool val)
Definition: LeafBuffer.h:423
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h.in:202
LeafBuffer()
Definition: LeafBuffer.h:403
void fill(bool val)
Definition: LeafBuffer.h:408
FileInfo * mFileInfo
Definition: LeafBuffer.h:126