mymemory: kill system_free()
[model-checker.git] / mymemory.h
1 /** @file mymemory.h
2  *  @brief Memory allocation functions.
3  */
4
5 #ifndef _MY_MEMORY_H
6 #define _MY_MEMORY_H
7 #include <stdlib.h>
8 #include <limits>
9
10 /** MEMALLOC declares the allocators for a class to allocate
11  *      memory in the non-snapshotting heap. */
12 #define MEMALLOC \
13         void * operator new(size_t size) { \
14                 return model_malloc(size); \
15         } \
16         void operator delete(void *p, size_t size) { \
17                 model_free(p); \
18         } \
19         void * operator new[](size_t size) { \
20                 return model_malloc(size); \
21         } \
22         void operator delete[](void *p, size_t size) { \
23                 model_free(p); \
24         }
25
26 /** SNAPSHOTALLOC declares the allocators for a class to allocate
27  *      memory in the snapshotting heap. */
28 #define SNAPSHOTALLOC \
29         void * operator new(size_t size) { \
30                 return snapshot_malloc(size); \
31         } \
32         void operator delete(void *p, size_t size) { \
33                 snapshot_free(p); \
34         } \
35         void * operator new[](size_t size) { \
36                 return snapshot_malloc(size); \
37         } \
38         void operator delete[](void *p, size_t size) { \
39                 snapshot_free(p); \
40         }
41
42 void *model_malloc(size_t size);
43 void *model_calloc(size_t count, size_t size);
44 void model_free(void *ptr);
45
46 void * snapshot_malloc(size_t size);
47 void * snapshot_calloc(size_t count, size_t size);
48 void snapshot_free(void *ptr);
49
50 void *system_malloc( size_t size );
51
52 /** @brief Provides a non-snapshotting allocator for use in STL classes.
53  *
54  * The code was adapted from a code example from the book The C++
55  * Standard Library - A Tutorial and Reference by Nicolai M. Josuttis,
56  * Addison-Wesley, 1999 © Copyright Nicolai M. Josuttis 1999
57  * Permission to copy, use, modify, sell and distribute this software
58  * is granted provided this copyright notice appears in all copies.
59  * This software is provided "as is" without express or implied
60  * warranty, and with no claim as to its suitability for any purpose.
61  */
62 template <class T>
63 class ModelAlloc {
64  public:
65         // type definitions
66         typedef T        value_type;
67         typedef T*       pointer;
68         typedef const T* const_pointer;
69         typedef T&       reference;
70         typedef const T& const_reference;
71         typedef size_t   size_type;
72         typedef size_t   difference_type;
73
74         // rebind allocator to type U
75         template <class U>
76         struct rebind {
77                 typedef ModelAlloc<U> other;
78         };
79
80         // return address of values
81         pointer address(reference value) const {
82                 return &value;
83         }
84         const_pointer address(const_reference value) const {
85                 return &value;
86         }
87
88         /* constructors and destructor
89          * - nothing to do because the allocator has no state
90          */
91         ModelAlloc() throw() {
92         }
93         ModelAlloc(const ModelAlloc&) throw() {
94         }
95         template <class U>
96         ModelAlloc(const ModelAlloc<U>&) throw() {
97         }
98         ~ModelAlloc() throw() {
99         }
100
101         // return maximum number of elements that can be allocated
102         size_type max_size() const throw() {
103                 return std::numeric_limits<size_t>::max() / sizeof(T);
104         }
105
106         // allocate but don't initialize num elements of type T
107         pointer allocate(size_type num, const void * = 0) {
108                 pointer p = (pointer)model_malloc(num * sizeof(T));
109                 return p;
110         }
111
112         // initialize elements of allocated storage p with value value
113         void construct(pointer p, const T& value) {
114                 // initialize memory with placement new
115                 new((void*)p)T(value);
116         }
117
118         // destroy elements of initialized storage p
119         void destroy(pointer p) {
120                 // destroy objects by calling their destructor
121                 p->~T();
122         }
123
124         // deallocate storage p of deleted elements
125         void deallocate(pointer p, size_type num) {
126                 model_free((void*)p);
127         }
128 };
129
130 /** Return that all specializations of this allocator are interchangeable. */
131 template <class T1, class T2>
132 bool operator== (const ModelAlloc<T1>&,
133                 const ModelAlloc<T2>&) throw() {
134         return true;
135 }
136
137 /** Return that all specializations of this allocator are interchangeable. */
138 template <class T1, class T2>
139 bool operator!= (const ModelAlloc<T1>&,
140                 const ModelAlloc<T2>&) throw() {
141         return false;
142 }
143
144 #ifdef __cplusplus
145 extern "C" {
146 #endif
147 typedef void * mspace;
148 extern void* mspace_malloc(mspace msp, size_t bytes);
149 extern void mspace_free(mspace msp, void* mem);
150 extern void* mspace_realloc(mspace msp, void* mem, size_t newsize);
151 extern void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size);
152 extern mspace create_mspace_with_base(void* base, size_t capacity, int locked);
153 extern mspace create_mspace(size_t capacity, int locked);
154 extern mspace mySpace;
155 #ifdef __cplusplus
156 };  /* end of extern "C" */
157 #endif
158
159 #endif /* _MY_MEMORY_H */