List of all members | Public Member Functions | Protected Member Functions | Friends
casadi::GenericShared< Shared, Internal > Class Template Reference

#include <generic_shared.hpp>

Detailed Description

template<typename Shared, typename Internal>
class casadi::GenericShared< Shared, Internal >

Definition at line 60 of file generic_shared.hpp.

Inheritance diagram for casadi::GenericShared< Shared, Internal >:
Inheritance graph
[legend]

Public Member Functions

 GenericShared ()
 Default constructor. More...
 
 GenericShared (const GenericShared &ref)
 Copy constructor (shallow copy) More...
 
 ~GenericShared ()
 Destructor. More...
 
GenericSharedoperator= (const GenericShared &ref)
 Assignment operator. More...
 
void own (Internal *node)
 
void assign (Internal *node)
 Assign the node to a node class pointer without reference counting. More...
 
Internal * get () const
 Get a const pointer to the node. More...
 
casadi_int getCount () const
 Get the reference count. More...
 
void swap (GenericShared &other)
 Swap content with another instance. More...
 
Internal * operator-> () const
 Access a member function or object. More...
 
std::string debug_repr () const
 
bool is_null () const
 Is a null pointer? More...
 
casadi_int __hash__ () const
 Returns a number that is unique for a given Node. More...
 
GenericWeakRef< Shared, Internal > * weak ()
 Get a weak reference to the object. More...
 

Protected Member Functions

void count_up ()
 
void count_down ()
 

Friends

template<class B , class S >
shared_cast (S &A)
 Typecast a shared object to a base class to a shared object to a derived class,. More...
 
template<class B , class S >
const B shared_cast (const S &A)
 Typecast a shared object to a base class to a shared object to a derived class,. More...
 

Constructor & Destructor Documentation

◆ GenericShared() [1/2]

template<typename Shared , typename Internal >
casadi::GenericShared< Shared, Internal >::GenericShared ( )
inline

Definition at line 69 of file generic_shared.hpp.

69  {
70  node = nullptr;
71  }

◆ GenericShared() [2/2]

template<typename Shared , typename Internal >
casadi::GenericShared< Shared, Internal >::GenericShared ( const GenericShared< Shared, Internal > &  ref)
inline

Definition at line 74 of file generic_shared.hpp.

74  {
75  node = ref.node;
76  count_up();
77  }

◆ ~GenericShared()

template<typename Shared , typename Internal >
casadi::GenericShared< Shared, Internal >::~GenericShared ( )
inline

Definition at line 80 of file generic_shared.hpp.

80  {
81  count_down();
82  }

Member Function Documentation

◆ __hash__()

template<typename Shared , typename Internal >
casadi_int casadi::GenericShared< Shared, Internal >::__hash__

If the Object does not point to any node, "0" is returned.

Extra doc: https://github.com/casadi/casadi/wiki/L_av

Definition at line 148 of file generic_shared_impl.hpp.

148  {
149  return reinterpret_cast<casadi_int>(get());
150  }
Internal * get() const
Get a const pointer to the node.

◆ assign()

template<typename Shared , typename Internal >
void casadi::GenericShared< Shared, Internal >::assign ( Internal *  node)

improper use will cause memory leaks!

Extra doc: https://github.com/casadi/casadi/wiki/L_at

Definition at line 86 of file generic_shared_impl.hpp.

86  {
87  node = node_;
88  }

◆ count_down()

template<typename Shared , typename Internal >
void casadi::GenericShared< Shared, Internal >::count_down
protected

Definition at line 46 of file generic_shared_impl.hpp.

