From b8ef0afc1d27501292b778d585f5a0786e9181a2 Mon Sep 17 00:00:00 2001 From: Danny Robson Date: Wed, 22 Aug 2012 16:12:26 +1000 Subject: [PATCH] Move pool implementation to ipp file --- Makefile.am | 1 + pool.hpp | 65 +++++------------------------------- pool.ipp | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 106 insertions(+), 56 deletions(-) create mode 100644 pool.ipp diff --git a/Makefile.am b/Makefile.am index 2acd472c..5ef85581 100644 --- a/Makefile.am +++ b/Makefile.am @@ -90,6 +90,7 @@ UTIL_FILES = \ point.hpp \ pool.cpp \ pool.hpp \ + pool.ipp \ preprocessor.hpp \ quaternion.cpp \ quaternion.hpp \ diff --git a/pool.hpp b/pool.hpp index db21c438..2f187b9f 100644 --- a/pool.hpp +++ b/pool.hpp @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with libgim. If not, see . * - * Copyright 2011 Danny Robson + * Copyright 2011-2012 Danny Robson */ #ifndef __UTIL_POOL_HPP @@ -23,7 +23,7 @@ #include "nocopy.hpp" namespace util { -template + template class pool : public nocopy { protected: union node { @@ -36,65 +36,18 @@ template unsigned int m_capacity; public: - pool (unsigned int _capacity): - m_capacity (_capacity) - { - static_assert (sizeof (T) >= sizeof (uintptr_t), - "pool's chained block system requires that T be at least pointer sized"); - - m_head = (node *)operator new (sizeof (T) * m_capacity); - m_next = m_head; - - for (unsigned int i = 0; i < m_capacity - 1; ++i) - m_next[i]._chain = &m_next[i + 1]; - m_next[m_capacity - 1]._chain = NULL; - } - - - ~pool () { - CHECK (m_next != NULL); - - unsigned int doomed_count = 0; - for (node *cursor = m_next; cursor != NULL; cursor = cursor->_chain) - ++doomed_count; - - CHECK_EQ (doomed_count, m_capacity); - operator delete (m_head); - } - - - unsigned int capacity (void) const - { return m_capacity; } + pool (unsigned int _capacity); + ~pool (); + unsigned int capacity (void) const; template - T* acquire (Args&... args) { - if (!m_next) - throw std::bad_alloc (); + T* acquire (Args&... args); - node *newnext = m_next->_chain; - T *data = (T*)&m_next->_data; - - try { - new (data) T (args...); - } catch (...) { - m_next->_chain = newnext; - throw; - } - - m_next = newnext; - return data; - } - - - void release (T *data) { - data->~T(); - node *newnode = (node *)data; - - newnode->_chain = m_next; - m_next = newnode; - } + void release (T *data); }; } +#include "pool.ipp" + #endif // __UTIL_POOL_HPP diff --git a/pool.ipp b/pool.ipp new file mode 100644 index 00000000..28de9f5b --- /dev/null +++ b/pool.ipp @@ -0,0 +1,96 @@ +/* + * This file is part of libgim. + * + * libgim 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. + * + * libgim 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 libgim. If not, see . + * + * Copyright 2011-2012 Danny Robson + */ + +#ifdef __UTIL_POOL_IPP +#error Double inclusion of pool.ipp +#endif + +#define __UTIL_POOL_IPP + + +namespace util { + template + pool::pool (unsigned int _capacity): + m_capacity (_capacity) + { + static_assert (sizeof (T) >= sizeof (uintptr_t), + "pool's chained block system requires that T be at least pointer sized"); + + m_head = (node *)operator new (sizeof (T) * m_capacity); + m_next = m_head; + + for (unsigned int i = 0; i < m_capacity - 1; ++i) + m_next[i]._chain = &m_next[i + 1]; + m_next[m_capacity - 1]._chain = NULL; + } + + + template + pool::~pool () { + CHECK (m_next != NULL); + + unsigned int doomed_count = 0; + for (node *cursor = m_next; cursor != NULL; cursor = cursor->_chain) + ++doomed_count; + + CHECK_EQ (doomed_count, m_capacity); + operator delete (m_head); + } + + + template + unsigned int + pool::capacity (void) const + { return m_capacity; } + + + template + template + T* + pool::acquire (Args&... args) { + if (!m_next) + throw std::bad_alloc (); + + node *newnext = m_next->_chain; + T *data = (T*)&m_next->_data; + + try { + new (data) T (args...); + } catch (...) { + m_next->_chain = newnext; + throw; + } + + m_next = newnext; + return data; + } + + + template + void + pool::release (T *data) { + data->~T(); + node *newnode = (node *)data; + + newnode->_chain = m_next; + m_next = newnode; + } +} + +