X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/b1ff2d781f508d4538ed628218c4ac2860940671..e71ad0798f509366384257df77b925b33ab5ef66:/Pooling.hpp diff --git a/Pooling.hpp b/Pooling.hpp index 97bd172..a8c1fd9 100644 --- a/Pooling.hpp +++ b/Pooling.hpp @@ -1,10 +1,35 @@ -#ifndef CYPOOLING_HPP -#define CYPOOLING_HPP +/* Cycript - Optimizing JavaScript Compiler/Runtime + * Copyright (C) 2009-2013 Jay Freeman (saurik) +*/ -#include -#include +/* GNU General Public License, Version 3 {{{ */ +/* + * Cycript is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * Cycript is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Cycript. If not, see . +**/ +/* }}} */ -#include +#ifndef CYCRIPT_POOLING_HPP +#define CYCRIPT_POOLING_HPP + +#include +#include + +#include "Exception.hpp" +#include "Local.hpp" +#include "Standard.hpp" + +#include _finline void *operator new(size_t size, apr_pool_t *pool) { return apr_palloc(pool, size); @@ -19,8 +44,8 @@ class CYPool { apr_pool_t *pool_; public: - CYPool() { - apr_pool_create(&pool_, NULL); + CYPool(apr_pool_t *pool = NULL) { + _aprcall(apr_pool_create(&pool_, pool)); } ~CYPool() { @@ -44,4 +69,104 @@ class CYPool { } }; -#endif/*CYPOOLING_HPP*/ +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; + }; +}; + +class CYLocalPool : + public CYPool +{ + private: + CYLocal local_; + + public: + CYLocalPool() : + CYPool(), + local_(operator apr_pool_t *()) + { + } +}; + +#define $pool \ + CYLocal::Get() + +#endif/*CYCRIPT_POOLING_HPP*/