20 #include <vsg/core/Export.h>
21 #include <vsg/core/ref_ptr.h>
22 #include <vsg/core/type_name.h>
31 class RecordTraversal;
37 constexpr
bool has_read_write() {
return false; }
60 static void*
operator new(std::size_t count);
61 static void operator delete(
void* ptr);
63 virtual std::size_t sizeofObject() const noexcept {
return sizeof(
Object); }
64 virtual const char* className() const noexcept {
return type_name<Object>(); }
67 virtual const std::type_info&
type_info() const noexcept {
return typeid(
Object); }
68 virtual bool is_compatible(
const std::type_info& type)
const noexcept {
return typeid(
Object) == type; }
71 T* cast() {
return is_compatible(
typeid(T)) ?
static_cast<T*
>(
this) :
nullptr; }
74 const T* cast()
const {
return is_compatible(
typeid(T)) ?
static_cast<const T*
>(
this) :
nullptr; }
79 virtual void accept(
Visitor& visitor);
80 virtual void traverse(
Visitor&) {}
85 virtual void accept(RecordTraversal& visitor)
const;
86 virtual void traverse(RecordTraversal&)
const {}
88 virtual void read(Input& input);
89 virtual void write(Output& output)
const;
92 inline void ref() const noexcept { _referenceCount.fetch_add(1, std::memory_order_relaxed); }
93 inline void unref() const noexcept
95 if (_referenceCount.fetch_sub(1, std::memory_order_seq_cst) <= 1) _attemptDelete();
97 inline void unref_nodelete() const noexcept { _referenceCount.fetch_sub(1, std::memory_order_seq_cst); }
98 inline unsigned int referenceCount() const noexcept {
return _referenceCount.load(); }
103 void setValue(
const std::string& key,
const T& value);
106 void setValue(
const std::string& key,
const char* value) {
setValue(key, value ? std::string(value) : std::string()); }
110 bool getValue(
const std::string& key, T& value)
const;
148 Auxiliary* getAuxiliary() {
return _auxiliary; }
149 const Auxiliary* getAuxiliary()
const {
return _auxiliary; }
154 virtual void _attemptDelete()
const;
155 void setAuxiliary(Auxiliary* auxiliary);
158 friend class Auxiliary;
160 mutable std::atomic_uint _referenceCount;
162 Auxiliary* _auxiliary;
165 template<
class T,
class R>
166 T* cast(
const ref_ptr<R>&
object)
168 return object ?
object->template cast<T>() : nullptr;
171 template<
class T,
class R>
174 return object ?
object->template cast<T>() : nullptr;
178 constexpr
bool has_read_write<Object>() {
return true; }
180 using RefObjectPath = std::vector<ref_ptr<Object>>;
181 using ObjectPath = std::vector<Object*>;
Definition: Auxiliary.h:26
Definition: ConstVisitor.h:147
void setObject(const std::string &key, ref_ptr< Object > object)
assign an Object associated with key
const T * getObject(const std::string &key) const
get const object pointer of specified type associated with key, return nullptr if no object associate...
Definition: Object.h:127
ref_ptr< const Object > getRefObject(const std::string &key) const
get ref_ptr<const Object> pointer associated with key, return nullptr if no object associated with ke...
const ref_ptr< const T > getRefObject(const std::string &key) const
get ref_ptr<const T> of specified type associated with key, return nullptr if no object associated wi...
Definition: Object.h:141
void setValue(const std::string &key, const char *value)
specialization of setValue to handle passing C strings
Definition: Object.h:106
ref_ptr< T > getRefObject(const std::string &key)
get ref_ptr<T> of specified type associated with key, return nullptr if no object associated with key...
Definition: Object.h:137
virtual const std::type_info & type_info() const noexcept
return the std::type_info of this Object
Definition: Object.h:67
ref_ptr< Object > getRefObject(const std::string &key)
get ref_ptr<Object> associated with key, return nullptr if no object associated with key has been ass...
T * getObject(const std::string &key)
get object pointer of specified type associated with key, return nullptr if no object associated with...
Definition: Object.h:123
virtual int compare(const Object &rhs) const
compare two objects, return -1 if this object is less than rhs, return 0 if it's equal,...
void removeObject(const std::string &key)
remove meta object or value associated with key
Object * getObject(const std::string &key)
get Object pointer associated with key, return nullptr if no object associated with key has been assi...
const Object * getObject(const std::string &key) const
get const Object pointer associated with key, return nullptr if no object associated with key has bee...
Definition: Visitor.h:147