Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fgas / src / crt / fx_memory.h
1 // Copyright 2014 PDFium Authors. All rights reserved.\r
2 // Use of this source code is governed by a BSD-style license that can be\r
3 // found in the LICENSE file.\r
4 \r
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
6 \r
7 #ifndef _FX_MEMORY_IMP\r
8 #define _FX_MEMORY_IMP\r
9 class CFX_DefStore;\r
10 class CFX_StaticStore;\r
11 class CFX_FixedStore;\r
12 class CFX_DynamicStore;\r
13 class CFX_DefStore : public IFX_MEMAllocator, public CFX_Target\r
14 {\r
15 public:\r
16     CFX_DefStore() {}\r
17     ~CFX_DefStore() {}\r
18     virtual void                        Release()\r
19     {\r
20         FXTARGET_Delete this;\r
21     }\r
22     virtual void*                       Alloc(size_t size)\r
23     {\r
24         return FX_Alloc(FX_BYTE, size);\r
25     }\r
26     virtual void                        Free(void *pBlock)\r
27     {\r
28         FX_Free(pBlock);\r
29     }\r
30     virtual size_t                      GetBlockSize() const\r
31     {\r
32         return 0;\r
33     }\r
34     virtual size_t                      GetDefChunkSize() const\r
35     {\r
36         return 0;\r
37     }\r
38     virtual size_t                      SetDefChunkSize(size_t size)\r
39     {\r
40         return 0;\r
41     }\r
42     virtual size_t                      GetCurrentDataSize() const\r
43     {\r
44         return 0;\r
45     }\r
46 };\r
47 #if _FX_OS_ != _FX_ANDROID_\r
48 #pragma pack(push, 1)\r
49 #endif\r
50 typedef struct _FX_STATICSTORECHUNK {\r
51     _FX_STATICSTORECHUNK*       pNextChunk;\r
52     size_t                                      iChunkSize;\r
53     size_t                                      iFreeSize;\r
54 } FX_STATICSTORECHUNK, * FX_LPSTATICSTORECHUNK;\r
55 typedef FX_STATICSTORECHUNK const * FX_LPCSTATICSTORECHUNK;\r
56 #if _FX_OS_ != _FX_ANDROID_\r
57 #pragma pack(pop)\r
58 #endif\r
59 class CFX_StaticStore : public IFX_MEMAllocator, public CFX_Target\r
60 {\r
61 public:\r
62     CFX_StaticStore(size_t iDefChunkSize = 4096);\r
63     ~CFX_StaticStore();\r
64     virtual void                        Release()\r
65     {\r
66         FXTARGET_Delete this;\r
67     }\r
68     virtual void*                       Alloc(size_t size);\r
69     virtual void                        Free(FX_LPVOID pBlock) {}\r
70     virtual size_t                      GetBlockSize() const\r
71     {\r
72         return 0;\r
73     }\r
74     virtual size_t                      GetDefChunkSize() const\r
75     {\r
76         return m_iDefChunkSize;\r
77     }\r
78     virtual size_t                      SetDefChunkSize(size_t size);\r
79     virtual size_t                      GetCurrentDataSize() const\r
80     {\r
81         return m_iAllocatedSize;\r
82     }\r
83 protected:\r
84     size_t                                      m_iAllocatedSize;\r
85     size_t                                      m_iDefChunkSize;\r
86     FX_LPSTATICSTORECHUNK       m_pChunk;\r
87     FX_LPSTATICSTORECHUNK       m_pLastChunk;\r
88     FX_LPSTATICSTORECHUNK       AllocChunk(size_t size);\r
89     FX_LPSTATICSTORECHUNK       FindChunk(size_t size);\r
90 };\r
91 #if _FX_OS_ != _FX_ANDROID_\r
92 #pragma pack(push, 1)\r
93 #endif\r
94 typedef struct _FX_FIXEDSTORECHUNK {\r
95     FX_LPBYTE                           FirstFlag() const\r
96     {\r
97         return (FX_LPBYTE)this + sizeof(_FX_FIXEDSTORECHUNK);\r
98     }\r
99     FX_LPBYTE                           FirstBlock() const\r
100     {\r
101         return FirstFlag() + iChunkSize;\r
102     }\r
103     _FX_FIXEDSTORECHUNK*        pNextChunk;\r
104     size_t                                      iChunkSize;\r
105     size_t                                      iFreeNum;\r
106 } FX_FIXEDSTORECHUNK, * FX_LPFIXEDSTORECHUNK;\r
107 typedef FX_FIXEDSTORECHUNK const * FX_LPCFIXEDSTORECHUNK;\r
108 #if _FX_OS_ != _FX_ANDROID_\r
109 #pragma pack(pop)\r
110 #endif\r
111 class CFX_FixedStore : public IFX_MEMAllocator, public CFX_Target\r
112 {\r
113 public:\r
114     CFX_FixedStore(size_t iBlockSize, size_t iBlockNumsInChunk);\r
115     virtual ~CFX_FixedStore();\r
116     virtual void                        Release()\r
117     {\r
118         FXTARGET_Delete this;\r
119     }\r
120     virtual void*                       Alloc(size_t size);\r
121     virtual void                        Free(FX_LPVOID pBlock);\r
122     virtual size_t                      GetBlockSize() const\r
123     {\r
124         return m_iBlockSize;\r
125     }\r
126     virtual size_t                      GetDefChunkSize() const\r
127     {\r
128         return m_iDefChunkSize;\r
129     }\r
130     virtual size_t                      SetDefChunkSize(size_t iChunkSize);\r
131     virtual size_t                      GetCurrentDataSize() const\r
132     {\r
133         return 0;\r
134     }\r
135 protected:\r
136     size_t                                      m_iBlockSize;\r
137     size_t                                      m_iDefChunkSize;\r
138     FX_LPFIXEDSTORECHUNK        m_pChunk;\r
139     FX_LPFIXEDSTORECHUNK        AllocChunk();\r
140 };\r
141 #if _FX_OS_ != _FX_ANDROID_\r
142 #pragma pack(push, 1)\r
143 #endif\r
144 typedef struct _FX_DYNAMICSTOREBLOCK {\r
145     _FX_DYNAMICSTOREBLOCK*      NextBlock() const\r
146     {\r
147         return (_FX_DYNAMICSTOREBLOCK*)(Data() + iBlockSize);\r
148     }\r
149     FX_LPBYTE                           Data() const\r
150     {\r
151         return (FX_LPBYTE)this + sizeof(_FX_DYNAMICSTOREBLOCK);\r
152     }\r
153     size_t              iBlockSize;\r
154     FX_BOOL             bUsed;\r
155 } FX_DYNAMICSTOREBLOCK, * FX_LPDYNAMICSTOREBLOCK;\r
156 typedef FX_DYNAMICSTOREBLOCK const * FX_LPCDYNAMICSTOREBLOCK;\r
157 typedef struct _FX_DYNAMICSTORECHUNK {\r
158     FX_LPDYNAMICSTOREBLOCK      FirstBlock() const\r
159     {\r
160         return (FX_LPDYNAMICSTOREBLOCK)((FX_LPBYTE)this + sizeof(_FX_DYNAMICSTORECHUNK));\r
161     }\r
162     _FX_DYNAMICSTORECHUNK*      pNextChunk;\r
163     size_t                                      iChunkSize;\r
164     size_t                                      iFreeSize;\r
165 } FX_DYNAMICSTORECHUNK, * FX_LPDYNAMICSTORECHUNK;\r
166 typedef FX_DYNAMICSTORECHUNK const * FX_LPCDYNAMICSTORECHUNK;\r
167 #if _FX_OS_ != _FX_ANDROID_\r
168 #pragma pack(pop)\r
169 #endif\r
170 class CFX_DynamicStore : public IFX_MEMAllocator, public CFX_Target\r
171 {\r
172 public:\r
173     CFX_DynamicStore(size_t iDefChunkSize = 4096);\r
174     virtual ~CFX_DynamicStore();\r
175     virtual void                Release()\r
176     {\r
177         FXTARGET_Delete this;\r
178     }\r
179     virtual void*               Alloc(size_t size);\r
180     virtual void                Free(FX_LPVOID pBlock);\r
181     virtual size_t              GetBlockSize() const\r
182     {\r
183         return 0;\r
184     }\r
185     virtual size_t              GetDefChunkSize() const\r
186     {\r
187         return m_iDefChunkSize;\r
188     }\r
189     virtual size_t              SetDefChunkSize(size_t size);\r
190     virtual size_t              GetCurrentDataSize() const\r
191     {\r
192         return 0;\r
193     }\r
194 protected:\r
195     size_t                                              m_iDefChunkSize;\r
196     FX_LPDYNAMICSTORECHUNK              m_pChunk;\r
197     FX_LPDYNAMICSTORECHUNK              AllocChunk(size_t size);\r
198 };\r
199 #endif\r