26 #ifndef CASADI_GENERIC_SHARED_INTERNAL_HPP
27 #define CASADI_GENERIC_SHARED_INTERNAL_HPP
29 #include "generic_shared.hpp"
30 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
34 #ifdef CASADI_WITH_THREAD
42 template<
typename Shared,
typename Internal>
72 casadi_assert_dev(
static_cast<Internal*
>(
this)->count==0);
73 static_cast<Internal*
>(
this)->count++;
78 static_cast<Internal*
>(
this)->count--;
84 casadi_assert_dev(B::test_cast(
static_cast<Internal*
>(
this)));
86 ret.own(
static_cast<Internal*
>(
this));
93 casadi_assert_dev(B::test_cast(
static_cast<const Internal*
>(
this)));
95 ret.own(
const_cast<Internal*
>(
static_cast<const Internal*
>(
this)));
101 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
103 std::atomic<GenericWeakRef<Shared, Internal>*> weak_ref_;
109 template<
typename Shared,
typename Internal>
121 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
122 mutable std::shared_ptr<std::mutex> mutex_;
129 std::map<
typename A::base_type*,
130 typename A::internal_base_type> & already_copied) {
134 already_copied.find(
const_cast<typename A::base_type*
>(a.get()));
135 if (it!=already_copied.end()) {
136 ret.own(it->second.get());
145 template<
typename Shared,
typename Internal>
148 static_cast<Internal*
>(
this)->count = 0;
149 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
150 weak_ref_.store(
nullptr, std::memory_order_relaxed);
156 template<
typename Shared,
typename Internal>
164 template<
typename Shared,
typename Internal>
166 static_cast<Internal*
>(
this)->count = 0;
167 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
168 weak_ref_.store(
nullptr, std::memory_order_relaxed);
174 template<
typename Shared,
typename Internal>
177 return str( (casadi_int)(i)) +
"/" +
static_cast<const Internal*
>(
this)->class_name();
180 template<
typename Shared,
typename Internal>
182 #ifdef WITH_REFCOUNT_WARNINGS
183 if (
static_cast<Internal*
>(
this)->count!=0) {
185 std::cerr <<
"Reference counting failure." <<
186 "Possible cause: Circular dependency in user code." << std::endl;
189 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
191 weak_ref_.exchange(
nullptr, std::memory_order_acq_rel);
196 if (weak_ref !=
nullptr) {
204 template<
typename Shared,
typename Internal>
206 return static_cast<const Internal*
>(
this)->count;
209 template<
typename Shared,
typename Internal>
211 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
212 auto* w = weak_ref_.load(std::memory_order_acquire);
216 if (weak_ref_.compare_exchange_strong(
217 expected, nw, std::memory_order_release, std::memory_order_acquire)) {
226 if (weak_ref_==
nullptr) {
233 template<
typename Shared,
typename Internal>
236 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
237 , mutex_(
std::make_shared<
std::mutex>())
242 template<
typename Shared,
typename Internal>
const B shared_from_this() const
Get a shared object from the current internal object.
std::string debug_repr(const Internal *) const
casadi_int getCount() const
Get the reference count.
virtual ~GenericSharedInternal()=0
Destructor.
GenericSharedInternal()
Default constructor.
GenericSharedInternal(const GenericSharedInternal &node)
Copy constructor.
GenericSharedInternal & operator=(const GenericSharedInternal &node)
Assignment operator.
B shared_from_this()
Get a shared object from the current internal object.
GenericWeakRef< Shared, Internal > * weak()
Get a weak reference to the object.
~GenericWeakRefInternal() override
GenericWeakRefInternal(Internal *raw)
A getcopy(const A &a, std::map< typename A::base_type *, typename A::internal_base_type > &already_copied)
std::string str(const T &v)
String representation, any type.