summaryrefslogtreecommitdiff
path: root/boost/asio/detail/object_pool.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/asio/detail/object_pool.hpp')
-rw-r--r--boost/asio/detail/object_pool.hpp25
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)
{