Kill operator LPCWSTR from CFX_WideString().
[pdfium.git] / core / src / fxcrt / fx_basic_memmgr.cpp
index 6538ea6..3b3211c 100644 (file)
@@ -5,12 +5,12 @@
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
 #include "../../include/fxcrt/fx_basic.h"
-
+#ifdef __cplusplus
 extern "C" {
-
+#endif
 void*  FXMEM_DefaultAlloc(size_t byte_size, int flags)
 {
-    return malloc(byte_size);
+    return (void*)malloc(byte_size);
 }
 void*  FXMEM_DefaultRealloc(void* pointer, size_t new_size, int flags)
 {
@@ -20,5 +20,50 @@ void FXMEM_DefaultFree(void* pointer, int flags)
 {
     free(pointer);
 }
-
-}  // extern "C"
+#ifdef __cplusplus
+}
+#endif
+CFX_GrowOnlyPool::CFX_GrowOnlyPool(size_t trunk_size)
+{
+    m_TrunkSize = trunk_size;
+    m_pFirstTrunk = NULL;
+}
+CFX_GrowOnlyPool::~CFX_GrowOnlyPool()
+{
+    FreeAll();
+}
+struct _FX_GrowOnlyTrunk {
+    size_t     m_Size;
+    size_t     m_Allocated;
+    _FX_GrowOnlyTrunk* m_pNext;
+};
+void CFX_GrowOnlyPool::FreeAll()
+{
+    _FX_GrowOnlyTrunk* pTrunk = (_FX_GrowOnlyTrunk*)m_pFirstTrunk;
+    while (pTrunk) {
+        _FX_GrowOnlyTrunk* pNext = pTrunk->m_pNext;
+        FX_Free(pTrunk);
+        pTrunk = pNext;
+    }
+    m_pFirstTrunk = NULL;
+}
+void* CFX_GrowOnlyPool::Alloc(size_t size)
+{
+    size = (size + 3) / 4 * 4;
+    _FX_GrowOnlyTrunk* pTrunk = (_FX_GrowOnlyTrunk*)m_pFirstTrunk;
+    while (pTrunk) {
+        if (pTrunk->m_Size - pTrunk->m_Allocated >= size) {
+            void* p = (FX_LPBYTE)(pTrunk + 1) + pTrunk->m_Allocated;
+            pTrunk->m_Allocated += size;
+            return p;
+        }
+        pTrunk = pTrunk->m_pNext;
+    }
+    size_t alloc_size = size > m_TrunkSize ? size : m_TrunkSize;
+    pTrunk = (_FX_GrowOnlyTrunk*)FX_Alloc(FX_BYTE, sizeof(_FX_GrowOnlyTrunk) + alloc_size);
+    pTrunk->m_Size = alloc_size;
+    pTrunk->m_Allocated = size;
+    pTrunk->m_pNext = (_FX_GrowOnlyTrunk*)m_pFirstTrunk;
+    m_pFirstTrunk = pTrunk;
+    return pTrunk + 1;
+}