X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/9185d5ef70289d99e212f2dd04457b05716e222e..0ced2e47fe333ec4a4b1222fa298561c5479696c:/Pooling.hpp diff --git a/Pooling.hpp b/Pooling.hpp index 84adad2..d1ee2b7 100644 --- a/Pooling.hpp +++ b/Pooling.hpp @@ -1,10 +1,52 @@ +/* Cycript - Inlining/Optimizing JavaScript Compiler + * Copyright (C) 2009 Jay Freeman (saurik) +*/ + +/* Modified BSD License {{{ */ +/* + * Redistribution and use in source and binary + * forms, with or without modification, are permitted + * provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the + * above copyright notice, this list of conditions + * and the following disclaimer. + * 2. Redistributions in binary form must reproduce the + * above copyright notice, this list of conditions + * and the following disclaimer in the documentation + * and/or other materials provided with the + * distribution. + * 3. The name of the author may not be used to endorse + * or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/* }}} */ + #ifndef CYPOOLING_HPP #define CYPOOLING_HPP #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); @@ -19,8 +61,8 @@ class CYPool { apr_pool_t *pool_; public: - CYPool() { - _aprcall(apr_pool_create(&pool_, NULL)); + CYPool(apr_pool_t *pool = NULL) { + _aprcall(apr_pool_create(&pool_, pool)); } ~CYPool() { @@ -46,6 +88,12 @@ class CYPool { struct CYData { apr_pool_t *pool_; + unsigned count_; + + CYData() : + count_(1) + { + } virtual ~CYData() { } @@ -65,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*/