X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/e91fbe93b995ee8077bbc2097c5407138dc02627..1850a470682f2bbbec1587adacfb1bb4320f30dc:/Pooling.hpp diff --git a/Pooling.hpp b/Pooling.hpp index f4045ab..a182906 100644 --- a/Pooling.hpp +++ b/Pooling.hpp @@ -46,6 +46,8 @@ #include "Exception.hpp" #include "Standard.hpp" +#include + _finline void *operator new(size_t size, apr_pool_t *pool) { return apr_palloc(pool, size); } @@ -86,6 +88,12 @@ class CYPool { struct CYData { apr_pool_t *pool_; + unsigned count_; + + CYData() : + count_(1) + { + } virtual ~CYData() { } @@ -105,7 +113,60 @@ struct CYData { static void operator delete(void *data) { apr_pool_destroy(reinterpret_cast(data)->pool_); } +}; + +template +struct CYPoolAllocator { + apr_pool_t *pool_; + + typedef Type_ value_type; + typedef value_type *pointer; + typedef const value_type *const_pointer; + typedef value_type &reference; + typedef const value_type &const_reference; + typedef std::size_t size_type; + typedef std::ptrdiff_t difference_type; + + CYPoolAllocator() : + pool_(NULL) + { + } + + template + CYPoolAllocator(const CYPoolAllocator &rhs) : + pool_(rhs.pool_) + { + } + + pointer allocate(size_type size, const void *hint = 0) { + return reinterpret_cast(apr_palloc(pool_, size)); + } + + void deallocate(pointer data, size_type size) { + } + + void construct(pointer address, const Type_ &rhs) { + new(address) Type_(rhs); + } + + void destroy(pointer address) { + address->~Type_(); + } + + template + inline bool operator==(const CYPoolAllocator &rhs) { + return pool_ == rhs.pool_; + } + + template + inline bool operator!=(const CYPoolAllocator &rhs) { + return !operator==(rhs); + } + template + struct rebind { + typedef CYPoolAllocator other; + }; }; #endif/*CYPOOLING_HPP*/