0031918: Application Framework - New binary format for fast reading part of OCAF...
[occt.git] / src / BinObjMgt / BinObjMgt_Persistent.hxx
1 // Created on: 2002-10-30
2 // Created by: Michael SAZONOV
3 // Copyright (c) 2002-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 #ifndef _BinObjMgt_Persistent_HeaderFile
17 #define _BinObjMgt_Persistent_HeaderFile
18
19 #include <Standard.hxx>
20 #include <Standard_DefineAlloc.hxx>
21 #include <Standard_Handle.hxx>
22
23 #include <TColStd_SequenceOfAddress.hxx>
24 #include <Standard_Integer.hxx>
25 #include <Standard_Boolean.hxx>
26 #include <Standard_Character.hxx>
27 #include <Standard_Byte.hxx>
28 #include <Standard_ExtCharacter.hxx>
29 #include <Standard_Real.hxx>
30 #include <Standard_ShortReal.hxx>
31 #include <Standard_CString.hxx>
32 #include <BinObjMgt_PChar.hxx>
33 #include <BinObjMgt_PByte.hxx>
34 #include <BinObjMgt_PExtChar.hxx>
35 #include <BinObjMgt_PInteger.hxx>
36 #include <BinObjMgt_PReal.hxx>
37 #include <BinObjMgt_PShortReal.hxx>
38 #include <BinObjMgt_Position.hxx>
39 #include <Standard_OStream.hxx>
40 #include <Standard_IStream.hxx>
41 #include <Standard_Address.hxx>
42 class TCollection_AsciiString;
43 class TCollection_ExtendedString;
44 class TDF_Label;
45 class Standard_GUID;
46 class TDF_Data;
47
48
49 //! Binary persistent representation of an object.
50 //! Really it is used as a buffer for read/write an object.
51 //!
52 //! It takes care of Little/Big endian by inversing bytes
53 //! in objects of standard types (see FSD_FileHeader.hxx
54 //! for the default value of DO_INVERSE).
55 class BinObjMgt_Persistent 
56 {
57 public:
58
59   DEFINE_STANDARD_ALLOC
60
61   
62   //! Empty constructor
63   Standard_EXPORT BinObjMgt_Persistent();
64   
65   Standard_EXPORT BinObjMgt_Persistent& PutCharacter (const Standard_Character theValue);
66 BinObjMgt_Persistent& operator << (const Standard_Character theValue)
67 {
68   return PutCharacter(theValue);
69 }
70   
71   Standard_EXPORT BinObjMgt_Persistent& PutByte (const Standard_Byte theValue);
72 BinObjMgt_Persistent& operator << (const Standard_Byte theValue)
73 {
74   return PutByte(theValue);
75 }
76   
77   Standard_EXPORT BinObjMgt_Persistent& PutExtCharacter (const Standard_ExtCharacter theValue);
78 BinObjMgt_Persistent& operator << (const Standard_ExtCharacter theValue)
79 {
80   return PutExtCharacter(theValue);
81 }
82   
83   Standard_EXPORT BinObjMgt_Persistent& PutInteger (const Standard_Integer theValue);
84 BinObjMgt_Persistent& operator << (const Standard_Integer theValue)
85 {
86   return PutInteger(theValue);
87 }
88   
89     BinObjMgt_Persistent& PutBoolean (const Standard_Boolean theValue);
90   BinObjMgt_Persistent& operator << (const Standard_Boolean theValue)
91 {
92   return PutBoolean(theValue);
93 }
94   
95   Standard_EXPORT BinObjMgt_Persistent& PutReal (const Standard_Real theValue);
96 BinObjMgt_Persistent& operator << (const Standard_Real theValue)
97 {
98   return PutReal(theValue);
99 }
100   
101   Standard_EXPORT BinObjMgt_Persistent& PutShortReal (const Standard_ShortReal theValue);
102 BinObjMgt_Persistent& operator << (const Standard_ShortReal theValue)
103 {
104   return PutShortReal(theValue);
105 }
106   
107   //! Offset in output buffer is not aligned
108   Standard_EXPORT BinObjMgt_Persistent& PutCString (const Standard_CString theValue);
109 BinObjMgt_Persistent& operator << (const Standard_CString theValue)
110 {
111   return PutCString(theValue);
112 }
113   
114   //! Offset in output buffer is word-aligned
115   Standard_EXPORT BinObjMgt_Persistent& PutAsciiString (const TCollection_AsciiString& theValue);
116 BinObjMgt_Persistent& operator << (const TCollection_AsciiString& theValue)
117 {
118   return PutAsciiString(theValue);
119 }
120   
121   //! Offset in output buffer is word-aligned
122   Standard_EXPORT BinObjMgt_Persistent& PutExtendedString (const TCollection_ExtendedString& theValue);
123 BinObjMgt_Persistent& operator << (const TCollection_ExtendedString& theValue)
124 {
125   return PutExtendedString(theValue);
126 }
127   
128   Standard_EXPORT BinObjMgt_Persistent& PutLabel (const TDF_Label& theValue);
129 BinObjMgt_Persistent& operator << (const TDF_Label& theValue)
130 {
131   return PutLabel(theValue);
132 }
133   
134   Standard_EXPORT BinObjMgt_Persistent& PutGUID (const Standard_GUID& theValue);
135 BinObjMgt_Persistent& operator << (const Standard_GUID& theValue)
136 {
137   return PutGUID(theValue);
138 }
139   
140   //! Put C array of char, theLength is the number of elements
141   Standard_EXPORT BinObjMgt_Persistent& PutCharArray (const BinObjMgt_PChar theArray, const Standard_Integer theLength);
142   
143   //! Put C array of unsigned chars, theLength is the number of elements
144   Standard_EXPORT BinObjMgt_Persistent& PutByteArray (const BinObjMgt_PByte theArray, const Standard_Integer theLength);
145   
146   //! Put C array of ExtCharacter, theLength is the number of elements
147   Standard_EXPORT BinObjMgt_Persistent& PutExtCharArray (const BinObjMgt_PExtChar theArray, const Standard_Integer theLength);
148   
149   //! Put C array of int, theLength is the number of elements
150   Standard_EXPORT BinObjMgt_Persistent& PutIntArray (const BinObjMgt_PInteger theArray, const Standard_Integer theLength);
151   
152   //! Put C array of double, theLength is the number of elements
153   Standard_EXPORT BinObjMgt_Persistent& PutRealArray (const BinObjMgt_PReal theArray, const Standard_Integer theLength);
154   
155   //! Put C array of float, theLength is the number of elements
156   Standard_EXPORT BinObjMgt_Persistent& PutShortRealArray (const BinObjMgt_PShortReal theArray, const Standard_Integer theLength);
157   
158   Standard_EXPORT const BinObjMgt_Persistent& GetCharacter (Standard_Character& theValue) const;
159 const BinObjMgt_Persistent& operator >> (Standard_Character& theValue) const
160 {
161   return GetCharacter(theValue);
162 }
163   
164   Standard_EXPORT const BinObjMgt_Persistent& GetByte (Standard_Byte& theValue) const;
165 const BinObjMgt_Persistent& operator >> (Standard_Byte& theValue) const
166 {
167   return GetByte(theValue);
168 }
169   
170   Standard_EXPORT const BinObjMgt_Persistent& GetExtCharacter (Standard_ExtCharacter& theValue) const;
171 const BinObjMgt_Persistent& operator >> (Standard_ExtCharacter& theValue) const
172 {
173   return GetExtCharacter(theValue);
174 }
175   
176   Standard_EXPORT const BinObjMgt_Persistent& GetInteger (Standard_Integer& theValue) const;
177 const BinObjMgt_Persistent& operator >> (Standard_Integer& theValue) const
178 {
179   return GetInteger(theValue);
180 }
181   
182     const BinObjMgt_Persistent& GetBoolean (Standard_Boolean& theValue) const;
183   const BinObjMgt_Persistent& operator >> (Standard_Boolean& theValue) const
184 {
185   return GetBoolean(theValue);
186 }
187   
188   Standard_EXPORT const BinObjMgt_Persistent& GetReal (Standard_Real& theValue) const;
189 const BinObjMgt_Persistent& operator >> (Standard_Real& theValue) const
190 {
191   return GetReal(theValue);
192 }
193   
194   Standard_EXPORT const BinObjMgt_Persistent& GetShortReal (Standard_ShortReal& theValue) const;
195 const BinObjMgt_Persistent& operator >> (Standard_ShortReal& theValue) const
196 {
197   return GetShortReal(theValue);
198 }
199   
200   Standard_EXPORT const BinObjMgt_Persistent& GetAsciiString (TCollection_AsciiString& theValue) const;
201 const BinObjMgt_Persistent& operator >> (TCollection_AsciiString& theValue) const
202 {
203   return GetAsciiString(theValue);
204 }
205   
206   Standard_EXPORT const BinObjMgt_Persistent& GetExtendedString (TCollection_ExtendedString& theValue) const;
207 const BinObjMgt_Persistent& operator >> (TCollection_ExtendedString& theValue) const
208 {
209   return GetExtendedString(theValue);
210 }
211   
212   Standard_EXPORT const BinObjMgt_Persistent& GetLabel (const Handle(TDF_Data)& theDS, TDF_Label& theValue) const;
213   
214   Standard_EXPORT const BinObjMgt_Persistent& GetGUID (Standard_GUID& theValue) const;
215 const BinObjMgt_Persistent& operator >> (Standard_GUID& theValue) const
216 {
217   return GetGUID(theValue);
218 }
219   
220   //! Get C array of char, theLength is the number of elements;
221   //! theArray must point to a
222   //! space enough to place theLength elements
223   Standard_EXPORT const BinObjMgt_Persistent& GetCharArray (const BinObjMgt_PChar theArray, const Standard_Integer theLength) const;
224   
225   //! Get C array of unsigned chars, theLength is the number of elements;
226   //! theArray must point to a
227   //! space enough to place theLength elements
228   Standard_EXPORT const BinObjMgt_Persistent& GetByteArray (const BinObjMgt_PByte theArray, const Standard_Integer theLength) const;
229   
230   //! Get C array of ExtCharacter, theLength is the number of elements;
231   //! theArray must point to a
232   //! space enough to place theLength elements
233   Standard_EXPORT const BinObjMgt_Persistent& GetExtCharArray (const BinObjMgt_PExtChar theArray, const Standard_Integer theLength) const;
234   
235   //! Get C array of int, theLength is the number of elements;
236   //! theArray must point to a
237   //! space enough to place theLength elements
238   Standard_EXPORT const BinObjMgt_Persistent& GetIntArray (const BinObjMgt_PInteger theArray, const Standard_Integer theLength) const;
239   
240   //! Get C array of double, theLength is the number of elements;
241   //! theArray must point to a
242   //! space enough to place theLength elements
243   Standard_EXPORT const BinObjMgt_Persistent& GetRealArray (const BinObjMgt_PReal theArray, const Standard_Integer theLength) const;
244   
245   //! Get C array of float, theLength is the number of elements;
246   //! theArray must point to a
247   //! space enough to place theLength elements
248   Standard_EXPORT const BinObjMgt_Persistent& GetShortRealArray (const BinObjMgt_PShortReal theArray, const Standard_Integer theLength) const;
249   
250   //! Tells the current position for get/put
251     Standard_Integer Position() const;
252   
253   //! Sets the current position for get/put.
254   //! Resets an error state depending on the validity of thePos.
255   //! Returns the new state (value of IsOK())
256     Standard_Boolean SetPosition (const Standard_Integer thePos) const;
257   
258   //! Truncates the buffer by current position,
259   //! i.e. updates mySize
260     void Truncate();
261   
262   //! Indicates an error after Get methods or SetPosition
263     Standard_Boolean IsError() const;
264   Standard_Boolean operator !() const
265   {
266     return IsError();
267   }
268   
269   //! Indicates a good state after Get methods or SetPosition
270     Standard_Boolean IsOK() const;
271   operator Standard_Boolean () const { return IsOK(); }
272   
273   //! Initializes me to reuse again
274   Standard_EXPORT void Init();
275   
276   //! Sets the Id of the object
277     void SetId (const Standard_Integer theId);
278   
279   //! Sets the Id of the type of the object
280     void SetTypeId (const Standard_Integer theId);
281   
282   //! Returns the Id of the object
283     Standard_Integer Id() const;
284   
285   //! Returns the Id of the type of the object
286     Standard_Integer TypeId() const;
287   
288   //! Returns the length of data
289     Standard_Integer Length() const;
290   
291   //! Stores <me> to the stream.
292   //! inline Standard_OStream& operator<< (Standard_OStream&,
293   //! BinObjMgt_Persistent&) is also available.
294   //! If theDirectStream is true, after this data the direct stream data is stored.
295   Standard_EXPORT Standard_OStream& Write (Standard_OStream& theOS, const Standard_Boolean theDirectStream = Standard_False);
296   
297   //! Retrieves <me> from the stream.
298   //! inline Standard_IStream& operator>> (Standard_IStream&,
299   //! BinObjMgt_Persistent&) is also available
300   Standard_EXPORT Standard_IStream& Read (Standard_IStream& theIS);
301   
302   //! Frees the allocated memory;
303   //! This object can be reused after call to Init
304   Standard_EXPORT void Destroy();
305   ~BinObjMgt_Persistent()
306   {
307     Destroy();
308   }
309
310   //! Sets the stream for direct writing
311   Standard_EXPORT void SetOStream (Standard_OStream& theStream) { myOStream = &theStream; }
312   //! Sets the stream for direct reading
313   Standard_EXPORT void SetIStream (Standard_IStream& theStream) { myIStream = &theStream; }
314   //! Gets the stream for and enables direct writing
315   Standard_EXPORT Standard_OStream* GetOStream();
316   //! Gets the stream for and enables direct reading
317   Standard_EXPORT Standard_IStream* GetIStream();
318   //! Returns true if after this record a direct writing to the stream is performed.
319   Standard_EXPORT Standard_Boolean IsDirect() { return myDirectWritingIsEnabled; }
320   //! Returns the start position of the direct writing in the stream
321   Standard_EXPORT Handle(BinObjMgt_Position) StreamStart() { return myStreamStart; }
322
323 private:
324
325   
326   //! Aligns myOffset to the given size;
327   //! enters the next piece if the end of the current one is reached;
328   //! toClear==true means to fill unused space by 0
329     void alignOffset (const Standard_Integer theSize, const Standard_Boolean toClear = Standard_False) const;
330   
331   //! Prepares the room for theSize bytes;
332   //! returns the number of pieces except for the current one
333   //! are to be occupied
334     Standard_Integer prepareForPut (const Standard_Integer theSize);
335   
336   //! Allocates theNbPieces more pieces
337   Standard_EXPORT void incrementData (const Standard_Integer theNbPieces);
338   
339   //! Checks if there is no more data of the given size starting
340   //! from the current position in myData
341     Standard_Boolean noMoreData (const Standard_Integer theSize) const;
342   
343   //! Puts theLength bytes from theArray
344   Standard_EXPORT void putArray (const Standard_Address theArray, const Standard_Integer theSize);
345   
346   //! Gets theLength bytes into theArray
347   Standard_EXPORT void getArray (const Standard_Address theArray, const Standard_Integer theSize) const;
348   
349   //! Inverses bytes in the data addressed by the given values
350   Standard_EXPORT void inverseExtCharData (const Standard_Integer theIndex, const Standard_Integer theOffset, const Standard_Integer theSize);
351   
352   //! Inverses bytes in the data addressed by the given values
353   Standard_EXPORT void inverseIntData (const Standard_Integer theIndex, const Standard_Integer theOffset, const Standard_Integer theSize);
354   
355   //! Inverses bytes in the data addressed by the given values
356   Standard_EXPORT void inverseRealData (const Standard_Integer theIndex, const Standard_Integer theOffset, const Standard_Integer theSize);
357   
358   //! Inverses bytes in the data addressed by the given values
359   Standard_EXPORT void inverseShortRealData (const Standard_Integer theIndex, const Standard_Integer theOffset, const Standard_Integer theSize);
360
361
362   TColStd_SequenceOfAddress myData;
363   Standard_Integer myIndex;
364   Standard_Integer myOffset;
365   Standard_Integer mySize;
366   Standard_Boolean myIsError;
367   Standard_OStream* myOStream; ///< stream to write in case direct writing is enabled
368   Standard_IStream* myIStream; ///< stream to write in case direct reading is enabled
369   Standard_Boolean myDirectWritingIsEnabled;
370   Handle(BinObjMgt_Position) myStreamStart; ///< position where the direct writing to the script is started
371 };
372
373
374 #include <BinObjMgt_Persistent.lxx>
375
376
377
378
379
380 #endif // _BinObjMgt_Persistent_HeaderFile