OpenVDB  7.2.0
AttributeSet.h
Go to the documentation of this file.
1 // Copyright Contributors to the OpenVDB Project
2 // SPDX-License-Identifier: MPL-2.0
3 
9 
10 #ifndef OPENVDB_POINTS_ATTRIBUTE_SET_HAS_BEEN_INCLUDED
11 #define OPENVDB_POINTS_ATTRIBUTE_SET_HAS_BEEN_INCLUDED
12 
13 #include "AttributeArray.h"
14 #include <openvdb/version.h>
15 #include <openvdb/MetaMap.h>
16 
17 #include <limits>
18 #include <memory>
19 #include <vector>
20 
21 
22 class TestAttributeSet;
23 
24 
25 namespace openvdb {
27 namespace OPENVDB_VERSION_NAME {
28 namespace points {
29 
30 
31 using GroupType = uint8_t;
32 
33 
35 
36 
39 {
40 public:
41  enum { INVALID_POS = std::numeric_limits<size_t>::max() };
42 
43  using Ptr = std::shared_ptr<AttributeSet>;
44  using ConstPtr = std::shared_ptr<const AttributeSet>;
45  using UniquePtr = std::unique_ptr<AttributeSet>;
46 
47  class Descriptor;
48 
49  using DescriptorPtr = std::shared_ptr<Descriptor>;
50  using DescriptorConstPtr = std::shared_ptr<const Descriptor>;
51 
53 
54  struct Util
55  {
57  struct NameAndType {
58  NameAndType(const std::string& n, const NamePair& t, const Index s = 1)
59  : name(n), type(t), stride(s) {}
63  };
64 
65  using NameAndTypeVec = std::vector<NameAndType>;
66  using NameToPosMap = std::map<std::string, size_t>;
67  using GroupIndex = std::pair<size_t, uint8_t>;
68  };
69 
71 
72  AttributeSet();
73 
80  AttributeSet(const AttributeSet& attributeSet, Index arrayLength,
81  const AttributeArray::ScopedRegistryLock* lock = nullptr);
82 
90  AttributeSet(const DescriptorPtr& descriptor, Index arrayLength = 1,
91  const AttributeArray::ScopedRegistryLock* lock = nullptr);
92 
94  AttributeSet(const AttributeSet&);
95 
97  AttributeSet& operator=(const AttributeSet&) = delete;
98 
100  Descriptor& descriptor() { return *mDescr; }
103  const Descriptor& descriptor() const { return *mDescr; }
105 
108  DescriptorPtr descriptorPtr() const { return mDescr; }
109 
111  size_t size() const { return mAttrs.size(); }
112 
114  size_t memUsage() const;
115 
118  size_t find(const std::string& name) const;
119 
124  size_t replace(const std::string& name, const AttributeArray::Ptr&);
125 
130  size_t replace(size_t pos, const AttributeArray::Ptr&);
131 
133  const AttributeArray* getConst(const std::string& name) const;
136  const AttributeArray* get(const std::string& name) const;
137  AttributeArray* get(const std::string& name);
139 
141  const AttributeArray* getConst(size_t pos) const;
144  const AttributeArray* get(size_t pos) const;
145  AttributeArray* get(size_t pos);
147 
149  size_t groupOffset(const Name& groupName) const;
156  size_t groupOffset(const Util::GroupIndex& index) const;
158 
160  Util::GroupIndex groupIndex(const Name& groupName) const;
163  Util::GroupIndex groupIndex(const size_t offset) const;
164 
166  std::vector<size_t> groupAttributeIndices() const;
167 
169  bool isShared(size_t pos) const;
173  void makeUnique(size_t pos);
174 
177  const NamePair& type,
178  const Index strideOrTotalSize = 1,
179  const bool constantStride = true,
180  const Metadata* defaultValue = nullptr);
181 
184  const NamePair& type,
185  const Index strideOrTotalSize,
186  const bool constantStride,
187  Metadata::Ptr defaultValue);
188 
193  AttributeArray::Ptr appendAttribute(const Descriptor& expected, DescriptorPtr& replacement,
194  const size_t pos, const Index strideOrTotalSize = 1,
195  const bool constantStride = true,
196  const Metadata* defaultValue = nullptr,
197  const AttributeArray::ScopedRegistryLock* lock = nullptr);
198 
200  AttributeArray::Ptr appendAttribute(const Descriptor& expected, DescriptorPtr& replacement,
201  const size_t pos, const Index strideOrTotalSize,
202  const bool constantStride,
204 
212  AttributeArray::Ptr removeAttribute(const Name& name);
213 
221  AttributeArray::Ptr removeAttribute(const size_t pos);
222 
235  AttributeArray::Ptr removeAttributeUnsafe(const size_t pos);
236 
239  void dropAttributes(const std::vector<size_t>& pos);
240 
244  void dropAttributes(const std::vector<size_t>& pos,
245  const Descriptor& expected, DescriptorPtr& replacement);
246 
249  void renameAttributes(const Descriptor& expected, const DescriptorPtr& replacement);
250 
253  void reorderAttributes(const DescriptorPtr& replacement);
254 
258  void resetDescriptor(const DescriptorPtr& replacement, const bool allowMismatchingDescriptors = false);
259 
261  void read(std::istream&);
264  void write(std::ostream&, bool outputTransient = false) const;
265 
267  void readDescriptor(std::istream&);
270  void writeDescriptor(std::ostream&, bool outputTransient = false) const;
271 
273  void readMetadata(std::istream&);
277  void writeMetadata(std::ostream&, bool outputTransient = false, bool paged = false) const;
278 
280  void readAttributes(std::istream&);
283  void writeAttributes(std::ostream&, bool outputTransient = false) const;
284 
287  bool operator==(const AttributeSet& other) const;
288  bool operator!=(const AttributeSet& other) const { return !this->operator==(other); }
289 
290 private:
291  using AttrArrayVec = std::vector<AttributeArray::Ptr>;
292 
293  DescriptorPtr mDescr;
294  AttrArrayVec mAttrs;
295 }; // class AttributeSet
296 
298 
299 
301 namespace future {
302  class Container
303  {
304  class Element { };
305  std::vector<std::shared_ptr<Element>> mElements;
306  };
307 }
308 
309 
311 
312 
317 class OPENVDB_API AttributeSet::Descriptor
318 {
319 public:
320  using Ptr = std::shared_ptr<Descriptor>;
321 
326  using ConstIterator = NameToPosMap::const_iterator;
327 
329  struct Inserter {
331  Inserter& add(const NameAndType& nameAndType) {
332  vec.push_back(nameAndType); return *this;
333  }
334  Inserter& add(const Name& name, const NamePair& type) {
335  vec.emplace_back(name, type); return *this;
336  }
337  Inserter& add(const NameAndTypeVec& other) {
338  for (NameAndTypeVec::const_iterator it = other.begin(), itEnd = other.end(); it != itEnd; ++it) {
339  vec.emplace_back(it->name, it->type);
340  }
341  return *this;
342  }
343  };
344 
346 
347  Descriptor();
348 
350  Descriptor(const Descriptor&);
351 
353  static Ptr create(const NamePair&);
354 
356  Ptr duplicateAppend(const Name& name, const NamePair& type) const;
357 
359  Ptr duplicateDrop(const std::vector<size_t>& pos) const;
360 
362  size_t size() const { return mTypes.size(); }
363 
365  size_t count(const NamePair& type) const;
366 
368  size_t memUsage() const;
369 
372  size_t find(const std::string& name) const;
373 
375  size_t rename(const std::string& fromName, const std::string& toName);
376 
378  const Name& valueType(size_t pos) const;
380  const NamePair& type(size_t pos) const;
381 
383  MetaMap& getMetadata();
384  const MetaMap& getMetadata() const;
385 
387  bool hasDefaultValue(const Name& name) const;
389  template<typename ValueType>
390  ValueType getDefaultValue(const Name& name) const
391  {
392  const size_t pos = find(name);
393  if (pos == INVALID_POS) {
394  OPENVDB_THROW(LookupError, "Cannot find attribute name to set default value.")
395  }
396 
397  std::stringstream ss;
398  ss << "default:" << name;
399 
400  auto metadata = mMetadata.getMetadata<TypedMetadata<ValueType>>(ss.str());
401 
402  if (metadata) return metadata->value();
403 
404  return zeroVal<ValueType>();
405  }
407  void setDefaultValue(const Name& name, const Metadata& defaultValue);
408  // Remove the default value if it exists
409  void removeDefaultValue(const Name& name);
410  // Prune any default values for which the key is no longer present
411  void pruneUnusedDefaultValues();
412 
414  bool operator==(const Descriptor&) const;
416  bool operator!=(const Descriptor& rhs) const { return !this->operator==(rhs); }
419  bool hasSameAttributes(const Descriptor& rhs) const;
420 
422  const NameToPosMap& map() const { return mNameMap; }
424  const NameToPosMap& groupMap() const { return mGroupMap; }
425 
427  bool hasGroup(const Name& group) const;
432  void setGroup(const Name& group, const size_t offset,
433  const bool checkValidOffset = false);
435  void dropGroup(const Name& group);
437  void clearGroups();
439  size_t renameGroup(const std::string& fromName, const std::string& toName);
441  const Name uniqueGroupName(const Name& name) const;
442 
444  size_t groupOffset(const Name& groupName) const;
451  size_t groupOffset(const GroupIndex& index) const;
453 
455  GroupIndex groupIndex(const Name& groupName) const;
458  GroupIndex groupIndex(const size_t offset) const;
459 
461  static size_t groupBits() { return sizeof(GroupType) * CHAR_BIT; }
462 
465  size_t availableGroups() const;
466 
469  size_t unusedGroups() const;
470 
472  bool canCompactGroups() const;
473 
477  size_t unusedGroupOffset(size_t hint = std::numeric_limits<size_t>::max()) const;
478 
480  size_t nextUnusedGroupOffset() const;
481 
488  bool requiresGroupMove(Name& sourceName, size_t& sourceOffset, size_t& targetOffset) const;
489 
494  bool groupIndexCollision(const Descriptor& rhs) const;
495 
497  const Name uniqueName(const Name& name) const;
498 
500  static bool validName(const Name& name);
501 
508  static void parseNames( std::vector<std::string>& includeNames,
509  std::vector<std::string>& excludeNames,
510  bool& includeAll,
511  const std::string& nameStr);
512 
515  static void parseNames( std::vector<std::string>& includeNames,
516  std::vector<std::string>& excludeNames,
517  const std::string& nameStr);
518 
520  void write(std::ostream&) const;
522  void read(std::istream&);
523 
524 protected:
526  void appendTo(NameAndTypeVec& attrs) const;
527 
530  static Ptr create(const NameAndTypeVec&, const NameToPosMap&, const MetaMap&);
531 
532  size_t insert(const std::string& name, const NamePair& typeName);
533 
534 private:
535  friend class ::TestAttributeSet;
536 
537  NameToPosMap mNameMap;
538  std::vector<NamePair> mTypes;
539  NameToPosMap mGroupMap;
540  MetaMap mMetadata;
541  // as this change is part of an ABI change, there's no good reason to reduce the reserved
542  // space aside from keeping the memory size of an AttributeSet the same for convenience
543  // (note that this assumes a typical three-pointer implementation for std::vector)
544  future::Container mFutureContainer; // occupies 3 reserved slots
545  int64_t mReserved[5]; // for future use
546 }; // class Descriptor
547 
548 } // namespace points
549 } // namespace OPENVDB_VERSION_NAME
550 } // namespace openvdb
551 
552 #endif // OPENVDB_POINTS_ATTRIBUTE_ARRAY_HAS_BEEN_INCLUDED
Base class for storing metadata information in a grid.
Definition: Metadata.h:23
#define OPENVDB_API
Helper macros for defining library symbol visibility.
Definition: Platform.h:221
std::unique_ptr< AttributeSet > UniquePtr
Definition: AttributeSet.h:45
#define OPENVDB_THROW(exception, message)
Definition: openvdb/Exceptions.h:82
void setGroup(PointDataTree &tree, const PointIndexTree &indexTree, const std::vector< short > &membership, const Name &group, const bool remove=false)
Sets group membership from a PointIndexTree-ordered vector.
Definition: PointGroup.h:546
std::shared_ptr< Descriptor > DescriptorPtr
Definition: AttributeSet.h:49
void dropAttributes(PointDataTreeT &tree, const std::vector< size_t > &indices)
Drops attributes from the VDB tree.
Definition: PointAttribute.h:377
const NameToPosMap & map() const
Return a reference to the name-to-position map.
Definition: AttributeSet.h:422
void renameAttributes(PointDataTreeT &tree, const std::vector< Name > &oldNames, const std::vector< Name > &newNames)
Rename attributes in a VDB tree.
Definition: PointAttribute.h:465
std::shared_ptr< AttributeArray > Ptr
Definition: AttributeArray.h:125
bool operator!=(const AttributeSet &other) const
Definition: AttributeSet.h:288
Attribute Array storage templated on type and compression codec.
std::map< std::string, size_t > NameToPosMap
Definition: AttributeSet.h:66
Inserter & add(const NameAndType &nameAndType)
Definition: AttributeSet.h:331
Container that maps names (strings) to values of arbitrary types.
Definition: MetaMap.h:19
NamePair type
Definition: AttributeSet.h:61
Definition: AttributeSet.h:54
size_t size() const
Return the number of attributes in this set.
Definition: AttributeSet.h:111
Definition: AttributeSet.h:302
DescriptorPtr descriptorPtr() const
Return a pointer to this attribute set&#39;s descriptor, which might be shared with other sets...
Definition: AttributeSet.h:108
Base class for storing attribute data.
Definition: AttributeArray.h:92
void appendAttribute(PointDataTreeT &tree, const Name &name, const NamePair &type, const Index strideOrTotalSize=1, const bool constantStride=true, const Metadata *defaultValue=nullptr, const bool hidden=false, const bool transient=false)
Appends a new attribute to the VDB tree (this method does not require a templated AttributeType) ...
Definition: PointAttribute.h:242
const std::enable_if<!VecTraits< T >::IsVec, T >::type & max(const T &a, const T &b)
Definition: Composite.h:107
uint8_t GroupType
Definition: AttributeSet.h:31
NameAndType(const std::string &n, const NamePair &t, const Index s=1)
Definition: AttributeSet.h:58
Inserter & add(const NameAndTypeVec &other)
Definition: AttributeSet.h:337
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition: version.h:94
bool operator!=(const Descriptor &rhs) const
Return true if this descriptor is not equal to the given one.
Definition: AttributeSet.h:416
static size_t groupBits()
Return number of bits occupied by a group attribute array.
Definition: AttributeSet.h:461
T & value()
Return this metadata&#39;s value.
Definition: Metadata.h:249
std::vector< NameAndType > NameAndTypeVec
Definition: AttributeSet.h:65
void replace(std::string &str, const std::string &oldStr, const std::string &newStr)
Definition: util.h:61
NameToPosMap::const_iterator ConstIterator
Definition: AttributeSet.h:326
bool operator==(const Vec3< T0 > &v0, const Vec3< T1 > &v1)
Equality operator, does exact floating point comparisons.
Definition: Vec3.h:471
Definition: openvdb/Exceptions.h:13
Templated metadata class to hold specific types.
Definition: Metadata.h:121
Util::GroupIndex GroupIndex
Definition: AttributeSet.h:324
Inserter & add(const Name &name, const NamePair &type)
Definition: AttributeSet.h:334
const NameToPosMap & groupMap() const
Return a reference to the name-to-position group map.
Definition: AttributeSet.h:424
Library and file format version numbers.
std::pair< Name, Name > NamePair
Definition: AttributeArray.h:39
std::string Name
Definition: Name.h:17
std::pair< size_t, uint8_t > GroupIndex
Definition: AttributeSet.h:67
std::shared_ptr< AttributeSet > Ptr
Definition: AttributeSet.h:43
ValueType getDefaultValue(const Name &name) const
Get a default value for an existing attribute.
Definition: AttributeSet.h:390
Definition: openvdb/Exceptions.h:60
const Descriptor & descriptor() const
Return a reference to this attribute set&#39;s descriptor, which might be shared with other sets...
Definition: AttributeSet.h:103
void dropGroup(PointDataTree &tree, const Name &group, const bool compact=true)
Drops an existing group from the VDB tree.
Definition: PointGroup.h:404
NameAndTypeVec vec
Definition: AttributeSet.h:330
Util::NameToPosMap NameToPosMap
Definition: AttributeSet.h:325
std::shared_ptr< const AttributeSet > ConstPtr
Definition: AttributeSet.h:44
Utility method to construct a NameAndType sequence.
Definition: AttributeSet.h:329
Attribute and type name pair.
Definition: AttributeSet.h:57
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:146
Util::NameAndTypeVec NameAndTypeVec
Definition: AttributeSet.h:323
SharedPtr< Metadata > Ptr
Definition: Metadata.h:26
Index32 Index
Definition: openvdb/Types.h:32
Index OPENVDB_DEPRECATED
Definition: AttributeArrayString.h:33
std::shared_ptr< const Descriptor > DescriptorConstPtr
Definition: AttributeSet.h:50
Ordered collection of uniquely-named attribute arrays.
Definition: AttributeSet.h:38