X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/9185d5ef70289d99e212f2dd04457b05716e222e..0cfdb323b24a4f14f7eef842675dc5ae1dc09201:/Pooling.hpp diff --git a/Pooling.hpp b/Pooling.hpp index 84adad2..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) +*/ + +/* 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 . +**/ +/* }}} */ + +#ifndef CYCRIPT_POOLING_HPP +#define CYCRIPT_POOLING_HPP #include #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() { - _aprcall(apr_pool_create(&pool_, NULL)); + CYPool(apr_pool_t *pool = NULL) { + _aprcall(apr_pool_create(&pool_, pool)); } ~CYPool() { @@ -46,6 +71,12 @@ class CYPool { struct CYData { apr_pool_t *pool_; + unsigned count_; + + CYData() : + count_(1) + { + } virtual ~CYData() { } @@ -65,7 +96,77 @@ 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*/ +class CYLocalPool : + public CYPool +{ + private: + CYLocal local_; + + public: + CYLocalPool() : + CYPool(), + local_(operator apr_pool_t *()) + { + } +}; + +#define $pool \ + CYLocal::Get() + +#endif/*CYCRIPT_POOLING_HPP*/