11 #ifndef OPENVDB_TREE_NODEUNION_HAS_BEEN_INCLUDED
12 #define OPENVDB_TREE_NODEUNION_HAS_BEEN_INCLUDED
17 #include <type_traits>
24 #if OPENVDB_ABI_VERSION_NUMBER >= 8
32 template<
typename ValueT,
typename ChildT,
typename Enable =
void>
43 void setChild(ChildT* child) { mChild = child; }
45 const ValueT&
getValue()
const {
return mValue; }
47 void setValue(
const ValueT& val) { mValue = val; }
54 !std::is_same<ValueT, math::Coord>::value &&
55 !std::is_arithmetic<ValueT>::value,
56 "Unexpected instantiation of NodeUnion");
61 template<
typename ValueT,
typename ChildT>
63 typename
std::enable_if<std::is_trivially_copyable<ValueT>::value>::type>
66 union { ChildT* mChild; ValueT
mValue; };
72 void setChild(ChildT* child) { mChild = child; }
74 const ValueT&
getValue()
const {
return mValue; }
76 void setValue(
const ValueT& val) { mValue = val; }
82 template<
typename T>
struct CopyTraits;
87 template<
typename ValueT,
typename ChildT,
typename Enable =
void>
95 NodeUnion(): mChild(nullptr), mValue() {}
97 ChildT* getChild()
const {
return mChild; }
98 void setChild(ChildT* child) { mChild = child; }
100 const ValueT& getValue()
const {
return mValue; }
101 ValueT& getValue() {
return mValue; }
102 void setValue(
const ValueT& val) { mValue = val; }
107 template<
typename ValueT,
typename ChildT>
108 class NodeUnion<ValueT, ChildT, typename
std::enable_if<std::is_pod<ValueT>::value>::type>
111 union { ChildT* mChild; ValueT mValue; };
114 NodeUnion(): mChild(nullptr) {}
116 ChildT* getChild()
const {
return mChild; }
117 void setChild(ChildT* child) { mChild = child; }
119 const ValueT& getValue()
const {
return mValue; }
120 ValueT& getValue() {
return mValue; }
121 void setValue(
const ValueT& val) { mValue = val; }
127 template<
typename ValueT,
typename ChildT>
128 class NodeUnion<ValueT, ChildT, typename
std::enable_if<CopyTraits<ValueT>::IsCopyable>::type>
131 union { ChildT* mChild; ValueT mValue; };
134 NodeUnion(): mChild(nullptr) {}
135 NodeUnion(
const NodeUnion& other): mChild(nullptr)
136 { std::memcpy(
static_cast<void*
>(
this), &other,
sizeof(*
this)); }
137 NodeUnion& operator=(
const NodeUnion& rhs)
138 { std::memcpy(
static_cast<void*
>(
this), &rhs,
sizeof(*
this));
return *
this; }
140 ChildT* getChild()
const {
return mChild; }
141 void setChild(ChildT* child) { mChild = child; }
143 const ValueT& getValue()
const {
return mValue; }
144 ValueT& getValue() {
return mValue; }
145 void setValue(
const ValueT& val) { mValue = val; }
155 template<
typename T>
struct CopyTraits {
static const bool IsCopyable =
false; };
156 template<
typename T>
struct CopyTraits<math::Vec2<T>> {
static const bool IsCopyable =
true; };
157 template<
typename T>
struct CopyTraits<math::Vec3<T>> {
static const bool IsCopyable =
true; };
158 template<
typename T>
struct CopyTraits<math::Vec4<T>> {
static const bool IsCopyable =
true; };
159 template<>
struct CopyTraits<math::Coord> {
static const bool IsCopyable =
true; };
170 #endif // OPENVDB_TREE_NODEUNION_HAS_BEEN_INCLUDED