15#include <vsg/core/Data.h>
16#include <vsg/core/type_name.h>
18#include <vsg/maths/box.h>
19#include <vsg/maths/mat2.h>
20#include <vsg/maths/mat3.h>
21#include <vsg/maths/mat4.h>
22#include <vsg/maths/quat.h>
23#include <vsg/maths/sphere.h>
24#include <vsg/maths/vec2.h>
25#include <vsg/maths/vec3.h>
26#include <vsg/maths/vec4.h>
28#include <vsg/io/Input.h>
29#include <vsg/io/Output.h>
31#define VSG_value(N, T) \
34 constexpr const char* type_name<N>() noexcept { return "vsg::" #N; }
39 class VSG_TEMPLATE_DECLSPEC Value :
public Data
46 Value(
const Value& rhs,
const CopyOp& copyop = {}) :
47 Data(rhs, copyop), _value(rhs._value) {
dirty(); }
48 explicit Value(
const value_type& in_value) :
49 _value(in_value) {
dirty(); }
51 template<
typename... Args>
52 explicit Value(Args&&... args) :
53 _value(std::forward<Args>(args)...) {
dirty(); }
55 template<
typename... Args>
61 template<
typename... Args>
75 size_t sizeofObject() const noexcept
override {
return sizeof(Value); }
76 const char* className() const noexcept
override {
return type_name<Value>(); }
77 const std::type_info&
type_info() const noexcept
override {
return typeid(*this); }
78 bool is_compatible(
const std::type_info& type)
const noexcept override {
return typeid(
Value) == type || Data::is_compatible(type); }
81 void accept(Visitor& visitor)
override;
82 void accept(ConstVisitor& visitor)
const override;
84 void read(Input& input)
override
87 if (input.version_greater_equal(0, 6, 1))
88 input.read(
"value", _value);
90 input.read(
"Value", _value);
94 void write(Output& output)
const override
97 if (output.version_greater_equal(0, 6, 1))
98 output.write(
"value", _value);
100 output.write(
"Value", _value);
103 size_t valueSize()
const override
105 if constexpr (std::is_same_v<T, std::string>)
106 return _value.size();
108 return sizeof(value_type);
110 size_t valueCount()
const override {
return 1; }
112 bool dataAvailable()
const override {
return true; }
113 size_t dataSize()
const override {
return valueSize(); }
115 void* dataPointer()
override
117 if constexpr (std::is_same_v<T, std::string>)
118 return _value.data();
123 const void* dataPointer()
const override
125 if constexpr (std::is_same_v<T, std::string>)
126 return _value.data();
131 void* dataPointer(
size_t)
override {
return dataPointer(); }
132 const void* dataPointer(
size_t)
const override {
return dataPointer(); }
134 void* dataRelease()
override {
return nullptr; }
136 uint32_t dimensions()
const override {
return 0; }
138 uint32_t width()
const override {
return 1; }
139 uint32_t height()
const override {
return 1; }
140 uint32_t depth()
const override {
return 1; }
142 Value& operator=(
const Value& rhs)
150 Value& operator=(
const value_type& rhs)
156 operator value_type&() {
return _value; }
157 operator const value_type&()
const {
return _value; }
159 value_type& value() {
return _value; }
160 const value_type& value()
const {
return _value; }
162 void set(
const value_type& value) { _value = value; }
183 if (
object && (
typeid(*
object) ==
typeid(ValueT)))
185 const ValueT* vo =
static_cast<const ValueT*
>(
getObject(key));
198 template<
typename T,
typename... Args>
199 T value(T defaultValue,
const std::string& match, Args&&... args)
202 ((args && args->getValue(match, v)) || ...);
206 VSG_value(stringValue, std::string);
207 VSG_value(wstringValue, std::wstring);
208 VSG_value(pathValue, vsg::Path);
210 VSG_value(boolValue,
bool);
211 VSG_value(intValue,
int);
212 VSG_value(uintValue,
unsigned int);
213 VSG_value(floatValue,
float);
214 VSG_value(doubleValue,
double);
216 VSG_value(vec2Value, vec2);
217 VSG_value(vec3Value, vec3);
218 VSG_value(vec4Value, vec4);
220 VSG_value(dvec2Value, dvec2);
221 VSG_value(dvec3Value, dvec3);
222 VSG_value(dvec4Value, dvec4);
224 VSG_value(bvec2Value, bvec2);
225 VSG_value(bvec3Value, bvec3);
226 VSG_value(bvec4Value, bvec4);
228 VSG_value(ubvec2Value, ubvec2);
229 VSG_value(ubvec3Value, ubvec3);
230 VSG_value(ubvec4Value, ubvec4);
232 VSG_value(svec2Value, svec2);
233 VSG_value(svec3Value, svec3);
234 VSG_value(svec4Value, svec4);
236 VSG_value(usvec2Value, usvec2);
237 VSG_value(usvec3Value, usvec3);
238 VSG_value(usvec4Value, usvec4);
240 VSG_value(ivec2Value, ivec2);
241 VSG_value(ivec3Value, ivec3);
242 VSG_value(ivec4Value, ivec4);
244 VSG_value(uivec2Value, uivec2);
245 VSG_value(uivec3Value, uivec3);
246 VSG_value(uivec4Value, uivec4);
248 VSG_value(mat2Value, mat2);
249 VSG_value(dmat2Value, dmat2);
251 VSG_value(mat3Value, mat3);
252 VSG_value(dmat3Value, dmat3);
254 VSG_value(mat4Value, mat4);
255 VSG_value(dmat4Value, dmat4);
257 VSG_value(quatValue, quat);
258 VSG_value(dquatValue, dquat);
260 VSG_value(sphereValue, sphere);
261 VSG_value(dsphereValue, dsphere);
263 VSG_value(boxValue, box);
264 VSG_value(dboxValue, dbox);
void dirty()
increment the ModifiedCount to signify the data has been modified
Definition Data.h:203
void setObject(const std::string &key, ref_ptr< Object > object)
assign an Object associated with key
bool getValue(const std::string &key, T &value) const
get specified value type, return false if value associated with key is not assigned or is not the cor...
Definition Value.h:179
Object * getObject(const std::string &key)
get Object pointer associated with key, return nullptr if no object associated with key has been assi...
void setValue(const std::string &key, const T &value)
Definition Value.h:172
ref_ptr< Object > clone(const CopyOp ©op={}) const override
Definition Value.h:70
const std::type_info & type_info() const noexcept override
return the std::type_info of this Object
Definition Value.h:77