8 #include <utility/dllexport.h>
9 #include <unordered_set>
10 #include <rtti/object.h>
14 #ifdef NAP_ENABLE_PYTHON
15 #include <pybind11/cast.h>
55 const rtti::Object* get()
const {
return mPtr; }
61 void set(rtti::Object* ptr)
64 mPtr->decrementObjectPtrRefCount();
69 mPtr->incrementObjectPtrRefCount();
108 template<
class OBJECTSBYIDMAP>
109 void patchPointers(OBJECTSBYIDMAP& newTargetObjects);
119 if (ptr->get() == &targetObject)
130 void add(
ObjectPtrBase& ptr) { mObjectPointers.insert(&ptr); }
135 void remove(
ObjectPtrBase& ptr) { mObjectPointers.erase(&ptr); }
137 ObjectPtrSet mObjectPointers;
181 T*
get()
const {
return static_cast<T*
>(mPtr); }
184 T*
get() {
return static_cast<T*
>(mPtr); }
189 template<
typename OTHER>
193 template<
typename OTHER>
197 template<
typename OTHER>
201 template<
typename OTHER>
206 const T&
operator*()
const { assert(mPtr !=
nullptr);
return *
static_cast<T*
>(mPtr); }
208 T&
operator*() { assert(mPtr !=
nullptr);
return *
static_cast<T*
>(mPtr); }
210 T*
operator->()
const { assert(mPtr !=
nullptr);
return static_cast<T*
>(mPtr); }
212 T*
operator->() { assert(mPtr !=
nullptr);
return static_cast<T*
>(mPtr); }
216 template<
typename OTHER>
219 template<
typename OTHER>
220 bool operator==(
const OTHER* ptr)
const {
return mPtr == ptr; }
222 bool operator==(std::nullptr_t)
const {
return mPtr ==
nullptr; }
226 template<
typename OTHER>
229 template<
typename OTHER>
230 bool operator!=(
const OTHER* ptr)
const {
return mPtr != ptr; }
232 bool operator!=(std::nullptr_t)
const {
return mPtr !=
nullptr; }
246 template<
typename OTHER>
252 template<
typename OTHER>
261 template<
class OBJECTSBYIDMAP>
267 if (target ==
nullptr)
270 std::string& target_id = target->
mID;
271 typename OBJECTSBYIDMAP::iterator new_target = newTargetObjects.find(target_id);
272 if (new_target != newTargetObjects.end())
273 ptr->set(&*(new_target->second));
283 mPtr->decrementObjectPtrRefCount();
293 ObjectPtrManager::get().add(*
this);
294 mPtr->incrementObjectPtrRefCount();
299 template<
typename OTHER>
303 if (other.mPtr !=
nullptr)
305 other.mPtr->decrementObjectPtrRefCount();
306 other.mPtr =
nullptr;
311 template<
typename OTHER>
314 if (mPtr ==
nullptr && other.mPtr !=
nullptr)
315 ObjectPtrManager::get().add(*
this);
317 if (other.mPtr != mPtr)
320 mPtr->decrementObjectPtrRefCount();
322 mPtr =
static_cast<T*
>(other.get());
325 mPtr->incrementObjectPtrRefCount();
329 ObjectPtrManager::get().remove(*
this);
342 struct wrapper_mapper<
nap::rtti::ObjectPtr<T>>
344 using wrapped_type = T*;
346 inline static wrapped_type get(
const type& obj) {
return obj.
get(); }
388 #ifdef NAP_ENABLE_PYTHON
393 template <
typename type>
394 struct always_construct_holder<
nap::rtti::ObjectPtr<type>> : always_construct_holder<void, true>
398 template <
typename type>
class type_caster<
nap::rtti::ObjectPtr<type>> :
public copyable_holder_caster<type, nap::rtti::ObjectPtr<type>>
403 const auto *ptr = src.
get();
405 auto st = copyable_holder_caster<type, nap::rtti::ObjectPtr<type>>::src_and_type(ptr);
407 return type_caster_generic::cast(
408 st.first, return_value_policy::reference, {}, st.second,
409 nullptr,
nullptr,
nullptr);
414 #endif // NAP_ENABLE_PYTHON
void patchPointers(OBJECTSBYIDMAP &newTargetObjects)
Definition: objectptr.h:262
std::string mID
Property: 'mID' unique name of the object. Used as an identifier by the system.
Definition: object.h:82
std::unordered_set< ObjectPtrBase * > ObjectPtrSet
Definition: objectptr.h:96
bool operator<=(const ObjectPtr< T > &other) const
Definition: objectptr.h:238
rttr::type getWrappedType() const
Definition: objectptr.h:36
const T & operator*() const
Definition: objectptr.h:206
bool operator==(std::nullptr_t) const
Definition: objectptr.h:222
T * operator->() const
Definition: objectptr.h:210
bool operator!=(const OTHER *ptr) const
Definition: objectptr.h:230
ObjectPtr(const ObjectPtr< T > &other)
Definition: objectptr.h:169
bool operator<(const ObjectPtr< T > &other) const
Definition: objectptr.h:234
Definition: objectptr.h:154
ObjectPtr< T > & operator=(const ObjectPtr< OTHER > &other)
Definition: objectptr.h:198
ObjectPtr< T > & operator=(ObjectPtr< OTHER > &&other)
Definition: objectptr.h:202
ObjectPtr< T > & operator=(const ObjectPtr< T > &other)
Definition: objectptr.h:175
bool operator==(const ObjectPtr< OTHER > &other) const
Definition: objectptr.h:217
ObjectPtr< T > & operator=(ObjectPtr< T > &&other)
Definition: objectptr.h:178
bool operator!=(const ObjectPtr< T > &other) const
Definition: objectptr.h:224
bool operator>(const ObjectPtr< T > &other) const
Definition: objectptr.h:236
bool operator!=(const ObjectPtr< OTHER > &other) const
Definition: objectptr.h:227
void resetPointers(const rtti::Object &targetObject)
Definition: objectptr.h:115
ObjectPtr(ObjectPtr< T > &&other)
Definition: objectptr.h:172
virtual ~ObjectPtr() override
Definition: objectptr.h:279
Definition: objectptr.h:93
T * operator->()
Definition: objectptr.h:212
T * get() const
Definition: objectptr.h:181
static ObjectPtrManager & get()
T & operator*()
Definition: objectptr.h:208
Definition: templateapp.h:17
bool operator==(const ObjectPtr< T > &other) const
Definition: objectptr.h:214
bool operator!=(std::nullptr_t) const
Definition: objectptr.h:232
T * get()
Definition: objectptr.h:184
bool operator==(const OTHER *ptr) const
Definition: objectptr.h:220
bool operator>=(const ObjectPtr< T > &other) const
Definition: objectptr.h:240
ObjectPtr(const ObjectPtr< OTHER > &other)
Definition: objectptr.h:190
ObjectPtr(ObjectPtr< OTHER > &&other)
Definition: objectptr.h:194
Definition: objectptr.h:27