26 #ifndef CASADI_SERIALIZING_STREAM_HPP
27 #define CASADI_SERIALIZING_STREAM_HPP
31 #include <unordered_map>
47 class SharedObjectInternal;
49 class SerializingStream;
60 void*
get() {
return node; }
65 typedef std::map<std::string, GenericType>
Dict;
102 void unpack(std::ostream& s);
103 void unpack(
Slice& e);
106 #if SIZE_MAX != UINT_MAX || defined(__EMSCRIPTEN__) || defined(__POWERPC__)
107 void unpack(
unsigned int& e);
109 void unpack(
bool& e);
110 void unpack(casadi_int& e);
111 void unpack(
size_t& e);
112 void unpack(std::string& e);
113 void unpack(
double& e);
114 void unpack(
char& e);
117 assert_decoration(
'V');
121 for (
T& i : e) unpack(i);
124 template <
class K,
class V>
126 assert_decoration(
'D');
130 for (casadi_int i=0;i<s;++i) {
139 template <
class A,
class B>
141 assert_decoration(
'p');
147 void unpack(
const std::string& descr, T& e) {
151 casadi_assert(d==descr,
"Mismatch: '" + descr +
"' expected, got '" + d +
"'.");
157 void version(
const std::string& name,
int v);
158 int version(
const std::string& name);
159 int version(
const std::string& name,
int min,
int max);
167 bool debug()
const {
return debug_; }
179 template <
class T,
class M>
180 void shared_unpack(T& e) {
182 unpack(
"Shared::flag", i);
185 e = T::deserialize(*
this);
186 if (shared_map_) (*shared_map_)[e.get()] = nodes_.size();
187 nodes_.emplace_back(e.get());
192 unpack(
"Shared::reference", k);
194 e = T::create(
static_cast<M*
>(t.
get()));
198 casadi_assert_dev(
false);
207 void assert_decoration(
char e);
210 std::vector<UniversalNodeOwner> nodes_;
211 std::unordered_map<void*, casadi_int>* shared_map_ =
nullptr;
217 bool set_up_ =
false;
239 void pack(
const MX& e);
240 void pack(
const SXElem& e);
241 void pack(
const Linsol& e);
249 void pack(
const Fmu& e);
250 void pack(
const Slice& e);
252 void pack(std::istream& s);
254 #if SIZE_MAX != UINT_MAX || defined(__EMSCRIPTEN__) || defined(__POWERPC__)
255 void pack(
unsigned int e);
258 void pack(casadi_int e);
261 void pack(
const std::string& e);
264 void pack(
const std::vector<T>& e) {
266 pack(
static_cast<casadi_int
>(e.size()));
267 for (
auto&& i : e) pack(i);
269 template <
class K,
class V>
270 void pack(
const std::map<K, V>& e) {
272 pack(
static_cast<casadi_int
>(e.size()));
273 for (
const auto & i : e) {
278 template <
class A,
class B>
279 void pack(
const std::pair<A, B>& e) {
285 void pack(
const std::string& descr,
const T& e) {
286 if (debug_) pack(descr);
290 void pack(
const std::string& descr, T& e) {
291 if (debug_) pack(descr);
296 void version(
const std::string& name,
int v);
307 void decorate(
char e);
315 void shared_pack(
const T& e) {
316 auto it = shared_map_.find(e.get());
317 if (it==shared_map_.end()) {
319 pack(
"Shared::flag",
'd');
321 casadi_int r = shared_map_.size();
322 shared_map_[e.get()] = r;
323 if (nodes_) nodes_->emplace_back(e.get());
325 pack(
"Shared::flag",
'r');
326 pack(
"Shared::reference", it->second);
331 std::unordered_map<void*, casadi_int> shared_map_;
332 std::vector<UniversalNodeOwner>* nodes_ =
nullptr;
Helper class for Serialization.
void unpack(Sparsity &e)
Reconstruct an object from the input stream.
DeserializingStream(const DeserializingStream &)=delete
void unpack(Matrix< T > &e)
void unpack(std::pair< A, B > &e)
void unpack(std::vector< T > &e)
void unpack(std::map< K, V > &e)
void unpack(const std::string &descr, T &e)
bool debug() const
Whether the stream was written in debug-decoration mode.
Generic data type, can hold different types such as bool, casadi_int, std::string etc.
Sparse matrix class. SX and DM are specializations.
void serialize(std::ostream &stream) const
Serialize an object.
static Matrix< Scalar > deserialize(std::istream &stream)
Build Sparsity from serialization.
RAII class for reading from a zip file.
The basic scalar symbolic class of CasADi.
Internal node class for SX.
Helper class for Serialization.
void pack(const std::string &descr, const T &e)
void pack(const std::map< K, V > &e)
void pack(const std::pair< A, B > &e)
void pack(const std::string &descr, T &e)
void pack(const std::vector< T > &e)
void pack(const Matrix< T > &e)
Class representing a Slice.
UniversalNodeOwner & operator=(const UniversalNodeOwner &other)=delete
UniversalNodeOwner()=delete
UniversalNodeOwner(const UniversalNodeOwner &)=delete
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.