AGX Dynamics 2.42.1.1
Loading...
Searching...
No Matches
InputArchive.h
Go to the documentation of this file.
1/*
2Copyright 2007-2025. Algoryx Simulation AB.
3
4All AGX source code, intellectual property, documentation, sample code,
5tutorials, scene files and technical white papers, are copyrighted, proprietary
6and confidential material of Algoryx Simulation AB. You may not download, read,
7store, distribute, publish, copy or otherwise disseminate, use or expose this
8material unless having a written signed agreement with Algoryx Simulation AB, or having been
9advised so by Algoryx Simulation AB for a time limited evaluation, or having purchased a
10valid commercial license from Algoryx Simulation AB.
11
12Algoryx Simulation AB disclaims all responsibilities for loss or damage caused
13from using this software, unless otherwise stated in written agreements with
14Algoryx Simulation AB.
15*/
16#pragma once
17
18#ifdef _MSC_VER
19# pragma warning(push)
20# pragma warning( disable : 4290 ) // C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
21#endif
22
23#include <agx/agx.h>
24#include <agx/agxCore_export.h>
25
26#include <agx/Vector.h>
27#include <agxStream/Archive.h>
28
29#include <agx/String.h>
30#include <agx/Name.h>
31#include <agx/Vec3.h>
32#include <agx/Vec2.h>
33#include <agx/Quat.h>
34#include <agx/Range.h>
35#include <agx/Matrix3x3.h>
36#include <agx/SPDMatrix3x3.h>
39#include <agx/Uuid.h>
40#include <sstream>
41
42namespace agxStream
43{
44 class Serializable;
45 class StorageAgent;
46
51 {
52
53 public:
56
57
61
62 public:
63 InputArchive(std::istream& inputStream);
64 InputArchive(std::istream& inputStream, IdToObjectVector& objectCache, IdToClassNameVector& nameCache);
65
66 void open();
67
73
79
81 std::istream& getStream();
82
85
88
91
94
97
100
103
106
109
110
112
116
118 size_t getVersion() const;
119
120 virtual void read(char& val);
121 virtual void read(bool& val);
122 virtual void read(agx::Int8& val);
123 virtual void read(agx::UInt8& val);
124 virtual void read(agx::Int16& val);
125 virtual void read(agx::UInt16& val);
126
127 virtual void read(agx::UInt32& val);
128 virtual void read(agx::Int32& val);
129
130 virtual void read(std::string& val);
131 virtual void read(agx::UInt64& val);
132 virtual void read(agx::Int64& val);
133 virtual void read(float& val);
134 virtual void read(double& val);
135
136#ifdef __APPLE__
137 virtual void read( size_t& val );
138#endif
139
140 virtual void read(agx::RangeReal& val);
141 virtual void read(agx::Vec2f& val);
142 virtual void read(agx::Vec2d& val);
143 virtual void read(agx::Vec2i32& val);
144 virtual void read(agx::Vec2i64& val);
145
146 virtual void read(agx::Vec3f& val);
147 virtual void read(agx::Vec3d& val);
148 virtual void read(agx::Vec3i32& val);
149 virtual void read(agx::Vec3i64& val);
150 virtual void read(agx::Vec4f& val);
151 virtual void read(agx::Vec4d& val);
152
153 virtual void read(agx::Quat& val);
154 virtual void read(agx::SPDMatrix3x3& val);
155 virtual void read(agx::Matrix3x3f& val);
156 virtual void read(agx::Matrix3x3d& val);
157 virtual void read(agx::Matrix4x4f& val);
158 virtual void read(agx::Matrix4x4d& val);
159 virtual void read(agx::AffineMatrix4x4f& val);
160 virtual void read(agx::AffineMatrix4x4d& val);
161 virtual void read(agx::Uuid& val);
162
171 virtual void read(void* buf, size_t len);
172
173
174 virtual void read(agx::String& val);
175
176 virtual void read(agx::Name& val);
177
178 template<typename T>
179 void readRef(T** obj, StorageMode mode)
180 {
181 if (mode == STORE_BY_REF) {
182
183 Serializable* sObj;
184
185 sObj = readObjectByRef();
186
187 *obj = dynamic_cast<T*>(sObj);
188 if (sObj != 0 && *obj == 0) {
189 agx::String str = agx::String::format("Type mismatch: read type \'%s\' Expected \'%s\'",
190 sObj->getClassName(),
191 T::getConstructClassId());
192
194 }
195 }
196 else
197 {
198 agxThrow ArchiveException("Invalid storage mode specified for read");
199 }
200 }
201
203
206
212
214 int getNumObjectsRead() const;
215
217 bool getEndianMatch() const;
218
220 {
223 DEFAULT = TRY_BY_REFERENCE
224 };
225
228
229 virtual void beginSection(const char* title) override;
230 virtual void endSection(const char* title) override;
231
232 virtual void getAttribute(const char *name, double& value);
233 virtual void getAttribute(const char *name, float& value);
234 virtual void getAttribute(const char *name, bool& value);
235 virtual void getAttribute(const char *name, std::string& value);
236 virtual void getAttribute(const char *name, char& value);
237 virtual void getAttribute(const char *name, agx::UInt16& value);
238 virtual void getAttribute(const char *name, agx::UInt64& value);
239 virtual void getAttribute(const char *name, agx::UInt32& value);
240 virtual void getAttribute(const char *name, agx::Int32& value);
241 virtual void getAttribute(const char *name, agx::Int8& value);
242 virtual void getAttribute(const char *name, agx::UInt8& value);
243 virtual void getAttribute(const char *name, agx::Uuid& value);
244
245#ifdef __APPLE__
246 virtual void getAttribute(const char *name, size_t& value);
247#endif
248
252 bool hasModification(const char *str) const;
253
257 bool hasModifications(const agx::StringVector& modifications) const;
258
259
261 bool eof() const;
262
268 template<typename VECTOR_TYPE>
269 AGXCORE_EXPORT void read_vector(const agx::String& name, VECTOR_TYPE& val);
270
271
272 protected:
274 virtual ~InputArchive();
275
277
278 virtual void readArchiveHeader();
279 virtual void readObjectHeader(StorageMode& storageMode, StorageAgent*& agent);
280 virtual void readTypeHeader(StorageAgent*& agent);
281
282
283 virtual size_t getNumBytesRead() const;
284
285 protected:
286 friend class Serializable;
287 friend class StorageAgent;
288
291
292
293 std::istream& m_inputStream;
299
300 // copy constructor and assignment operator prohibited
301 InputArchive(const InputArchive& inputStream);
303
306 protected:
307
312
317
319 void eof(bool flag);
320 private:
321
322 template<typename T>
323 void readCorrectNumBytes(T& val);
324
326 agx::String getSectionStackString() const;
327
328 virtual agx::String getErrorMessage(const agx::String& message);
329
330
331 BuildConfigurationTable m_buildFlags;
332
333
334 agx::String m_appName;
335 agx::UInt8 m_generationVersion, m_majorVersion, m_minorVersion, m_patchVersion;
336 agx::String m_revision;
337 agx::UInt16 m_serialization_version;
338
339 size_t m_numBytesRead;
340 int m_numObjectsRead; // for diagnostic purposes
341
342 bool m_finished;
343 char m_endianMatch;
344 RestoreMode m_restoreMode;
345 bool m_atEof;
346 agx::String m_buildDate;
347 agx::String m_buildTime;
348 agx::Vector<agx::String> m_sectionStack;
349 agx::String m_archiveDate;
350
351 void readModificationData();
352 agx::HashSet<agx::String> m_modificationHash;
353 };
354
356
357
358 inline bool InputArchive::eof() const
359 {
360 return m_atEof;
361 }
362 inline void InputArchive::eof(bool flag)
363 {
364 m_atEof = flag;
365 }
366
367 template <typename T>
368 struct InputVal {
369 InputVal(const char *name, T& obj) : m_name(name), m_obj(obj), m_mode(STORE_BY_VALUE) { m_objPtr = &m_obj; }
370 InputVal(const char *name, T* obj) : m_name(name), m_obj(*obj), m_objPtr(obj), m_mode(STORE_BY_REF) {}
371
372 const char *m_name;
373 T & m_obj;
375
377 InputVal & operator=(const InputVal& other) { m_obj = other.m_obj; m_name = other.m_name; m_mode = other.m_mode; return *this; }
378 };
379
380 template <typename T>
381 struct InputRef {
382 InputRef(const char *name, T& obj) : m_name(name), m_obj(obj), m_mode(STORE_BY_REF) {}
383
384 const char *m_name;
385 T & m_obj;
386
388 InputRef & operator=(const InputRef& other) { m_obj = other.m_obj; m_name = other.m_name; m_mode = other.m_mode; return *this; }
389 };
390
391
400 template <typename T>
401 InputRef<T> in(const char *name, T& obj) { return InputRef<T>(name, obj); }
402
411 template <typename T>
412 InputVal<T> in_val(const char *name, T& obj) { return InputVal<T>(name, obj); }
413
414
415#define DECLARE_INPUT_BASIC_TYPE(TYPE) \
416 AGXCORE_EXPORT inline agxStream::InputArchive& operator>>( InputArchive& in, InputVal<TYPE> val ) \
417 { \
418 in.beginSection(val.m_name); \
419 in.read( val.m_obj ); \
420 in.endSection(val.m_name); \
421 return in;\
422 } \
423 inline InputVal<TYPE> in(const char *name, TYPE& obj) { return InputVal<TYPE>(name, obj); }
424
425 DECLARE_INPUT_BASIC_TYPE(std::string)
438#ifdef __APPLE__
440#endif
441
463
464 template <typename T>
466 {
467 in.beginSection(val.m_name);
468 in.readVal(val.m_obj, val.m_mode);
469 in.endSection(val.m_name);
470 return in;
471 }
472 template <typename T>
474 {
475 in.beginSection(val.m_name);
476 in.readRef(&(val.m_obj), val.m_mode);
477 in.endSection(val.m_name);
478 return in;
479 }
480
481
482
483 template<typename T>
484 void restoreRefPtr(agxStream::InputArchive& in, const char* name, agx::ref_ptr<T>& refPtr)
485 {
486 T* object = nullptr;
487 in >> agxStream::in(name, object);
488 refPtr = object;
489 }
490
491 template<typename T>
493 {
494 T* object = nullptr;
495 in >> agxStream::in(name, object);
496 observerPtr = object;
497 }
498
499}
500
501#ifdef _MSC_VER
502# pragma warning(pop)
503#endif
#define DECLARE_INPUT_BASIC_TYPE(TYPE)
Definition: InputArchive.h:415
#define AGXCORE_EXPORT
Abstract base class for input/output storage of Serializable classes.
Definition: Archive.h:56
Class for reading a binary stream of serialized data.
Definition: InputArchive.h:51
virtual void read(agx::Vec2d &val)
virtual void read(agx::RangeReal &val)
IdToStorageAgentVector m_IdToStorageAgentVector
Definition: InputArchive.h:298
virtual void getAttribute(const char *name, bool &value)
@ TRY_BY_VALUE
! Restore by value, even if its a pointer that is given to the serialization. If pointer==nullptr,...
Definition: InputArchive.h:221
@ TRY_BY_REFERENCE
! Restore by reference when possible. Even if pointer given is != nullptr, use BY_REFERENCE
Definition: InputArchive.h:222
virtual void read(agx::Matrix3x3d &val)
virtual void read(agx::UInt32 &val)
virtual void read(agx::Matrix3x3f &val)
virtual void read(std::string &val)
AGXCORE_EXPORT void read_vector(const agx::String &name, VECTOR_TYPE &val)
Read an array of data.
RestoreMode getRestoreMode() const
virtual void read(agx::AffineMatrix4x4f &val)
virtual void read(agx::Vec3i32 &val)
virtual void read(agx::Vec2i32 &val)
virtual void getAttribute(const char *name, agx::Int8 &value)
virtual void read(agx::Vec3f &val)
agx::String getSerializationVersionStringMessage() const
const BuildConfigurationTable & getBuildFlags() const
agx::String getVersionStringMessage() const
virtual void getAttribute(const char *name, double &value)
void setRestoreMode(RestoreMode mode)
virtual void read(agx::Matrix4x4f &val)
size_t getVersion() const
virtual void read(agx::UInt8 &val)
IdToClassNameVector m_defaultNameCache
Definition: InputArchive.h:296
RestoreEvent restoreEvent
Definition: InputArchive.h:55
virtual void read(agx::SPDMatrix3x3 &val)
virtual void read(agx::Vec2i64 &val)
virtual void getAttribute(const char *name, char &value)
virtual void getAttribute(const char *name, agx::UInt64 &value)
agx::String getAppName() const
virtual void read(float &val)
virtual void getAttribute(const char *name, agx::UInt8 &value)
virtual void readTypeHeader(StorageAgent *&agent)
agx::String getBuildDate() const
virtual void read(agx::Vec3d &val)
virtual ~InputArchive()
Destructor.
bool hasModifications(const agx::StringVector &modifications) const
virtual void read(agx::AffineMatrix4x4d &val)
void readRef(T **obj, StorageMode mode)
Definition: InputArchive.h:179
agx::Vector< StorageAgent * > IdToStorageAgentVector
Definition: InputArchive.h:60
virtual void getAttribute(const char *name, agx::UInt32 &value)
agx::VectorPOD< Serializable * > IdToObjectVector
Definition: InputArchive.h:58
agx::HashTable< RestoreListener *, RestoreListenerRef > RestoreListenerHash
Definition: InputArchive.h:304
void readVal(Serializable &obj, StorageMode mode)
virtual void readArchiveHeader()
IdToObjectVector m_defaultObjectCache
Definition: InputArchive.h:294
virtual void read(agx::UInt16 &val)
virtual void read(char &val)
virtual void read(agx::Int32 &val)
agx::UInt8 getMinorVersion() const
bool addRestoreListener(RestoreListener *listener)
Add a listener that will be called for each restored Serializable object.
virtual void read(double &val)
InputArchive(std::istream &inputStream, IdToObjectVector &objectCache, IdToClassNameVector &nameCache)
virtual void read(bool &val)
bool removeRestoreListener(RestoreListener *listener)
Remove a RestoreListener.
virtual void read(agx::Matrix4x4d &val)
virtual void getAttribute(const char *name, float &value)
agx::Vector< std::string > IdToClassNameVector
Definition: InputArchive.h:59
RestoreListenerHash m_restoreListeners
Definition: InputArchive.h:305
bool removeObject(Serializable *object)
Remove the serialized object from list.
virtual void endSection(const char *title) override
InputArchive(const InputArchive &inputStream)
virtual void readObjectHeader(StorageMode &storageMode, StorageAgent *&agent)
void setFinished()
Must be called when archive is de-serialized successfully.
agx::UInt16 getSerializationVersion() const
InputArchive(std::istream &inputStream)
agx::String getArchiveDate() const
IdToObjectVector & m_IdToObjectVector
Definition: InputArchive.h:295
virtual void read(agx::Int64 &val)
virtual void read(agx::Vec4f &val)
bool getEndianMatch() const
int getNumObjectsRead() const
virtual void read(agx::UInt64 &val)
agx::UInt8 getPatchVersion() const
std::istream & getStream()
Return a reference to the inputstream.
virtual void read(agx::Int8 &val)
virtual size_t getNumBytesRead() const
agx::String getRevision() const
virtual void read(agx::Name &val)
bool hasModification(const char *str) const
agx::String getBuildTime() const
virtual void read(agx::String &val)
virtual void read(agx::Vec2f &val)
agx::UInt8 getGenerationVersion() const
virtual void getAttribute(const char *name, std::string &value)
agx::UInt8 getMajorVersion() const
virtual void getAttribute(const char *name, agx::Int32 &value)
std::istream & m_inputStream
Definition: InputArchive.h:293
virtual void read(agx::Int16 &val)
IdToClassNameVector & m_idToClassNameVector
Definition: InputArchive.h:297
virtual void read(agx::Uuid &val)
virtual void read(agx::Vec3i64 &val)
agx::HashTable< agx::UInt, bool > BuildConfigurationTable
Definition: InputArchive.h:113
virtual void read(agx::Quat &val)
virtual void getAttribute(const char *name, agx::Uuid &value)
virtual void read(agx::Vec4d &val)
virtual void read(void *buf, size_t len)
This method will read raw data from the archive.
bool readObjectByVal(Serializable &obj)
Serializable * readObjectByRef()
virtual void getAttribute(const char *name, agx::UInt16 &value)
virtual void beginSection(const char *title) override
agx::Event3< agx::UInt32, Serializable *, const std::string & > RestoreEvent
Definition: InputArchive.h:54
InputArchive & operator=(const InputArchive &)
Class for listening to the restore of Serializable objects.
This class is an abstract base class for all classes that can be stored and retrieved from an Archive...
Definition: Serializable.h:44
virtual const char * getClassName() const
Matrix class for rigid transformations (translation, rotation).
static AgXString format(const char *format,...)
C printf formatting of a string.
Definition: String.h:471
An event with three arguments.
Definition: Event.h:141
Inheritance with partial specialization due to bug with ref_ptr containers.
Definition: agx/HashSet.h:670
Inheritance with partial specialization due to bug with ref_ptr containers.
Matrix class for affine transformations.
Definition: Matrix4x4.h:58
Representation of a name string.
Definition: Name.h:33
Specialized type of matrices for holding symmetric positive definite matrices.
Definition: SPDMatrix3x3.h:48
A UUID, or Universally unique identifier, is intended to uniquely identify information in a distribut...
Definition: Uuid.h:42
A class holding 4 dimensional vectors and providing basic arithmetic.
Definition: Vec4Template.h:35
Vector containing 'raw' data.
Definition: agx/Vector.h:246
Smart pointer for observed objects, that automatically set pointers to them to null when they deleted...
Definition: observer_ptr.h:61
Smart pointer for handling referenced counted objects.
Definition: ref_ptr.h:30
#define agxThrow
Definition: debug.h:109
This namespace contain classes for streaming classes into archives, ASCII, binary for storage (serial...
StorageMode
Definition: Archive.h:45
@ STORE_BY_VALUE
Definition: Archive.h:46
@ STORE_BY_REF
Definition: Archive.h:47
InputVal< T > in_val(const char *name, T &obj)
Create an object with a name and a reference to the object that should be restored.
Definition: InputArchive.h:412
void restoreObserverPtr(agxStream::InputArchive &in, const char *name, agx::observer_ptr< T > &observerPtr)
Definition: InputArchive.h:492
void restoreRefPtr(agxStream::InputArchive &in, const char *name, agx::ref_ptr< T > &refPtr)
Definition: InputArchive.h:484
InputRef< T > in(const char *name, T &obj)
Create an object with a name and a reference to the object that should be restored (usually a pointer...
Definition: InputArchive.h:401
bool AGXPHYSICS_EXPORT read(const std::string &filename, agxStream::SerializablePtrVector &readObjects)
Open and read serializable objects from a file on disk with previously stored objects.
agx::ref_ptr< InputArchive > InputArchiveRef
Definition: InputArchive.h:355
InputArchive & operator>>(InputArchive &in, InputVal< T > val)
Definition: InputArchive.h:465
uint16_t UInt16
Definition: Integer.h:31
int32_t Int32
Definition: Integer.h:37
uint32_t UInt32
Definition: Integer.h:32
uint64_t UInt64
Definition: Integer.h:33
int64_t Int64
Definition: Integer.h:38
uint8_t UInt8
Definition: Integer.h:30
int8_t Int8
Definition: Integer.h:35
int16_t Int16
Definition: Integer.h:36
const char * m_name
Definition: InputArchive.h:384
StorageMode m_mode
Definition: InputArchive.h:387
InputRef(const char *name, T &obj)
Definition: InputArchive.h:382
InputRef & operator=(const InputRef &other)
Definition: InputArchive.h:388
InputVal(const char *name, T *obj)
Definition: InputArchive.h:370
InputVal & operator=(const InputVal &other)
Definition: InputArchive.h:377
InputVal(const char *name, T &obj)
Definition: InputArchive.h:369
const char * m_name
Definition: InputArchive.h:372
StorageMode m_mode
Definition: InputArchive.h:376