AGX Dynamics 2.41.3.0
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::Matrix3x3d& val);
156 virtual void read(agx::Matrix3x3f& val);
157 virtual void read(agx::AffineMatrix4x4f& val);
158 virtual void read(agx::AffineMatrix4x4d& val);
159 virtual void read(agx::Uuid& val);
160
169 virtual void read(void* buf, size_t len);
170
171
172 virtual void read(agx::String& val);
173
174 virtual void read(agx::Name& val);
175
176 template<typename T>
177 void readRef(T** obj, StorageMode mode)
178 {
179 if (mode == STORE_BY_REF) {
180
181 Serializable* sObj;
182
183 sObj = readObjectByRef();
184
185 *obj = dynamic_cast<T*>(sObj);
186 if (sObj != 0 && *obj == 0) {
187 agx::String str = agx::String::format("Type mismatch: read type \'%s\' Expected \'%s\'",
188 sObj->getClassName(),
189 T::getConstructClassId());
190
192 }
193 }
194 else
195 {
196 agxThrow ArchiveException("Invalid storage mode specified for read");
197 }
198 }
199
201
204
210
212 int getNumObjectsRead() const;
213
215 bool getEndianMatch() const;
216
218 {
221 DEFAULT = TRY_BY_REFERENCE
222 };
223
226
227 virtual void beginSection(const char* title) override;
228 virtual void endSection(const char* title) override;
229
230 virtual void getAttribute(const char *name, double& value);
231 virtual void getAttribute(const char *name, float& value);
232 virtual void getAttribute(const char *name, bool& value);
233 virtual void getAttribute(const char *name, std::string& value);
234 virtual void getAttribute(const char *name, char& value);
235 virtual void getAttribute(const char *name, agx::UInt16& value);
236 virtual void getAttribute(const char *name, agx::UInt64& value);
237 virtual void getAttribute(const char *name, agx::UInt32& value);
238 virtual void getAttribute(const char *name, agx::Int32& value);
239 virtual void getAttribute(const char *name, agx::Int8& value);
240 virtual void getAttribute(const char *name, agx::UInt8& value);
241 virtual void getAttribute(const char *name, agx::Uuid& value);
242
243#ifdef __APPLE__
244 virtual void getAttribute(const char *name, size_t& value);
245#endif
246
250 bool hasModification(const char *str) const;
251
255 bool hasModifications(const agx::StringVector& modifications) const;
256
257
259 bool eof() const;
260
266 template<typename VECTOR_TYPE>
267 AGXCORE_EXPORT void read_vector(const agx::String& name, VECTOR_TYPE& val);
268
269
270 protected:
272 virtual ~InputArchive();
273
275
276 virtual void readArchiveHeader();
277 virtual void readObjectHeader(StorageMode& storageMode, StorageAgent*& agent);
278 virtual void readTypeHeader(StorageAgent*& agent);
279
280
281 virtual size_t getNumBytesRead() const;
282
283 protected:
284 friend class Serializable;
285 friend class StorageAgent;
286
289
290
291 std::istream& m_inputStream;
297
298 // copy constructor and assignment operator prohibited
299 InputArchive(const InputArchive& inputStream);
301
304 protected:
305
310
315
317 void eof(bool flag);
318 private:
319
320 template<typename T>
321 void readCorrectNumBytes(T& val);
322
324 agx::String getSectionStackString() const;
325
326 virtual agx::String getErrorMessage(const agx::String& message);
327
328
329 BuildConfigurationTable m_buildFlags;
330
331
332 agx::String m_appName;
333 agx::UInt8 m_generationVersion, m_majorVersion, m_minorVersion, m_patchVersion;
334 agx::String m_revision;
335 agx::UInt16 m_serialization_version;
336
337 size_t m_numBytesRead;
338 int m_numObjectsRead; // for diagnostic purposes
339
340 bool m_finished;
341 char m_endianMatch;
342 RestoreMode m_restoreMode;
343 bool m_atEof;
344 agx::String m_buildDate;
345 agx::String m_buildTime;
346 agx::Vector<agx::String> m_sectionStack;
347 agx::String m_archiveDate;
348
349 void readModificationData();
350 agx::HashSet<agx::String> m_modificationHash;
351 };
352
354
355
356 inline bool InputArchive::eof() const
357 {
358 return m_atEof;
359 }
360 inline void InputArchive::eof(bool flag)
361 {
362 m_atEof = flag;
363 }
364
365 template <typename T>
366 struct InputVal {
367 InputVal(const char *name, T& obj) : m_name(name), m_obj(obj), m_mode(STORE_BY_VALUE) { m_objPtr = &m_obj; }
368 InputVal(const char *name, T* obj) : m_name(name), m_obj(*obj), m_objPtr(obj), m_mode(STORE_BY_REF) {}
369
370 const char *m_name;
371 T & m_obj;
373
375 InputVal & operator=(const InputVal& other) { m_obj = other.m_obj; m_name = other.m_name; m_mode = other.m_mode; return *this; }
376 };
377
378 template <typename T>
379 struct InputRef {
380 InputRef(const char *name, T& obj) : m_name(name), m_obj(obj), m_mode(STORE_BY_REF) {}
381
382 const char *m_name;
383 T & m_obj;
384
386 InputRef & operator=(const InputRef& other) { m_obj = other.m_obj; m_name = other.m_name; m_mode = other.m_mode; return *this; }
387 };
388
389
398 template <typename T>
399 InputRef<T> in(const char *name, T& obj) { return InputRef<T>(name, obj); }
400
409 template <typename T>
410 InputVal<T> in_val(const char *name, T& obj) { return InputVal<T>(name, obj); }
411
412
413#define DECLARE_INPUT_BASIC_TYPE(TYPE) \
414 AGXCORE_EXPORT inline agxStream::InputArchive& operator>>( InputArchive& in, InputVal<TYPE> val ) \
415 { \
416 in.beginSection(val.m_name); \
417 in.read( val.m_obj ); \
418 in.endSection(val.m_name); \
419 return in;\
420 } \
421 inline InputVal<TYPE> in(const char *name, TYPE& obj) { return InputVal<TYPE>(name, obj); }
422
423 DECLARE_INPUT_BASIC_TYPE(std::string)
436#ifdef __APPLE__
438#endif
439
459
460 template <typename T>
462 {
463 in.beginSection(val.m_name);
464 in.readVal(val.m_obj, val.m_mode);
465 in.endSection(val.m_name);
466 return in;
467 }
468 template <typename T>
470 {
471 in.beginSection(val.m_name);
472 in.readRef(&(val.m_obj), val.m_mode);
473 in.endSection(val.m_name);
474 return in;
475 }
476
477
478
479 template<typename T>
480 void restoreRefPtr(agxStream::InputArchive& in, const char* name, agx::ref_ptr<T>& refPtr)
481 {
482 T* object = nullptr;
483 in >> agxStream::in(name, object);
484 refPtr = object;
485 }
486
487 template<typename T>
489 {
490 T* object = nullptr;
491 in >> agxStream::in(name, object);
492 observerPtr = object;
493 }
494
495}
496
497#ifdef _MSC_VER
498# pragma warning(pop)
499#endif
#define DECLARE_INPUT_BASIC_TYPE(TYPE)
Definition: InputArchive.h:413
#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:296
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:219
@ TRY_BY_REFERENCE
! Restore by reference when possible. Even if pointer given is != nullptr, use BY_REFERENCE
Definition: InputArchive.h:220
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)
size_t getVersion() const
virtual void read(agx::UInt8 &val)
IdToClassNameVector m_defaultNameCache
Definition: InputArchive.h:294
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:177
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:302
void readVal(Serializable &obj, StorageMode mode)
virtual void readArchiveHeader()
IdToObjectVector m_defaultObjectCache
Definition: InputArchive.h:292
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 getAttribute(const char *name, float &value)
agx::Vector< std::string > IdToClassNameVector
Definition: InputArchive.h:59
RestoreListenerHash m_restoreListeners
Definition: InputArchive.h:303
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:293
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:291
virtual void read(agx::Int16 &val)
IdToClassNameVector & m_idToClassNameVector
Definition: InputArchive.h:295
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:45
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.
Representation of a name string.
Definition: Name.h:33
Specialized type of matrices for holding symmetric positive definite matrices.
Definition: SPDMatrix3x3.h:49
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:410
void restoreObserverPtr(agxStream::InputArchive &in, const char *name, agx::observer_ptr< T > &observerPtr)
Definition: InputArchive.h:488
void restoreRefPtr(agxStream::InputArchive &in, const char *name, agx::ref_ptr< T > &refPtr)
Definition: InputArchive.h:480
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:399
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:353
InputArchive & operator>>(InputArchive &in, InputVal< T > val)
Definition: InputArchive.h:461
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:382
StorageMode m_mode
Definition: InputArchive.h:385
InputRef(const char *name, T &obj)
Definition: InputArchive.h:380
InputRef & operator=(const InputRef &other)
Definition: InputArchive.h:386
InputVal(const char *name, T *obj)
Definition: InputArchive.h:368
InputVal & operator=(const InputVal &other)
Definition: InputArchive.h:375
InputVal(const char *name, T &obj)
Definition: InputArchive.h:367
const char * m_name
Definition: InputArchive.h:370
StorageMode m_mode
Definition: InputArchive.h:374