Blame | Last modification | View Log | Download | RSS feed
#include "JSONMemory.h"#ifdef JSON_MEMORY_MANAGE#include "JSONNode.h"void auto_expand::purge(void) json_nothrow {for(JSON_MAP(void *, void *)::iterator i = mymap.begin(), en = mymap.end(); i != en; ++i){#if defined(JSON_DEBUG) || defined(JSON_SAFE)void * temp = (void*)i -> first; //because its pass by referencelibjson_free<void>(temp);#elselibjson_free<void>((void*)i -> first);#endif}}void auto_expand_node::purge(void) json_nothrow {for(JSON_MAP(void *, JSONNode *)::iterator i = mymap.begin(), en = mymap.end(); i != en; ++i){JSONNode::deleteJSONNode((JSONNode *)i -> second);}}#ifdef JSON_STREAM#include "JSONStream.h"void auto_expand_stream::purge(void) json_nothrow {for(JSON_MAP(void *, JSONStream *)::iterator i = mymap.begin(), en = mymap.end(); i != en; ++i){JSONStream::deleteJSONStream((JSONStream *)i -> second);}}#endif#endif#if defined(JSON_MEMORY_CALLBACKS) || defined(JSON_MEMORY_POOL)#ifdef JSON_MEMORY_POOL#include "JSONMemoryPool.h"static bucket_pool_8<MEMPOOL_1, MEMPOOL_2, MEMPOOL_3, MEMPOOL_4, MEMPOOL_5, MEMPOOL_6, MEMPOOL_7, MEMPOOL_8> json_generic_mempool;//This class is only meant to initiate the mempool to start out using std::malloc/realloc/freeclass mempool_callback_setter {public:LIBJSON_OBJECT(mempool_callback_setter);inline mempool_callback_setter(void) json_nothrow {` LIBJSON_CTOR;mempool_callbacks::set(std::malloc, std::realloc, std::free);}private:inline mempool_callback_setter(const mempool_callback_setter & o);inline mempool_callback_setter & operator = (const mempool_callback_setter & o);};static mempool_callback_setter __mempoolcallbacksetter;#endif#include "JSONSingleton.h"void * JSONMemory::json_malloc(size_t siz) json_nothrow {#ifdef JSON_MEMORY_POOLreturn json_generic_mempool.allocate(siz);#elseif (json_malloc_t callback = JSONSingleton<json_malloc_t>::get()){#if(defined(JSON_DEBUG) && (!defined(JSON_MEMORY_CALLBACKS))) //in debug mode without mem callback, see if the malloc was successfulvoid * result = callback(siz);JSON_ASSERT(result, JSON_TEXT("Out of memory"));return result;#elsereturn callback(siz);#endif}#if(defined(JSON_DEBUG) && (!defined(JSON_MEMORY_CALLBACKS))) //in debug mode without mem callback, see if the malloc was successfulvoid * result = std::malloc(siz);JSON_ASSERT(result, JSON_TEXT("Out of memory"));return result;#elsereturn std::malloc(siz);#endif#endif}void JSONMemory::json_free(void * ptr) json_nothrow {#ifdef JSON_MEMORY_POOLjson_generic_mempool.deallocate(ptr);#elseif (json_free_t callback = JSONSingleton<json_free_t>::get()){callback(ptr);} else {std::free(ptr);}#endif}void * JSONMemory::json_realloc(void * ptr, size_t siz) json_nothrow {#ifdef JSON_MEMORY_POOLreturn json_generic_mempool.reallocate(ptr, siz);#elseif (json_realloc_t callback = JSONSingleton<json_realloc_t>::get()){#if(defined(JSON_DEBUG) && (!defined(JSON_MEMORY_CALLBACKS))) //in debug mode without mem callback, see if the malloc was successfulvoid * result = callback(ptr, siz);JSON_ASSERT(result, JSON_TEXT("Out of memory"));return result;#elsereturn callback(ptr, siz);#endif}#if(defined(JSON_DEBUG) && (!defined(JSON_MEMORY_CALLBACKS))) //in debug mode without mem callback, see if the malloc was successfulvoid * result = std::realloc(ptr, siz);JSON_ASSERT(result, JSON_TEXT("Out of memory"));return result;#elsereturn std::realloc(ptr, siz);#endif#endif}#ifdef JSON_MEMORY_POOL//it is okay to pass null to these callbacks, no make sure they function existsstatic void * malloc_proxy(size_t siz) json_nothrow {if (json_malloc_t callback = JSONSingleton<json_malloc_t>::get()){return callback(siz);}return std::malloc(siz);}static void * realloc_proxy(void * ptr, size_t siz) json_nothrow {if (json_realloc_t callback = JSONSingleton<json_realloc_t>::get()){return callback(ptr, siz);}return std::realloc(ptr, siz);}static void free_proxy(void * ptr){if (json_free_t callback = JSONSingleton<json_free_t>::get()){callback(ptr);} else {std::free(ptr);}}#endifvoid JSONMemory::registerMemoryCallbacks(json_malloc_t mal, json_realloc_t real, json_free_t fre) json_nothrow {JSONSingleton<json_malloc_t>::set(mal);JSONSingleton<json_realloc_t>::set(real);JSONSingleton<json_free_t>::set(fre);#ifdef JSON_MEMORY_POOLmempool_callbacks::set(malloc_proxy, realloc_proxy, free_proxy);#endif}#endif