aboutsummaryrefslogtreecommitdiff
path: root/libxsde/xsde/cxx/hybrid/cdr/istream.txx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2010-05-11 12:20:11 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2010-05-11 12:20:11 +0200
commit2e501c68a8641a2b3c430b55f13491a9c1c5d0f5 (patch)
tree49c2748443fe3c1f01108756b647440e0647a11b /libxsde/xsde/cxx/hybrid/cdr/istream.txx
parent161beba6cdb0d91b15ad19fa8b3e51d986203915 (diff)
Add support for custom allocators
New example: examples/cxx/hybrid/allocator.
Diffstat (limited to 'libxsde/xsde/cxx/hybrid/cdr/istream.txx')
-rw-r--r--libxsde/xsde/cxx/hybrid/cdr/istream.txx25
1 files changed, 25 insertions, 0 deletions
diff --git a/libxsde/xsde/cxx/hybrid/cdr/istream.txx b/libxsde/xsde/cxx/hybrid/cdr/istream.txx
index 58cd98b..f1d8d6c 100644
--- a/libxsde/xsde/cxx/hybrid/cdr/istream.txx
+++ b/libxsde/xsde/cxx/hybrid/cdr/istream.txx
@@ -3,6 +3,10 @@
// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC
// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+#ifdef XSDE_CUSTOM_ALLOCATOR
+# include <xsde/cxx/allocator.hxx>
+#endif
+
namespace xsde
{
namespace cxx
@@ -73,7 +77,14 @@ namespace xsde
while (n--)
{
+#ifndef XSDE_CUSTOM_ALLOCATOR
T* p = new T;
+#else
+ T* p = static_cast<T*> (alloc (sizeof (T)));
+ alloc_guard pg (p);
+ new (p) T;
+ pg.release ();
+#endif
typename var_sequence<T>::guard g (p);
s >> *p;
g.release ();
@@ -159,14 +170,28 @@ namespace xsde
while (n--)
{
+#ifndef XSDE_CUSTOM_ALLOCATOR
T* p = new T;
if (p == 0)
return false;
+#else
+ void* v = alloc (sizeof (T));
+
+ if (v == 0)
+ return false;
+
+ T* p = new (v) T; // c-tor cannot fail
+#endif
if (!(s >> *p))
{
+#ifndef XSDE_CUSTOM_ALLOCATOR
delete p;
+#else
+ p->~T ();
+ cxx::free (p);
+#endif
return false;
}