X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/4644480a22eda2f7350a8997bb2109f325b576fe..15024d7e7c224d837592094932a2da18d17ee015:/Pooling.hpp diff --git a/Pooling.hpp b/Pooling.hpp index 4fa5dae..a182906 100644 --- a/Pooling.hpp +++ b/Pooling.hpp @@ -1,4 +1,4 @@ -/* Cycript - Remote Execution Server and Disassembler +/* Cycript - Inlining/Optimizing JavaScript Compiler * Copyright (C) 2009 Jay Freeman (saurik) */ @@ -43,7 +43,10 @@ #include #include -#include +#include "Exception.hpp" +#include "Standard.hpp" + +#include _finline void *operator new(size_t size, apr_pool_t *pool) { return apr_palloc(pool, size); @@ -85,6 +88,12 @@ class CYPool { struct CYData { apr_pool_t *pool_; + unsigned count_; + + CYData() : + count_(1) + { + } virtual ~CYData() { } @@ -104,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*/