diff options
Diffstat (limited to 'boost/asio/detail/object_pool.hpp')
-rw-r--r-- | boost/asio/detail/object_pool.hpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/boost/asio/detail/object_pool.hpp b/boost/asio/detail/object_pool.hpp index 692efed09d..3affeb8dab 100644 --- a/boost/asio/detail/object_pool.hpp +++ b/boost/asio/detail/object_pool.hpp @@ -35,6 +35,12 @@ public: return new Object; } + template <typename Object, typename Arg> + static Object* create(Arg arg) + { + return new Object(arg); + } + template <typename Object> static void destroy(Object* o) { @@ -97,6 +103,25 @@ public: return o; } + // Allocate a new object with an argument. + template <typename Arg> + Object* alloc(Arg arg) + { + Object* o = free_list_; + if (o) + free_list_ = object_pool_access::next(free_list_); + else + o = object_pool_access::create<Object>(arg); + + object_pool_access::next(o) = live_list_; + object_pool_access::prev(o) = 0; + if (live_list_) + object_pool_access::prev(live_list_) = o; + live_list_ = o; + + return o; + } + // Free an object. Moves it to the free list. No destructors are run. void free(Object* o) { |