X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/b1ff2d781f508d4538ed628218c4ac2860940671..3530897b0e384dd614bfef0a446b343e00a6616b:/Pooling.hpp diff --git a/Pooling.hpp b/Pooling.hpp index 97bd172..a182906 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 + +#include "Exception.hpp" +#include "Standard.hpp" -#include +#include _finline void *operator new(size_t size, apr_pool_t *pool) { return apr_palloc(pool, size); @@ -20,7 +62,7 @@ class CYPool { public: CYPool() { - apr_pool_create(&pool_, NULL); + _aprcall(apr_pool_create(&pool_, NULL)); } ~CYPool() { @@ -44,4 +86,87 @@ class CYPool { } }; +struct CYData { + apr_pool_t *pool_; + unsigned count_; + + CYData() : + count_(1) + { + } + + virtual ~CYData() { + } + + static void *operator new(size_t size, apr_pool_t *pool) { + void *data(apr_palloc(pool, size)); + reinterpret_cast(data)->pool_ = pool; + return data; + } + + static void *operator new(size_t size) { + apr_pool_t *pool; + _aprcall(apr_pool_create(&pool, NULL)); + return operator new(size, pool); + } + + 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*/