46  {
47 #ifdef WITH_EXTRA_CHECKS
48  casadi_assert_dev(Function::call_depth_==0);
49 #endif // WITH_EXTRA_CHECKS
50  if (!node) return;
51 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
52  GenericWeakRef<Shared, Internal>* weak_ref =
53  node->weak_ref_.load(std::memory_order_acquire);
54 #else
55  GenericWeakRef<Shared, Internal>* weak_ref = node->weak_ref_;
56 #endif // CASADI_WITH_THREADSAFE_SYMBOLICS
57  if (weak_ref) {
58 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
59  // get_mutex() returns a shared_ptr copy, so the mutex outlives this lock
60  // even if delete node (below) destroys the WeakRefInternal holding it
61  auto mutex = weak_ref->get_mutex();
62  // Avoid triggering a delete while a weak_ref.shared_if_alive is being called
63  std::lock_guard<std::mutex> lock(*mutex);
64 #endif // CASADI_WITH_THREADSAFE_SYMBOLICS
65 
66  if (--static_cast<Internal*>(node)->count == 0) {
67  delete node;
68  node = nullptr;
69  }
70  } else {
71  if (--static_cast<Internal*>(node)->count == 0) {
72  delete node;
73  node = nullptr;
74  }
75  }
76  }

◆ count_up()

template<typename Shared , typename Internal >
void casadi::GenericShared< Shared, Internal >::count_up
protected

Definition at line 36 of file generic_shared_impl.hpp.

36  {
37 #ifdef WITH_EXTRA_CHECKS
38  casadi_assert_dev(Function::call_depth_==0);
39 #endif // WITH_EXTRA_CHECKS
40 
41  if (node) static_cast<Internal*>(node)->count++;
42 
43  }

◆ debug_repr()

template<typename Shared , typename Internal >
std::string casadi::GenericShared< Shared, Internal >::debug_repr

Definition at line 91 of file generic_shared_impl.hpp.

91  {
92  if (node) {
93  return node->debug_repr(node);
94  } else {
95  return "NULL";
96  }
97  }

◆ get()

template<typename Shared , typename Internal >
Internal * casadi::GenericShared< Shared, Internal >::get

Definition at line 115 of file generic_shared_impl.hpp.

115  {
116  return node;
117  }

Referenced by casadi::CallSX::get_output().

◆ getCount()

template<typename Shared , typename Internal >
casadi_int casadi::GenericShared< Shared, Internal >::getCount

Definition at line 138 of file generic_shared_impl.hpp.

138  {
139  return (*this)->getCount();
140  }

Referenced by casadi::MXNode::~MXNode().

◆ is_null()

template<typename Shared , typename Internal >
bool casadi::GenericShared< Shared, Internal >::is_null

Definition at line 120 of file generic_shared_impl.hpp.

120  {
121  return node==nullptr;
122  }

Referenced by casadi::FunctionInternal::add_embedded(), casadi::FunctionInternal::alloc(), casadi::Nlpsol::callback(), casadi::FmuFunction::change_option(), casadi::DaeBuilderInternal::clear_cache(), casadi::Switch::codegen_body(), casadi::Conic::Conic(), casadi::conic_debug(), casadi::GraphBuilderInternal::create_function(), casadi::DaeBuilderInternal::export_fmu(), casadi::GraphBuilderInternal::export_onnx(), casadi::FunctionInternal::finalize(), casadi::Switch::find(), casadi::FunctionInternal::FunctionInternal(), casadi::FunctionInternal::get_n_in(), casadi::Switch::get_n_in(), casadi::FunctionInternal::get_n_out(), casadi::Switch::get_n_out(), casadi::FunctionInternal::get_name_in(), casadi::FunctionInternal::get_name_out(), casadi::FunctionInternal::get_partition(), casadi::FunctionInternal::get_sparsity_in(), casadi::Switch::get_sparsity_in(), casadi::FunctionInternal::get_sparsity_out(), casadi::Switch::get_sparsity_out(), casadi::MXFunction::get_stats(), casadi::GurobiInterface::handle_lazy_constraints_callback(), casadi::Integrator::init(), casadi::Nlpsol::init(), casadi::Rootfinder::init(), casadi::Switch::init(), casadi::GurobiInterface::init(), casadi::MosekInterface::init(), casadi::SLEQPInterface::init(), casadi::SnoptInterface::init(), casadi::SundialsInterface::init(), casadi::XpressInterface::init(), casadi::FastNewton::init(), casadi::Newton::init(), casadi::Scpgen::init(), casadi::GurobiInterface::init_mem(), casadi::BonminInterface::intermediate_callback(), casadi::IpoptInterface::intermediate_callback(), casadi::XFunction< DerivedType, MatType, NodeType >::jac(), casadi::FunctionInternal::jac_is_symm(), casadi::FunctionInternal::jac_sparsity(), casadi::OracleFunction::jit_dependencies(), casadi::SparsityInternal::maxtrans(), casadi::BlazingSplineFunction::merge(), casadi::MosekInterface::MosekInterface(), casadi::Function::operator==(), casadi::DaeBuilderInternal::oracle(), casadi::SLEQPInterface::set_work(), casadi::SnoptInterface::set_work(), casadi::OptiNode::solve(), casadi::GurobiInterface::solve(), casadi::KnitroInterface::solve(), casadi::SLEQPInterface::solve(), casadi::WorhpInterface::solve(), casadi::FunctionInternal::sp_forward_block(), casadi::FunctionInternal::sp_reverse(), casadi::Sparsity::uni_coloring(), and casadi::XpressInterface::XpressInterface().

