Author: gedmurphy
Date: Thu Mar 17 18:05:44 2016
New Revision: 71018

URL: http://svn.reactos.org/svn/reactos?rev=71018&view=rev
Log:
Implement CHeapPtr with a template allocator.
Re-Implement CComHeapPtr by deriving from CHeapPtr with a COM allocator
Patch by Mark Jansen
CORE 10903

Added:
    trunk/reactos/lib/atl/atlalloc.h   (with props)
Modified:
    trunk/reactos/lib/atl/atlbase.h

Added: trunk/reactos/lib/atl/atlalloc.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/atl/atlalloc.h?rev=71018
==============================================================================
--- trunk/reactos/lib/atl/atlalloc.h    (added)
+++ trunk/reactos/lib/atl/atlalloc.h    [iso-8859-1] Thu Mar 17 18:05:44 2016
@@ -0,0 +1,194 @@
+/*
+ * ReactOS ATL
+ *
+ * Copyright 2009 Andrew Hill <[email protected]>
+ * Copyright 2016 Mark Jansen
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  
USA
+ */
+
+#pragma once
+
+class CCRTAllocator
+{
+public:
+    static void* Allocate(_In_ size_t size)
+    {
+        return malloc(size);
+    }
+
+    static void* Reallocate(_In_opt_ void* ptr, _In_ size_t size)
+    {
+        return realloc(ptr, size);
+    }
+
+    static void Free(_In_opt_ void* ptr)
+    {
+        free(ptr);
+    }
+};
+
+class CLocalAllocator
+{
+public:
+    static void* Allocate(_In_ size_t size)
+    {
+        return ::LocalAlloc(LMEM_FIXED, size);
+    }
+
+    static void* Reallocate(_In_opt_ void* ptr, _In_ size_t size)
+    {
+        if (!ptr)
+            return Allocate(size);
+        if (size == 0)
+        {
+            Free(ptr);
+            return NULL;
+        }
+        return ::LocalReAlloc(ptr, size, 0);
+    }
+
+    static void Free(_In_opt_ void* ptr)
+    {
+        ::LocalFree(ptr);
+    }
+};
+
+class CGlobalAllocator
+{
+public:
+    static void* Allocate(_In_ size_t size)
+    {
+        return ::GlobalAlloc(GMEM_FIXED, size);
+    }
+
+    static void* Reallocate(_In_opt_ void* ptr, _In_ size_t size)
+    {
+        if (!ptr)
+            return Allocate(size);
+        if (size == 0)
+        {
+            Free(ptr);
+            return NULL;
+        }
+        return ::GlobalReAlloc(ptr, size, 0);
+    }
+
+    static void Free(_In_opt_ void* ptr)
+    {
+        GlobalFree(ptr);
+    }
+};
+
+
+template<class T, class Allocator = CCRTAllocator>
+class CHeapPtr
+{
+public:
+    CHeapPtr() :
+        m_Data(NULL)
+    {
+    }
+
+    explicit CHeapPtr(T *lp) :
+        m_Data(lp)
+    {
+    }
+
+    explicit CHeapPtr(CHeapPtr<T, Allocator> &lp)
+    {
+        m_Data = lp.Detach();
+    }
+
+    ~CHeapPtr()
+    {
+        Free();
+    }
+
+    CHeapPtr<T, Allocator>& operator = (CHeapPtr<T, Allocator> &lp)
+    {
+        if (lp.m_Data != m_Data)
+            Attach(lp.Detach());
+        return *this;
+    }
+
+    bool AllocateBytes(_In_ size_t nBytes)
+    {
+        ATLASSERT(m_Data == NULL);
+        m_Data = static_cast<T*>(Allocator::Allocate(nBytes));
+        return m_Data != NULL;
+    }
+
+    bool ReallocateBytes(_In_ size_t nBytes)
+    {
+        T* newData = static_cast<T*>(Allocator::Reallocate(m_Data, nBytes));
+        if (newData == NULL)
+            return false;
+        m_Data = newData;
+        return true;
+    }
+
+    bool Allocate(_In_ size_t nElements = 1)
+    {
+        return AllocateBytes(nElements * sizeof(T));
+    }
+
+    bool Reallocate(_In_ size_t nElements)
+    {
+        return ReallocateBytes(nElements * sizeof(T));
+    }
+
+    void Free()
+    {
+        if (m_Data)
+        {
+            Allocator::Free(m_Data);
+            m_Data = NULL;
+        }
+    }
+
+    void Attach(T *lp)
+    {
+        Allocator::Free(m_Data);
+        m_Data = lp;
+    }
+
+    T *Detach()
+    {
+        T *saveP = m_Data;
+        m_Data = NULL;
+        return saveP;
+    }
+
+    T **operator &()
+    {
+        ATLASSERT(m_Data == NULL);
+        return &m_Data;
+    }
+
+    operator T* () const
+    {
+        return m_Data;
+    }
+
+    T* operator->() const
+    {
+        return m_Data;
+    }
+
+protected:
+    T *m_Data;
+};
+

