summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorfrsyuki <frsyuki@users.sourceforge.jp>2009-12-16 03:52:14 +0900
committerfrsyuki <frsyuki@users.sourceforge.jp>2009-12-16 03:52:14 +0900
commit5aa47d667783476277409b06d5829322a801df05 (patch)
tree67167df574c99d421fee211da6d0060f51af2e82 /cpp
parent0d44348c7dabdbfee4ac1ee17bfb141dfe8706f2 (diff)
downloadmsgpack-python-5aa47d667783476277409b06d5829322a801df05.tar.gz
cpp: zone::push_finalizer supports std::auto_ptr<T>
Diffstat (limited to 'cpp')
-rw-r--r--cpp/zone.hpp.erb13
1 files changed, 13 insertions, 0 deletions
diff --git a/cpp/zone.hpp.erb b/cpp/zone.hpp.erb
index 8fd14a6..f1e4624 100644
--- a/cpp/zone.hpp.erb
+++ b/cpp/zone.hpp.erb
@@ -21,6 +21,7 @@
#include "msgpack/object.hpp"
#include "msgpack/zone.h"
#include <cstdlib>
+#include <memory>
#include <vector>
<% GENERATION_LIMIT = 15 %>
@@ -38,6 +39,9 @@ public:
void push_finalizer(void (*func)(void*), void* data);
+ template <typename T>
+ void push_finalizer(std::auto_ptr<T> obj);
+
void clear();
<%0.upto(GENERATION_LIMIT) {|i|%>
@@ -94,6 +98,15 @@ inline void zone::push_finalizer(void (*func)(void*), void* data)
}
}
+template <typename T>
+inline void zone::push_finalizer(std::auto_ptr<T> obj)
+{
+ if(!msgpack_zone_push_finalizer(this, &zone::object_destructor<T>, obj.get())) {
+ throw std::bad_alloc();
+ }
+ obj.release();
+}
+
inline void zone::clear()
{
msgpack_zone_clear(this);