◆ operator->()

template<typename Shared , typename Internal >
Internal * casadi::GenericShared< Shared, Internal >::operator->

Definition at line 125 of file generic_shared_impl.hpp.

125  {
126  casadi_assert_dev(!is_null());
127  return node;
128  }
bool is_null() const
Is a null pointer?

Referenced by casadi::GenericWeakRef< Shared, Internal >::operator->().

◆ operator=()

template<typename Shared , typename Internal >
GenericShared< Shared, Internal > & casadi::GenericShared< Shared, Internal >::operator= ( const GenericShared< Shared, Internal > &  ref)

Definition at line 101 of file generic_shared_impl.hpp.

101  {
102  // quick return if the old and new pointers point to the same object
103  if (node == ref.node) return *this;
104 
105  // decrease the counter and delete if this was the last pointer
106  count_down();
107 
108  // save the new pointer
109  node = ref.node;
110  count_up();
111  return *this;
112  }

◆ own()

template<typename Shared , typename Internal >
void casadi::GenericShared< Shared, Internal >::own ( Internal *  node)

◆ swap()

template<typename Shared , typename Internal >
void casadi::GenericShared< Shared, Internal >::swap ( GenericShared< Shared, Internal > &  other)

Definition at line 131 of file generic_shared_impl.hpp.

131  {
132  GenericShared<Shared, Internal> temp = *this;
133  *this = other;
134  other = temp;
135  }

◆ weak()

template<typename Shared , typename Internal >
GenericWeakRef< Shared, Internal > * casadi::GenericShared< Shared, Internal >::weak

Extra doc: https://github.com/casadi/casadi/wiki/L_aw

Definition at line 143 of file generic_shared_impl.hpp.

143  {
144  return (*this)->weak();
145  }

Friends And Related Function Documentation

◆ shared_cast [1/2]

template<typename Shared , typename Internal >
template<class B , class S >
const B shared_cast ( const S &  A)
friend

cf. dynamic_cast (const)

Extra doc: https://github.com/casadi/casadi/wiki/L_b7

Definition at line 230 of file generic_shared.hpp.

230  {
231  S A_copy = A;
232  return shared_cast<B, S>(A_copy);
233  }

◆ shared_cast [2/2]

template<typename Shared , typename Internal >
template<class B , class S >
B shared_cast ( S &  A)
friend

cf. dynamic_cast

Extra doc: https://github.com/casadi/casadi/wiki/L_b6

Get a pointer to the node

Create a return object

Quick return if not allowed

Assign node of B and return

Definition at line 208 of file generic_shared.hpp.

208  {
209 
211  typename S::internal_base_type* ptr = A.get();
212 
214  B ret;
215 
217  if (!B::test_cast(ptr)) return ret;
218 
220  ret.own(ptr);
221  return ret;
222  }

The documentation for this class was generated from the following files: