21#include <vsg/core/Version.h>
22#include <vsg/core/ref_ptr.h>
23#include <vsg/core/type_name.h>
39 constexpr bool has_read_write() {
return false; }
54 explicit operator bool()
const noexcept {
return duplicate.valid(); }
59 class VSG_DECLSPEC Object
64 Object(
const Object&
object,
const CopyOp& copyop = {});
65 Object& operator=(
const Object&);
78 static void*
operator new(std::size_t count);
79 static void operator delete(
void* ptr);
81 virtual std::size_t sizeofObject() const noexcept {
return sizeof(Object); }
82 virtual const char* className() const noexcept {
return type_name<Object>(); }
85 virtual const std::type_info&
type_info() const noexcept {
return typeid(Object); }
86 virtual bool is_compatible(
const std::type_info& type)
const noexcept {
return typeid(
Object) == type; }
88#if VSG_USE_dynamic_cast
90 T* cast() {
return dynamic_cast<T*
>(
this); }
93 const T* cast()
const {
return dynamic_cast<const T*
>(
this); }
96 T* cast() {
return is_compatible(
typeid(T)) ?
static_cast<T*
>(
this) : nullptr; }
99 const T* cast()
const {
return is_compatible(
typeid(T)) ?
static_cast<const T*
>(
this) : nullptr; }
109 virtual void accept(
Visitor& visitor);
110 virtual void traverse(
Visitor&) {}
115 virtual void accept(RecordTraversal& visitor)
const;
116 virtual void traverse(RecordTraversal&)
const {}
118 virtual void read(Input& input);
119 virtual void write(Output& output)
const;
122 inline void ref() const noexcept { _referenceCount.fetch_add(1, std::memory_order_relaxed); }
123 inline void unref() const noexcept
125 if (_referenceCount.fetch_sub(1, std::memory_order_seq_cst) <= 1) _attemptDelete();
127 inline void unref_nodelete() const noexcept { _referenceCount.fetch_sub(1, std::memory_order_seq_cst); }
128 inline unsigned int referenceCount() const noexcept {
return _referenceCount.load(); }
133 void setValue(
const std::string& key,
const T& value);
136 void setValue(
const std::string& key,
const char* value) {
setValue(key, value ? std::string(value) : std::string()); }
140 bool getValue(
const std::string& key, T& value)
const;
177 Auxiliary* getOrCreateAuxiliary();
178 Auxiliary* getAuxiliary() {
return _auxiliary; }
179 const Auxiliary* getAuxiliary()
const {
return _auxiliary; }
184 virtual void _attemptDelete()
const;
185 void setAuxiliary(Auxiliary* auxiliary);
188 friend class Auxiliary;
190 mutable std::atomic_uint _referenceCount;
192 Auxiliary* _auxiliary;
195 template<
class T,
class R>
198 return object ?
object->template cast<T>() : nullptr;
201 template<
class T,
class R>
204 return object ?
object->template cast<T>() : nullptr;
208 constexpr bool has_read_write<Object>() {
return true; }
210 using RefObjectPath = std::vector<ref_ptr<Object>>;
211 using ObjectPath = std::vector<Object*>;
216 using DuplicateMap = std::map<const Object*, ref_ptr<Object>>;
217 using iterator = DuplicateMap::iterator;
218 using key_type = DuplicateMap::key_type;
219 using mapped_type = DuplicateMap::mapped_type;
221 DuplicateMap duplicates;
223 inline iterator find(
const key_type& key) {
return duplicates.find(key); }
224 inline iterator begin() {
return duplicates.begin(); }
225 inline iterator end() {
return duplicates.end(); }
226 std::size_t size()
const {
return duplicates.size(); }
227 inline mapped_type& operator[](
const Object*
object) {
return duplicates[object]; }
229 bool contains(
const Object*
object)
const {
return duplicates.count(
object) != 0; }
230 void insert(
const Object* first,
ref_ptr<Object> second = {}) { duplicates[first] = second; }
231 void clear() { duplicates.clear(); }
235 for (
auto itr = duplicates.begin(); itr != duplicates.end(); ++itr)
245 if (ptr && duplicate)
247 if (
auto itr = duplicate->find(ptr); itr != duplicate->end())
249 if (!itr->second) itr->second = ptr->clone(*
this);
250 if (itr->second)
return itr->second.template cast<T>();
259 if (!duplicate)
return src;
262 dest.reserve(src.size());
263 for (
auto& ptr : src)
265 dest.push_back(
operator()(ptr));
273 if (!
object)
return {};
274 auto new_object =
object->clone();
275 return new_object.template cast<T>();
281 if (!
object)
return {};
282 auto new_object =
object->clone();
283 return new_object.template cast<T>();
Definition Auxiliary.h:26
Definition ConstVisitor.h:179
ref_ptr< T > operator()(ref_ptr< T > ptr) const
copy/clone pointer
Definition Object.h:243
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:157
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:171
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...
void setValue(const std::string &key, const char *value)
specialization of setValue to handle passing C strings
Definition Object.h:136
Object * getObject(const std::string &key)
get Object pointer associated with key, return nullptr if no object associated with key has been assi...
virtual ref_ptr< Object > clone(const CopyOp ©op={}) const
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:167
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,...
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...
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:153
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...
void removeObject(const std::string &key)
remove meta object or value associated with key
virtual const std::type_info & type_info() const noexcept
return the std::type_info of this Object
Definition Object.h:85
RecordTraversal traverses a scene graph doing view frustum culling and invoking state/commands to rec...
Definition RecordTraversal.h:74