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>
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>
161 if (this->isOutOfCore()) {
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>
193 if (mData) mData[i] =
val;
197 template<
typename T, Index Log2Dim>
201 if (&other !=
this) {
202 if (this->isOutOfCore()) {
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);
272 if (this->isOutOfCore()) n +=
sizeof(
FileInfo);
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>
320 LeafBuffer<T, Log2Dim>::deallocate()
322 if (mData !=
nullptr && !this->isOutOfCore()) {
331 template<
typename T, Index Log2Dim>
333 LeafBuffer<T, Log2Dim>::doLoad()
const
335 if (!this->isOutOfCore())
return;
337 LeafBuffer<T, Log2Dim>*
self =
const_cast<LeafBuffer<T, Log2Dim>*
>(
this);
341 tbb::spin_mutex::scoped_lock lock(self->mMutex);
342 if (!this->isOutOfCore())
return;
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;
353 SharedPtr<std::streambuf>
buf = info->mapping->createBuffer();
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>
371 LeafBuffer<T, Log2Dim>::detachFromFile()
373 if (this->isOutOfCore()) {
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
GLboolean GLboolean GLboolean b
LeafBuffer & operator=(const LeafBuffer &)
Copy the other buffer's values into this buffer.
bool isExactlyEqual(const T0 &a, const T1 &b)
Return true if a is exactly equal to b.
void swap(UT::ArraySet< Key, MULTI, MAX_LOAD_FACTOR_256, Clearer, Hash, KeyEqual > &a, UT::ArraySet< Key, MULTI, MAX_LOAD_FACTOR_256, Clearer, Hash, KeyEqual > &b)
LeafBuffer(PartialCreate, const ValueType &)
Construct a buffer but don't allocate memory for the full array of values.
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 ...
#define OPENVDB_USE_VERSION_NAMESPACE
const bool & getValue(Index i) const
SharedPtr< MappedFile > Ptr
bool operator==(const LeafBuffer &) const
Return true if the contents of the other buffer exactly equal the contents of this buffer...
void swap(LeafBuffer &other)
bool empty() const
Return true if memory for this buffer has not yet been allocated.
Tag dispatch class that distinguishes constructors during file input.
void readCompressedValues(std::istream &is, ValueT *destBuf, Index destCount, const MaskT &valueMask, bool fromHalf)
std::shared_ptr< T > SharedPtr
LeafBuffer()
Default constructor.
Bit mask for the internal and leaf nodes of VDB. This is a 64-bit implementation. ...
void swap(LeafBuffer &)
Exchange this buffer's values with the other buffer's values.
Templated block class to hold specific data types and a fixed number of values determined by Log2Dim...
io::MappedFile::Ptr mapping
GLsizei GLsizei GLchar * source
bool allocate()
Allocate memory for this buffer if it has not already been allocated.
static Index size()
Return the number of values contained in this buffer.
static const Index32 WORD_COUNT
const ValueType & getValue(Index i) const
Return a const reference to the i'th element of this buffer.
LeafBuffer(const LeafBuffer &other)
Index memUsage() const
Return the memory footprint of this buffer in bytes.
WordType * data()
Return a pointer to the C-style array of words encoding the bits.
typename NodeMaskType::Word WordType
GLenum GLuint GLenum GLsizei const GLchar * buf
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...
const ValueType * data() const
Return a const pointer to the array of voxel values.
const ValueType & operator[](Index i) const
Return a const reference to the i'th element of this buffer.
void fill(const ValueType &)
Populate this buffer with a constant value.
LeafBuffer(const NodeMaskType &other)
bool operator==(const LeafBuffer &other) const
bool isOutOfCore() const
Return true if this buffer's values have not yet been read from disk.
Array of fixed size 23Log2Dim that stores the voxel values of a LeafNode.
LeafBuffer & operator=(const LeafBuffer &b)
void setValue(Index i, bool val)
void setValue(Index i, const ValueType &)
Set the i'th value of this buffer to the specified value.
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...
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
const WordType * data() const
Return a const pointer to the C-style array of words encoding the bits.
const bool & operator[](Index i) const
bool operator!=(const LeafBuffer &other) const
SharedPtr< io::StreamMetadata > meta