Chris@16: // Chris@16: // detail/object_pool.hpp Chris@16: // ~~~~~~~~~~~~~~~~~~~~~~ Chris@16: // Chris@101: // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com) Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: // Chris@16: Chris@16: #ifndef BOOST_ASIO_DETAIL_OBJECT_POOL_HPP Chris@16: #define BOOST_ASIO_DETAIL_OBJECT_POOL_HPP Chris@16: Chris@16: #if defined(_MSC_VER) && (_MSC_VER >= 1200) Chris@16: # pragma once Chris@16: #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) Chris@16: Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: namespace asio { Chris@16: namespace detail { Chris@16: Chris@16: template Chris@16: class object_pool; Chris@16: Chris@16: class object_pool_access Chris@16: { Chris@16: public: Chris@16: template Chris@16: static Object* create() Chris@16: { Chris@16: return new Object; Chris@16: } Chris@16: Chris@16: template Chris@16: static void destroy(Object* o) Chris@16: { Chris@16: delete o; Chris@16: } Chris@16: Chris@16: template Chris@16: static Object*& next(Object* o) Chris@16: { Chris@16: return o->next_; Chris@16: } Chris@16: Chris@16: template Chris@16: static Object*& prev(Object* o) Chris@16: { Chris@16: return o->prev_; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: class object_pool Chris@16: : private noncopyable Chris@16: { Chris@16: public: Chris@16: // Constructor. Chris@16: object_pool() Chris@16: : live_list_(0), Chris@16: free_list_(0) Chris@16: { Chris@16: } Chris@16: Chris@16: // Destructor destroys all objects. Chris@16: ~object_pool() Chris@16: { Chris@16: destroy_list(live_list_); Chris@16: destroy_list(free_list_); Chris@16: } Chris@16: Chris@16: // Get the object at the start of the live list. Chris@16: Object* first() Chris@16: { Chris@16: return live_list_; Chris@16: } Chris@16: Chris@16: // Allocate a new object. Chris@16: Object* alloc() Chris@16: { Chris@16: Object* o = free_list_; Chris@16: if (o) Chris@16: free_list_ = object_pool_access::next(free_list_); Chris@16: else Chris@16: o = object_pool_access::create(); Chris@16: Chris@16: object_pool_access::next(o) = live_list_; Chris@16: object_pool_access::prev(o) = 0; Chris@16: if (live_list_) Chris@16: object_pool_access::prev(live_list_) = o; Chris@16: live_list_ = o; Chris@16: Chris@16: return o; Chris@16: } Chris@16: Chris@16: // Free an object. Moves it to the free list. No destructors are run. Chris@16: void free(Object* o) Chris@16: { Chris@16: if (live_list_ == o) Chris@16: live_list_ = object_pool_access::next(o); Chris@16: Chris@16: if (object_pool_access::prev(o)) Chris@16: { Chris@16: object_pool_access::next(object_pool_access::prev(o)) Chris@16: = object_pool_access::next(o); Chris@16: } Chris@16: Chris@16: if (object_pool_access::next(o)) Chris@16: { Chris@16: object_pool_access::prev(object_pool_access::next(o)) Chris@16: = object_pool_access::prev(o); Chris@16: } Chris@16: Chris@16: object_pool_access::next(o) = free_list_; Chris@16: object_pool_access::prev(o) = 0; Chris@16: free_list_ = o; Chris@16: } Chris@16: Chris@16: private: Chris@16: // Helper function to destroy all elements in a list. Chris@16: void destroy_list(Object* list) Chris@16: { Chris@16: while (list) Chris@16: { Chris@16: Object* o = list; Chris@16: list = object_pool_access::next(o); Chris@16: object_pool_access::destroy(o); Chris@16: } Chris@16: } Chris@16: Chris@16: // The list of live objects. Chris@16: Object* live_list_; Chris@16: Chris@16: // The free list. Chris@16: Object* free_list_; Chris@16: }; Chris@16: Chris@16: } // namespace detail Chris@16: } // namespace asio Chris@16: } // namespace boost Chris@16: Chris@16: #include Chris@16: Chris@16: #endif // BOOST_ASIO_DETAIL_OBJECT_POOL_HPP