38 #ifndef OPENVDB_TREE_NODEUNION_HAS_BEEN_INCLUDED 39 #define OPENVDB_TREE_NODEUNION_HAS_BEEN_INCLUDED 43 #include <type_traits> 50 #if OPENVDB_ABI_VERSION_NUMBER >= 4 58 template<
typename ValueT,
typename ChildT,
typename Enable =
void>
69 void setChild(ChildT* child) { mChild = child; }
71 const ValueT&
getValue()
const {
return mValue; }
73 void setValue(
const ValueT& val) { mValue = val; }
78 template<
typename ValueT,
typename ChildT>
79 class NodeUnion<ValueT, ChildT, typename std::enable_if<std::is_pod<ValueT>::value>::type>
82 union { ChildT* mChild; ValueT
mValue; };
88 void setChild(ChildT* child) { mChild = child; }
90 const ValueT&
getValue()
const {
return mValue; }
92 void setValue(
const ValueT& val) { mValue = val; }
98 template<
typename ValueT,
typename ChildT>
99 class NodeUnion<ValueT, ChildT, typename std::enable_if<CopyTraits<ValueT>::IsCopyable>::type>
102 union { ChildT* mChild; ValueT
mValue; };
107 { std::memcpy(
this, &other,
sizeof(*
this)); }
109 { std::memcpy(
this, &rhs,
sizeof(*
this));
return *
this; }
126 template<
typename T>
struct CopyTraits {
static const bool IsCopyable =
false; };
127 template<
typename T>
struct CopyTraits<math::
Vec2<T>> {
static const bool IsCopyable =
true; };
128 template<
typename T>
struct CopyTraits<math::
Vec3<T>> {
static const bool IsCopyable =
true; };
129 template<
typename T>
struct CopyTraits<math::
Vec4<T>> {
static const bool IsCopyable =
true; };
136 #else // OPENVDB_ABI_VERSION_NUMBER <= 3 142 template<
bool ValueIsClass,
class ValueT,
class ChildT>
class NodeUnionImpl;
147 template<
typename ValueT,
typename ChildT>
148 class NodeUnionImpl<false, ValueT, ChildT>
151 union { ChildT* child; ValueT value; } mUnion;
154 NodeUnionImpl() { mUnion.child =
nullptr; }
156 ChildT* getChild()
const {
return mUnion.child; }
157 void setChild(ChildT* child) { mUnion.child = child; }
159 const ValueT& getValue()
const {
return mUnion.value; }
160 ValueT& getValue() {
return mUnion.value; }
161 void setValue(
const ValueT& val) { mUnion.value = val; }
167 template<
typename ValueT,
typename ChildT>
168 class NodeUnionImpl<true, ValueT, ChildT>
171 union { ChildT* child; ValueT* value; } mUnion;
175 NodeUnionImpl() : mHasChild(
true) { this->setChild(
nullptr); }
176 NodeUnionImpl(
const NodeUnionImpl& other) : mHasChild(
true)
178 if (other.mHasChild) {
179 this->setChild(other.getChild());
181 this->setValue(other.getValue());
184 NodeUnionImpl& operator=(
const NodeUnionImpl& other)
186 if (other.mHasChild) {
187 this->setChild(other.getChild());
189 this->setValue(other.getValue());
193 ~NodeUnionImpl() { this->setChild(
nullptr); }
195 ChildT* getChild()
const {
return mHasChild ? mUnion.child :
nullptr; }
196 void setChild(ChildT* child)
198 if (!mHasChild)
delete mUnion.value;
199 mUnion.child = child;
203 const ValueT& getValue()
const {
return *mUnion.value; }
204 ValueT& getValue() {
return *mUnion.value; }
205 void setValue(
const ValueT& val)
207 if (!mHasChild)
delete mUnion.value;
208 mUnion.value =
new ValueT(val);
214 template<
typename ValueT,
typename ChildT>
215 struct NodeUnion:
public NodeUnionImpl<std::is_class<ValueT>::value, ValueT, ChildT>
226 #endif // OPENVDB_TREE_NODEUNION_HAS_BEEN_INCLUDED const ValueT & getValue() const
Definition: NodeUnion.h:114
NodeUnion()
Definition: NodeUnion.h:105
void setChild(ChildT *child)
Definition: NodeUnion.h:69
void setChild(ChildT *child)
Definition: NodeUnion.h:88
Signed (x, y, z) 32-bit integer coordinates.
Definition: Coord.h:51
NodeUnion()
Definition: NodeUnion.h:66
ChildT * getChild() const
Definition: NodeUnion.h:87
const ValueT & getValue() const
Definition: NodeUnion.h:71
void setValue(const ValueT &val)
Definition: NodeUnion.h:73
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition: version.h:136
const ValueT & getValue() const
Definition: NodeUnion.h:90
Definition: NodeUnion.h:53
ValueT & getValue()
Definition: NodeUnion.h:91
void setValue(const ValueT &val)
Definition: NodeUnion.h:92
ValueT & getValue()
Definition: NodeUnion.h:72
Definition: Exceptions.h:39
void setChild(ChildT *child)
Definition: NodeUnion.h:112
ValueT & getValue()
Definition: NodeUnion.h:115
ChildT * getChild() const
Definition: NodeUnion.h:68
Library and file format version numbers.
ChildT * getChild() const
Definition: NodeUnion.h:111
ValueT mValue
Definition: NodeUnion.h:82
ValueT mValue
Definition: NodeUnion.h:102
Definition: NodeUnion.h:59
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:188
NodeUnion(const NodeUnion &other)
Definition: NodeUnion.h:106
void setValue(const ValueT &val)
Definition: NodeUnion.h:116
NodeUnion & operator=(const NodeUnion &rhs)
Definition: NodeUnion.h:108
NodeUnion()
Definition: NodeUnion.h:85