26 #ifndef CASADI_SHARED_OBJECT_INTERNAL_HPP
27 #define CASADI_SHARED_OBJECT_INTERNAL_HPP
29 #include "shared_object.hpp"
31 #ifdef CASADI_WITH_THREAD
39 class CASADI_EXPORT SharedObjectInternal {
40 friend class SharedObject;
42 friend class UniversalNodeOwner;
46 SharedObjectInternal();
49 SharedObjectInternal(
const SharedObjectInternal& node);
52 SharedObjectInternal& operator=(
const SharedObjectInternal& node);
55 virtual ~SharedObjectInternal() = 0;
58 casadi_int getCount()
const;
61 virtual std::string class_name()
const = 0;
64 virtual void disp(std::ostream& stream,
bool more)
const = 0;
73 void initSingleton() {
74 casadi_assert_dev(count==0);
79 void destroySingleton() {
89 const B shared_from_this()
const;
93 #ifdef CASADI_WITH_THREAD
94 std::atomic<casadi_int> count;
102 class CASADI_EXPORT WeakRefInternal :
public SharedObjectInternal {
105 WeakRefInternal(SharedObjectInternal* raw);
108 ~WeakRefInternal()
override;
111 std::string class_name()
const override {
return "WeakRefInternal";}
114 void disp(std::ostream& stream,
bool more)
const override;
117 SharedObjectInternal* raw_;
122 A getcopy(
const A& a, std::map<SharedObjectInternal*, SharedObject>& already_copied) {
125 std::map<SharedObjectInternal*, SharedObject>::iterator it =
126 already_copied.find(
const_cast<SharedObjectInternal*
>(a.get()));
127 if (it!=already_copied.end()) {
128 ret.own(it->second.get());
136 B SharedObjectInternal::shared_from_this() {
137 casadi_assert_dev(B::test_cast(
this));
144 const B SharedObjectInternal::shared_from_this()
const {
145 casadi_assert_dev(B::test_cast(
this));
147 ret.own(
const_cast<SharedObjectInternal*
>(
this));