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(); }
116 inline void setOutOfCore(
bool b) { mOutOfCore = b; }
119 inline void loadValues()
const {
if (this->isOutOfCore()) this->doLoad(); }
120 inline void doLoad()
const;
121 inline bool detachFromFile();
123 using FlagsType = std::atomic<Index32>;
129 FlagsType mOutOfCore;
130 tbb::spin_mutex mMutex;
133 static const ValueType sZero;
135 friend class ::TestLeaf;
144 template<
typename T, Index Log2Dim>
148 template<
typename T, Index Log2Dim>
158 template<
typename T, Index Log2Dim>
162 if (this->isOutOfCore()) {
163 this->detachFromFile();
170 template<
typename T, Index Log2Dim>
174 , mOutOfCore(other.mOutOfCore.load())
178 }
else if (other.
mData !=
nullptr) {
183 while (n--) *target++ = *source++;
188 template<
typename T, Index Log2Dim>
194 if (mData) mData[i] = val;
198 template<
typename T, Index Log2Dim>
202 if (&other !=
this) {
203 if (this->isOutOfCore()) {
204 this->detachFromFile();
209 mOutOfCore.store(other.mOutOfCore.load(std::memory_order_acquire),
210 std::memory_order_release);
212 }
else if (other.
mData !=
nullptr) {
217 while (n--) *target++ = *source++;
224 template<
typename T, Index Log2Dim>
228 this->detachFromFile();
229 if (mData !=
nullptr) {
232 while (n--) *target++ = val;
237 template<
typename T, Index Log2Dim>
244 if (!target && !source)
return true;
245 if (!target || !source)
return false;
252 template<
typename T, Index Log2Dim>
256 std::swap(mData, other.
mData);
262 auto tmp = other.mOutOfCore.load(std::memory_order_acquire);
263 tmp = mOutOfCore.exchange(std::move(tmp));
264 other.mOutOfCore.store(std::move(tmp), std::memory_order_release);
268 template<
typename T, Index Log2Dim>
272 size_t n =
sizeof(*this);
273 if (this->isOutOfCore()) n +=
sizeof(
FileInfo);
274 else if (mData) n += SIZE *
sizeof(
ValueType);
275 return static_cast<Index>(n);
279 template<
typename T, Index Log2Dim>
283 size_t n =
sizeof(*this);
285 return static_cast<Index>(n);
289 template<
typename T, Index Log2Dim>
294 if (mData ==
nullptr) {
297 tbb::spin_mutex::scoped_lock lock(self->mMutex);
298 if (mData ==
nullptr)
self->mData =
new ValueType[SIZE];
303 template<
typename T, Index Log2Dim>
308 if (mData ==
nullptr) {
310 tbb::spin_mutex::scoped_lock lock(mMutex);
311 if (mData ==
nullptr) mData =
new ValueType[SIZE];
317 template<
typename T, Index Log2Dim>
325 if (mData)
return mData[i];
else return sZero;
329 template<
typename T, Index Log2Dim>
331 LeafBuffer<T, Log2Dim>::deallocate()
333 if (mData !=
nullptr && !this->isOutOfCore()) {
342 template<
typename T, Index Log2Dim>
344 LeafBuffer<T, Log2Dim>::doLoad()
const
346 if (!this->isOutOfCore())
return;
348 LeafBuffer<T, Log2Dim>*
self =
const_cast<LeafBuffer<T, Log2Dim>*
>(
this);
352 tbb::spin_mutex::scoped_lock lock(self->mMutex);
353 if (!this->isOutOfCore())
return;
355 std::unique_ptr<FileInfo> info(self->mFileInfo);
356 assert(info.get() !=
nullptr);
357 assert(info->mapping.get() !=
nullptr);
358 assert(info->meta.get() !=
nullptr);
361 self->mData =
nullptr;
364 SharedPtr<std::streambuf> buf = info->mapping->createBuffer();
365 std::istream is(buf.get());
370 is.seekg(info->maskpos);
373 is.seekg(info->bufpos);
376 self->setOutOfCore(
false);
380 template<
typename T, Index Log2Dim>
382 LeafBuffer<T, Log2Dim>::detachFromFile()
384 if (this->isOutOfCore()) {
387 this->setOutOfCore(
false);
398 template<Index Log2Dim>
427 if (
mData.isOn(i))
return sOn;
else return sOff;
Tag dispatch class that distinguishes constructors during file input.
Definition: Types.h:650
SharedPtr< MappedFile > Ptr
Definition: io.h:136
LeafBuffer(const NodeMaskType &other)
Definition: LeafBuffer.h:416
~LeafBuffer()
Definition: LeafBuffer.h:418
WordType StorageType
Definition: LeafBuffer.h:405
bool operator!=(const LeafBuffer &other) const
Definition: LeafBuffer.h:432
LeafBuffer & operator=(const LeafBuffer &b)
Definition: LeafBuffer.h:420
static const bool sOff
Definition: LeafBuffer.h:412
typename NodeMaskType::Word WordType
Definition: LeafBuffer.h:403
Index memUsage() const
Definition: LeafBuffer.h:438
WordType * data()
Return a pointer to the C-style array of words encoding the bits.
Definition: LeafBuffer.h:444
void swap(LeafBuffer &other)
Definition: LeafBuffer.h:436
const WordType * data() const
Return a const pointer to the C-style array of words encoding the bits.
Definition: LeafBuffer.h:447
bool operator==(const LeafBuffer &other) const
Definition: LeafBuffer.h:431
Index memUsageIfLoaded() const
Definition: LeafBuffer.h:439
bool ValueType
Definition: LeafBuffer.h:404
LeafBuffer(const LeafBuffer &other)
Definition: LeafBuffer.h:417
const bool & getValue(Index i) const
Definition: LeafBuffer.h:422
LeafBuffer(bool on)
Definition: LeafBuffer.h:415
void fill(bool val)
Definition: LeafBuffer.h:419
static Index size()
Definition: LeafBuffer.h:440
static const bool sOn
Definition: LeafBuffer.h:411
LeafBuffer()
Definition: LeafBuffer.h:414
const bool & operator[](Index i) const
Definition: LeafBuffer.h:429
void setValue(Index i, bool val)
Definition: LeafBuffer.h:434
Array of fixed size 23Log2Dim that stores the voxel values of a LeafNode.
Definition: LeafBuffer.h:31
LeafBuffer & operator=(const LeafBuffer &)
Copy the other buffer's values into this buffer.
Definition: LeafBuffer.h:200
~LeafBuffer()
Destructor.
Definition: LeafBuffer.h:160
LeafBuffer(PartialCreate, const ValueType &)
Construct a buffer but don't allocate memory for the full array of values.
Definition: LeafBuffer.h:54
ValueType StorageType
Definition: LeafBuffer.h:34
LeafBuffer(const ValueType &)
Construct a buffer populated with the specified value.
Definition: LeafBuffer.h:150
LeafBuffer(const LeafBuffer &)
Copy constructor.
Definition: LeafBuffer.h:172
void fill(const ValueType &)
Populate this buffer with a constant value.
Definition: LeafBuffer.h:226
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
void swap(LeafBuffer &)
Exchange this buffer's values with the other buffer's values.
Definition: LeafBuffer.h:254
bool isOutOfCore() const
Return true if this buffer's values have not yet been read from disk.
Definition: LeafBuffer.h:59
const ValueType & operator[](Index i) const
Return a const reference to the i'th element of this buffer.
Definition: LeafBuffer.h:71
Index memUsage() const
Return the memory footprint of this buffer in bytes.
Definition: LeafBuffer.h:270
ValueType * mData
Definition: LeafBuffer.h:126
FileInfo * mFileInfo
Definition: LeafBuffer.h:127
bool empty() const
Return true if memory for this buffer has not yet been allocated.
Definition: LeafBuffer.h:61
const ValueType & getValue(Index i) const
Return a const reference to the i'th element of this buffer.
Definition: LeafBuffer.h:69
Index memUsageIfLoaded() const
Definition: LeafBuffer.h:281
void setValue(Index i, const ValueType &)
Set the i'th value of this buffer to the specified value.
Definition: LeafBuffer.h:190
static Index size()
Return the number of values contained in this buffer.
Definition: LeafBuffer.h:92
const ValueType * data() const
Return a const pointer to the array of voxel values.
Definition: LeafBuffer.h:291
static const Index SIZE
Definition: LeafBuffer.h:36
ValueType * data()
Return a pointer to the array of voxel values.
Definition: LeafBuffer.h:305
bool allocate()
Allocate memory for this buffer if it has not already been allocated.
Definition: LeafBuffer.h:63
LeafBuffer()
Default constructor.
Definition: LeafBuffer.h:48
T ValueType
Definition: LeafBuffer.h:33
bool operator==(const LeafBuffer &) const
Return true if the contents of the other buffer exactly equal the contents of this buffer.
Definition: LeafBuffer.h:239
Templated block class to hold specific data types and a fixed number of values determined by Log2Dim....
Definition: LeafNode.h:38
Bit mask for the internal and leaf nodes of VDB. This is a 64-bit implementation.
Definition: NodeMasks.h:308
Index64 Word
Definition: NodeMasks.h:316
static const Index32 WORD_COUNT
Definition: NodeMasks.h:315
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 readCompressedValues(std::istream &is, ValueT *destBuf, Index destCount, const MaskT &valueMask, bool fromHalf)
Definition: Compression.h:465
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 isExactlyEqual(const T0 &a, const T1 &b)
Return true if a is exactly equal to b.
Definition: Math.h:444
Index32 Index
Definition: Types.h:54
std::shared_ptr< T > SharedPtr
Definition: Types.h:114
Definition: Exceptions.h:13
static pnanovdb_uint32_t allocate(pnanovdb_uint32_t *poffset, pnanovdb_uint32_t size, pnanovdb_uint32_t alignment)
Definition: pnanovdb_validate_strides.h:20
Definition: LeafBuffer.h:39
FileInfo()
Definition: LeafBuffer.h:40
SharedPtr< io::StreamMetadata > meta
Definition: LeafBuffer.h:44
std::streamoff bufpos
Definition: LeafBuffer.h:41
io::MappedFile::Ptr mapping
Definition: LeafBuffer.h:43
std::streamoff maskpos
Definition: LeafBuffer.h:42
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition: version.h.in:116
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h.in:202