Propchange: trunk/reactos/lib/atl/atlalloc.h
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: trunk/reactos/lib/atl/atlbase.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/atl/atlbase.h?rev=71018&r1=71017&r2=71018&view=diff
==============================================================================
--- trunk/reactos/lib/atl/atlbase.h     [iso-8859-1] (original)
+++ trunk/reactos/lib/atl/atlbase.h     [iso-8859-1] Thu Mar 17 18:05:44 2016
@@ -23,6 +23,7 @@
 #include "atlcore.h"
 #include "statreg.h"
 #include "atlcomcli.h"
+#include "atlalloc.h"
 
 #ifdef _MSC_VER
 // It is common to use this in ATL constructors. They only store this for 
later use, so the usage is safe.
@@ -817,91 +818,38 @@
 
 extern CAtlWinModule _AtlWinModule;
 
-
-// TODO: When someone needs it, make the allocator a template, so you can use 
it for both
-//       CoTask* allocations, and CRT-like allocations (malloc, realloc, free)
+class CComAllocator
+{
+public:
+    static void* Allocate(_In_ size_t size)
+    {
+        return ::CoTaskMemAlloc(size);
+    }
+
+    static void* Reallocate(_In_opt_ void* ptr, _In_ size_t size)
+    {
+        return ::CoTaskMemRealloc(ptr, size);
+    }
+
+    static void Free(_In_opt_ void* ptr)
+    {
+        ::CoTaskMemFree(ptr);
+    }
+};
+
+
 template<class T>
-class CComHeapPtr
-{
-public:
-    CComHeapPtr() :
-        m_Data(NULL)
+class CComHeapPtr : public CHeapPtr<T, CComAllocator>
+{
+public:
+    CComHeapPtr()
     {
     }
 
     explicit CComHeapPtr(T *lp) :
-        m_Data(lp)
-    {
-    }
-
-    explicit CComHeapPtr(CComHeapPtr<T> &lp)
-    {
-        m_Data = lp.Detach();
-    }
-
-    ~CComHeapPtr()
-    {
-        Release();
-    }
-
-    T *operator = (CComHeapPtr<T> &lp)
-    {
-        if (lp.m_Data != m_Data)
-            Attach(lp.Detach());
-        return *this;
-    }
-
-    bool Allocate(size_t nElements = 1)
-    {
-        ATLASSERT(m_Data == NULL);
-        m_Data = static_cast<T*>(::CoTaskMemAlloc(nElements * sizeof(T)));
-        return m_Data != NULL;
-    }
-
-    bool Reallocate(_In_ size_t nElements)
-    {
-        T* newData = static_cast<T*>(::CoTaskMemRealloc(m_Data, nElements * 
sizeof(T)));
-        if (newData == NULL)
-            return false;
-        m_Data = newData;
-        return true;
-    }
-
-    void Release()
-    {
-        if (m_Data)
-        {
-            ::CoTaskMemFree(m_Data);
-            m_Data = NULL;
-        }
-    }
-
-    void Attach(T *lp)
-    {
-        Release();
-        m_Data = lp;
-    }
-
-    T *Detach()
-    {
-        T *saveP = m_Data;
-        m_Data = NULL;
-        return saveP;
-    }
-
-    T **operator &()
-    {
-        ATLASSERT(m_Data == NULL);
-        return &m_Data;
-    }
-
-    operator T* () const
-    {
-        return m_Data;
-    }
-
-protected:
-    T *m_Data;
+        CHeapPtr<T, CComAllocator>(lp)
+    {
+    }
 };
 
 


Reply via email to