source: icXML/icXML-devel/src/icxmlc/MemoryPool.hpp @ 2720

Last change on this file since 2720 was 2720, checked in by cameron, 6 years ago

Initial check-in of icXML 0.8 source files

File size: 2.5 KB
Line 
1/*
2 *  Copyright © 2012 International Characters.
3 *  This software is licensed to the public under the Open Software License 3.0.
4 *  icXML is a trademark of International Characters.
5 */
6
7/*
8 * @author Nigel Medforth, nigelm -at- interational-characters.com
9 * @version $Id: MemoryPool.hpp 207 2012-12-02 20:38:22Z robc $
10 *
11 */
12
13#ifndef MEMORYPOOL_HPP
14#define MEMORYPOOL_HPP
15
16#include <icxmlc/Array.hpp>
17
18template <typename T, int initialCapacity>
19class ImmutableDynamicArray
20{
21public:
22                ImmutableDynamicArray();
23
24                ~ImmutableDynamicArray();
25
26                const T * add
27                (
28                        const T & data
29                );
30
31                void flushAll();
32
33                inline size_t available() const { return fSpaceAvail; }
34
35private:
36
37                void extend(const size_t minimumSize);
38
39private:
40
41                struct MemoryNode
42                {
43                        MemoryNode *                                            next;
44                        size_t                                                          size;
45                        T                                                                       array[initialCapacity];
46                };
47
48                MemoryNode                                                              fStackMemory;
49                MemoryNode *                                                    fCurrentPool;
50                T *                                                                             fInsertionPtr;
51                size_t                                                                  fSpaceAvail;
52                size_t                                                                  fTotalSize;
53};
54
55
56#define MEMORY_POOL(retType) \
57        template <typename T, int BasePoolSize> \
58        retType \
59        MemoryPool<T, BasePoolSize>
60
61
62MEMORY_POOL()::
63MemoryPool()
64{
65        fStackMemory.fNextPool = NULL;
66        fStackMemory.fSize = BasePoolSize;
67        fTotalSize = BasePoolSize;
68        fInsertionPtr = fStackMemory.fMemory;
69        fSpaceAvail = BasePoolSize;
70        fCurrentPool = &fStackMemory;
71        fMemoryManager = manager;
72}
73
74MEMORY_POOL()::
75~MemoryPool()
76{
77        flushAll();
78}
79
80MEMORY_POOL(void)::
81flushAll()
82{
83        while (fCurrentPool != &fStackMemory)
84        {
85                MemoryNode * node = fCurrentPool;
86                fCurrentPool = node->fNextPool;
87                Array<uint8_t>::deallocate((uint8_t*)node);
88        }
89
90        fStackMemory.fNextPool = NULL;
91        fTotalSize = BasePoolSize * sizeof(T);
92        fInsertionPtr = fStackMemory.fMemory;
93        fSpaceAvail = BasePoolSize * sizeof(T);
94}
95
96MEMORY_POOL(void)::
97extend(const size_t minimumSize)
98{
99        const unsigned int additionalCapacity =
100                (max(minimumSize, fTotalSize) * sizeof(T))
101                        + (sizeof(MemoryNode) - (BasePoolSize * sizeof(T)));
102
103
104
105        MemoryNode * node = (MemoryNode *)
106                Array::allocate<uint8_t>(additionalCapacity);
107
108        node->fNextPool = fCurrentPool;
109        node->fSize = additionalCapacity;
110        fTotalSize += additionalCapacity;
111        fCurrentPool = node;
112        fInsertionPtr = node->fMemory;
113        fSpaceAvail = additionalCapacity;
114}
115
116MEMORY_POOL(const T *)::
117add(const T & entry)
118{
119        if (unlikely(length >= fSpaceAvail))
120        {
121                extendPool(fTotalSize);
122        }
123
124        const T * retVal = fInsertionPtr;
125
126        Array<T>::copy(string, fInsertionPtr, sizeof(T));
127        fInsertionPtr = &fInsertionPtr[length];
128        fSpaceAvail -= sizeof(T);
129
130        return retVal;
131}
132
133#endif // MEMORYPOOL_HPP
Note: See TracBrowser for help on using the repository browser.