0031313: Foundation Classes - Dump improvement for classes
[occt.git] / src / NCollection / NCollection_Buffer.hxx
1 // Created on: 2014-04-01
2 // Created by: Kirill Gavrilov
3 // Copyright (c) 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 _NCollection_Buffer_HeaderFile
17 #define _NCollection_Buffer_HeaderFile
18
19 #include <NCollection_BaseAllocator.hxx>
20 #include <Standard_Dump.hxx>
21 #include <Standard_Transient.hxx>
22
23 //! Low-level buffer object.
24 class NCollection_Buffer : public Standard_Transient
25 {
26
27 public:
28
29   //! Default constructor.
30   //! When theData is NULL but theSize is not 0 than buffer of specified size will be allocated.
31   //! @param theAlloc memory allocator
32   //! @param theSize  buffer size
33   //! @param theData  buffer data allocated by theAlloc
34   NCollection_Buffer (const Handle(NCollection_BaseAllocator)& theAlloc,
35                       const Standard_Size                      theSize = 0,
36                       Standard_Byte*                           theData = NULL)
37   : myData (NULL),
38     mySize (0),
39     myAllocator (theAlloc)
40   {
41     if (theData != NULL)
42     {
43       myData = theData;
44       mySize = theSize;
45     }
46     else
47     {
48       Allocate (theSize);
49     }
50   }
51
52   //! Destructor.
53   ~NCollection_Buffer()
54   {
55     Free();
56   }
57
58   //! @return buffer data
59   const Standard_Byte* Data() const
60   {
61     return myData;
62   }
63
64   //! @return buffer data
65   Standard_Byte* ChangeData()
66   {
67     return myData;
68   }
69
70   //! @return true if buffer is not allocated
71   bool IsEmpty() const
72   {
73     return myData == NULL;
74   }
75
76   //! Return buffer length in bytes.
77   Standard_Size Size() const
78   {
79     return mySize;
80   }
81
82   //! @return buffer allocator
83   const Handle(NCollection_BaseAllocator)& Allocator() const
84   {
85     return myAllocator;
86   }
87
88   //! Assign new buffer allocator with de-allocation of buffer.
89   void SetAllocator (const Handle(NCollection_BaseAllocator)& theAlloc)
90   {
91     Free();
92     myAllocator = theAlloc;
93   }
94
95   //! Allocate the buffer.
96   //! @param theSize buffer length in bytes
97   bool Allocate (const Standard_Size theSize)
98   {
99     Free();
100     mySize = theSize;
101     if (theSize != 0
102     || !myAllocator.IsNull())
103     {
104       myData = (Standard_Byte* )myAllocator->Allocate (theSize);
105     }
106
107     if (myData == NULL)
108     {
109       mySize = 0;
110       return false;
111     }
112     return true;
113   }
114
115   //! De-allocate buffer.
116   void Free()
117   {
118     if (!myAllocator.IsNull())
119     {
120       myAllocator->Free (myData);
121     }
122     myData = NULL;
123     mySize = 0;
124   }
125
126   //! Dumps the content of me into the stream
127   virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const
128   {
129     (void)theDepth;
130     OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myData)
131     OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, mySize)
132     OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myAllocator.get())
133   }
134
135 protected:
136
137   Standard_Byte*                    myData;      //!< data pointer
138   Standard_Size                     mySize;      //!< buffer length in bytes
139   Handle(NCollection_BaseAllocator) myAllocator; //!< buffer allocator
140
141 public:
142
143   DEFINE_STANDARD_RTTI_INLINE(NCollection_Buffer,Standard_Transient) // Type definition
144
145 };
146
147 DEFINE_STANDARD_HANDLE(NCollection_Buffer, Standard_Transient)
148
149 #endif // _NCollection_Buffer_HeaderFile