26 #ifndef CASADI_OUTPUT_SX_HPP
27 #define CASADI_OUTPUT_SX_HPP
29 #include "sx_node.hpp"
30 #include "generic_shared_internal.hpp"
31 #include "generic_shared.hpp"
38 class CASADI_EXPORT SharedSXElem :
39 public GenericShared<SharedSXElem, OutputSX> {
42 static bool test_cast(
const OutputSX* ptr) {
46 using internal_base_type = OutputSX;
47 using base_type = SharedSXElem;
51 class CASADI_EXPORT WeakRefSXElem :
52 public GenericWeakRef<SharedSXElem, OutputSX> {
54 WeakRefSXElem(
int dummy=0) : GenericWeakRef<SharedSXElem, OutputSX>(dummy) {
56 WeakRefSXElem(SharedSXElem shared) : GenericWeakRef<SharedSXElem, OutputSX>(shared) {
60 typedef GenericWeakRefInternal<SharedSXElem, OutputSX> WeakRefInternalSXElem;
62 class CASADI_EXPORT OutputSX :
64 public GenericSharedInternal<SharedSXElem, OutputSX> {
65 friend class GenericShared<SharedSXElem, OutputSX>;
66 friend class SharedObject;
67 friend class GenericWeakRef<SharedSXElem, OutputSX>;
68 friend class GenericSharedInternal<SharedSXElem, OutputSX>;
70 friend class UniversalNodeOwner;
73 using weak_ref_type = WeakRefInternalSXElem;
78 OutputSX(
const SXElem& dep,
int oind) : dep_(dep), oind_(oind) {
87 std::string class_name()
const override {
return "OutputSX";}
92 std::string print(
const std::string& arg1,
const std::string& arg2)
const override {
93 return arg1 +
"{" + str(oind_) +
"}";
99 ~OutputSX()
override {
100 safe_delete(dep_.assignNoDelete(casadi_limits<SXElem>::nan));
106 casadi_int op()
const override {
return -1;}
111 casadi_int n_dep()
const override {
return 1;}
116 const SXElem& dep(casadi_int i)
const override {
return dep_; }
117 SXElem& dep(casadi_int i)
override {
return dep_; }
132 bool is_output()
const override {
return true; }
137 casadi_int which_output()
const override {
return oind_; }
139 static std::vector<SXElem> split(
const SXElem& e, casadi_int n) {
140 std::vector<SXElem> ret(n);
141 for (casadi_int i=0;i<n;++i) {
142 ret[i] = e.get_output(i);
147 void serialize_node(SerializingStream& s)
const override {
148 s.pack(
"OutputSX::dep", dep_);
149 s.pack(
"OutputSX::oind", oind_);
152 static SXNode* deserialize(DeserializingStream& s) {
155 s.unpack(
"OutputSX::dep", dep);
156 s.unpack(
"OutputSX::oind", oind);
157 return new OutputSX(dep, oind);