+/** @file mymemory.h
+ * @brief Memory allocation functions.
+ */
+
#ifndef _MY_MEMORY_H
#define _MY_MEMORY_H
#include <stdlib.h>
#include <limits>
+
+/** MEMALLOC declares the allocators for a class to allocate
+ * memory in the non-snapshotting heap. */
#define MEMALLOC \
void * operator new(size_t size) { \
- return MYMALLOC(size);\
- }\
+ return model_malloc(size); \
+ } \
+ void operator delete(void *p, size_t size) { \
+ model_free(p); \
+ } \
+ void * operator new[](size_t size) { \
+ return model_malloc(size); \
+ } \
+ void operator delete[](void *p, size_t size) { \
+ model_free(p); \
+ }
+
+/** SNAPSHOTALLOC declares the allocators for a class to allocate
+ * memory in the snapshotting heap. */
+#define SNAPSHOTALLOC \
+ void * operator new(size_t size) { \
+ return snapshot_malloc(size); \
+ } \
void operator delete(void *p, size_t size) { \
- MYFREE( p ); \
- }\
+ snapshot_free(p); \
+ } \
void * operator new[](size_t size) { \
- return MYMALLOC(size);\
- }\
- void operator delete[](void *p, size_t size) {\
- MYFREE(p);\
+ return snapshot_malloc(size); \
+ } \
+ void operator delete[](void *p, size_t size) { \
+ snapshot_free(p); \
}
-void *MYMALLOC(size_t size);
-void MYFREE(void *ptr);
-
-/*
-The following code example is taken from the book
-The C++ Standard Library - A Tutorial and Reference
-by Nicolai M. Josuttis, Addison-Wesley, 1999
-© Copyright Nicolai M. Josuttis 1999
-Permission to copy, use, modify, sell and distribute this software
-is granted provided this copyright notice appears in all copies.
-This software is provided "as is" without express or implied
-warranty, and with no claim as to its suitability for any purpose.
-*/
+void *model_malloc(size_t size);
+void *model_calloc(size_t count, size_t size);
+void model_free(void *ptr);
+
+void * snapshot_malloc(size_t size);
+void * snapshot_calloc(size_t count, size_t size);
+void snapshot_free(void *ptr);
+
+void system_free( void * ptr );
+void *system_malloc( size_t size );
+
+/** @brief Provides a non-snapshotting allocator for use in STL classes.
+ *
+ * The code was adapted from a code example from the book The C++
+ * Standard Library - A Tutorial and Reference by Nicolai M. Josuttis,
+ * Addison-Wesley, 1999 © Copyright Nicolai M. Josuttis 1999
+ * Permission to copy, use, modify, sell and distribute this software
+ * is granted provided this copyright notice appears in all copies.
+ * This software is provided "as is" without express or implied
+ * warranty, and with no claim as to its suitability for any purpose.
+ */
template <class T>
- class MyAlloc {
+ class ModelAlloc {
public:
// type definitions
typedef T value_type;
// rebind allocator to type U
template <class U>
struct rebind {
- typedef MyAlloc<U> other;
+ typedef ModelAlloc<U> other;
};
// return address of values
/* constructors and destructor
* - nothing to do because the allocator has no state
*/
- MyAlloc() throw() {
+ ModelAlloc() throw() {
}
- MyAlloc(const MyAlloc&) throw() {
+ ModelAlloc(const ModelAlloc&) throw() {
}
template <class U>
- MyAlloc (const MyAlloc<U>&) throw() {
+ ModelAlloc (const ModelAlloc<U>&) throw() {
}
- ~MyAlloc() throw() {
+ ~ModelAlloc() throw() {
}
// return maximum number of elements that can be allocated
// allocate but don't initialize num elements of type T
pointer allocate (size_type num, const void* = 0) {
- pointer p = ( pointer )MYMALLOC( num * sizeof( T ) );
+ pointer p = ( pointer )model_malloc( num * sizeof( T ) );
return p;
}
// deallocate storage p of deleted elements
void deallocate (pointer p, size_type num) {
- MYFREE((void*)p);
+ model_free((void*)p);
}
};
-// return that all specializations of this allocator are interchangeable
+/** Return that all specializations of this allocator are interchangeable. */
template <class T1, class T2>
- bool operator== (const MyAlloc<T1>&,
- const MyAlloc<T2>&) throw() {
+ bool operator== (const ModelAlloc<T1>&,
+ const ModelAlloc<T2>&) throw() {
return true;
}
+
+/** Return that all specializations of this allocator are interchangeable. */
template <class T1, class T2>
- bool operator!= (const MyAlloc<T1>&,
- const MyAlloc<T2>&) throw() {
+ bool operator!= (const ModelAlloc<T1>&,
+ const ModelAlloc<T2>&) throw() {
return false;
}
typedef void * mspace;
extern void* mspace_malloc(mspace msp, size_t bytes);
extern void mspace_free(mspace msp, void* mem);
+extern void* mspace_realloc(mspace msp, void* mem, size_t newsize);
+extern void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size);
extern mspace create_mspace_with_base(void* base, size_t capacity, int locked);
extern mspace create_mspace(size_t capacity, int locked);
extern mspace mySpace;
+extern void * basemySpace;
#ifdef __cplusplus
}; /* end of extern "C" */
#endif
-#endif
+
+#endif /* _MY_MEMORY_H */