aboutsummaryrefslogtreecommitdiff
path: root/xsde/cxx/serializer
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 /xsde/cxx/serializer
parent161beba6cdb0d91b15ad19fa8b3e51d986203915 (diff)
Add support for custom allocators
New example: examples/cxx/hybrid/allocator.
Diffstat (limited to 'xsde/cxx/serializer')
-rw-r--r--xsde/cxx/serializer/attribute-validation-source.cxx16
-rw-r--r--xsde/cxx/serializer/cli.hxx2
-rw-r--r--xsde/cxx/serializer/element-validation-source.cxx16
-rw-r--r--xsde/cxx/serializer/elements.cxx1
-rw-r--r--xsde/cxx/serializer/generator.cxx25
-rw-r--r--xsde/cxx/serializer/name-processor.cxx1
-rw-r--r--xsde/cxx/serializer/serializer-header.cxx20
-rw-r--r--xsde/cxx/serializer/serializer-source.cxx28
8 files changed, 91 insertions, 18 deletions
diff --git a/xsde/cxx/serializer/attribute-validation-source.cxx b/xsde/cxx/serializer/attribute-validation-source.cxx
index 79ae256..7dea3c3 100644
--- a/xsde/cxx/serializer/attribute-validation-source.cxx
+++ b/xsde/cxx/serializer/attribute-validation-source.cxx
@@ -329,6 +329,7 @@ namespace CXX
<< "this->_start_attribute (ns, name);"
<< endl;
else
+ {
os << "bool r;"
<< "if (ns == 0 || *ns == '\\0')" << endl
<< "r = this->_start_attribute (name);"
@@ -336,13 +337,20 @@ namespace CXX
<< "r = this->_start_attribute (ns, name);"
<< endl
<< "if (free)"
- << "{"
- << "delete[] ns;"
- << "delete[] name;"
- << "}"
+ << "{";
+
+ if (!custom_alloc)
+ os << "delete[] ns;"
+ << "delete[] name;";
+ else
+ os << "::xsde::cxx::free (ns);"
+ << "::xsde::cxx::free (name);";
+
+ os << "}"
<< "if (!r)" << endl
<< "return;"
<< endl;
+ }
os << "this->" << eserialize (a) << " ();"
<< endl
diff --git a/xsde/cxx/serializer/cli.hxx b/xsde/cxx/serializer/cli.hxx
index d65ca1a..ca6f779 100644
--- a/xsde/cxx/serializer/cli.hxx
+++ b/xsde/cxx/serializer/cli.hxx
@@ -36,6 +36,7 @@ namespace CXX
extern Key generate_polymorphic;
extern Key runtime_polymorphic;
extern Key suppress_reset;
+ extern Key custom_allocator;
extern Key generate_empty_impl;
extern Key generate_test_driver;
extern Key force_overwrite;
@@ -98,6 +99,7 @@ namespace CXX
generate_polymorphic, Boolean,
runtime_polymorphic, Boolean,
suppress_reset, Boolean,
+ custom_allocator, Boolean,
generate_empty_impl, Boolean,
generate_test_driver, Boolean,
force_overwrite, Boolean,
diff --git a/xsde/cxx/serializer/element-validation-source.cxx b/xsde/cxx/serializer/element-validation-source.cxx
index b39fed7..ea5fec2 100644
--- a/xsde/cxx/serializer/element-validation-source.cxx
+++ b/xsde/cxx/serializer/element-validation-source.cxx
@@ -736,6 +736,7 @@ namespace CXX
<< "this->_start_element (ns, name);"
<< endl;
else
+ {
os << "bool r;"
<< "if (ns == 0 || *ns == '\\0')" << endl
<< "r = this->_start_element (name);"
@@ -743,13 +744,20 @@ namespace CXX
<< "r = this->_start_element (ns, name);"
<< endl
<< "if (free)"
- << "{"
- << "delete[] ns;"
- << "delete[] name;"
- << "}"
+ << "{";
+
+ if (!custom_alloc)
+ os << "delete[] ns;"
+ << "delete[] name;";
+ else
+ os << "::xsde::cxx::free (ns);"
+ << "::xsde::cxx::free (name);";
+
+ os << "}"
<< "if (!r)" << endl
<< "return;"
<< endl;
+ }
os << "this->" << eserialize (a) << " ();"
<< endl
diff --git a/xsde/cxx/serializer/elements.cxx b/xsde/cxx/serializer/elements.cxx
index 12a715c..5395953 100644
--- a/xsde/cxx/serializer/elements.cxx
+++ b/xsde/cxx/serializer/elements.cxx
@@ -32,6 +32,7 @@ namespace CXX
ops.value<CLI::include_regex> (),
ops.value<CLI::include_regex_trace> (),
ops.value<CLI::generate_inline> (),
+ ops.value<CLI::custom_allocator> (),
ops.value<CLI::reserved_name> ()),
options (ops),
xml_serializer (xml_serializer_),
diff --git a/xsde/cxx/serializer/generator.cxx b/xsde/cxx/serializer/generator.cxx
index 92e5197..5c94c98 100644
--- a/xsde/cxx/serializer/generator.cxx
+++ b/xsde/cxx/serializer/generator.cxx
@@ -123,6 +123,7 @@ namespace CXX
extern Key generate_polymorphic = "generate-polymorphic";
extern Key runtime_polymorphic = "runtime-polymorphic";
extern Key suppress_reset = "suppress-reset";
+ extern Key custom_allocator = "custom-allocator";
extern Key generate_empty_impl = "generate-empty-impl";
extern Key generate_test_driver = "generate-test-driver";
extern Key force_overwrite = "force-overwrite";
@@ -243,6 +244,11 @@ namespace CXX
<< " Suppress the generation of serializer reset code."
<< endl;
+ e << "--custom-allocator" << endl
+ << " Generate code that uses custom allocator functions\n"
+ << " instead of operator new/delete."
+ << endl;
+
e << "--generate-empty-impl" << endl
<< " Generate a sample serializer implementation with\n"
<< " empty function bodies."
@@ -1382,6 +1388,25 @@ namespace CXX
<< endl;
}
+ if (ops.value<CLI::custom_allocator> ())
+ {
+ hxx << "#ifndef XSDE_CUSTOM_ALLOCATOR" << endl
+ << "#error the generated code uses custom allocator while " <<
+ "the XSD/e runtime does not (reconfigure the runtime or " <<
+ "remove --custom-allocator)" << endl
+ << "#endif" << endl
+ << endl;
+ }
+ else
+ {
+ hxx << "#ifdef XSDE_CUSTOM_ALLOCATOR" << endl
+ << "#error the XSD/e runtime uses custom allocator while " <<
+ "the generated code does not (reconfigure the runtime or " <<
+ "add --custom-allocator)" << endl
+ << "#endif" << endl
+ << endl;
+ }
+
//
//
diff --git a/xsde/cxx/serializer/name-processor.cxx b/xsde/cxx/serializer/name-processor.cxx
index ec4c442..f7f63a2 100644
--- a/xsde/cxx/serializer/name-processor.cxx
+++ b/xsde/cxx/serializer/name-processor.cxx
@@ -45,6 +45,7 @@ namespace CXX
ops.value<CLI::include_regex> (),
ops.value<CLI::include_regex_trace> (),
ops.value<CLI::generate_inline> (),
+ ops.value<CLI::custom_allocator> (),
ops.value<CLI::reserved_name> ()),
skel_suffix_ (ops.value<CLI::skel_type_suffix> ()),
impl_suffix_ (ops.value<CLI::impl_type_suffix> ()),
diff --git a/xsde/cxx/serializer/serializer-header.cxx b/xsde/cxx/serializer/serializer-header.cxx
index dd20289..3a10942 100644
--- a/xsde/cxx/serializer/serializer-header.cxx
+++ b/xsde/cxx/serializer/serializer-header.cxx
@@ -1756,6 +1756,21 @@ namespace CXX
String const c (char_type);
+ // Custom allocator.
+ //
+ if (custom_alloc)
+ {
+ os << "// Custom allocator." << endl
+ << "//" << endl
+ << "using ::xsde::cxx::alloc;"
+ << "using ::xsde::cxx::free;";
+
+ if (exceptions)
+ os << "using ::xsde::cxx::alloc_guard;";
+
+ os << endl;
+ }
+
os << "// Built-in XML Schema types mapping." << endl
<< "//" << endl
<< "using ::xsde::cxx::string_sequence;"
@@ -1898,8 +1913,9 @@ namespace CXX
}
else
{
- ctx.os << "#include <xsde/config.h>" << endl
- << endl;
+ if (ctx.custom_alloc)
+ ctx.os << "#include <xsde/cxx/allocator.hxx>" << endl
+ << endl;
// std::string or xsde::cxx::string is used in wildcard API.
//
diff --git a/xsde/cxx/serializer/serializer-source.cxx b/xsde/cxx/serializer/serializer-source.cxx
index a5765a0..1dbe496 100644
--- a/xsde/cxx/serializer/serializer-source.cxx
+++ b/xsde/cxx/serializer/serializer-source.cxx
@@ -1386,10 +1386,16 @@ namespace CXX
<< "r = this->_start_element (ns, name);"
<< endl
<< "if (free)"
- << "{"
- << "delete[] ns;"
- << "delete[] name;"
- << "}"
+ << "{";
+
+ if (!custom_alloc)
+ os << "delete[] ns;"
+ << "delete[] name;";
+ else
+ os << "::xsde::cxx::free (ns);"
+ << "::xsde::cxx::free (name);";
+
+ os << "}"
<< "if (!r)" << endl
<< "return;"
<< endl
@@ -1640,10 +1646,16 @@ namespace CXX
<< "r = this->_start_attribute (ns, name);"
<< endl
<< "if (free)"
- << "{"
- << "delete[] ns;"
- << "delete[] name;"
- << "}"
+ << "{";
+
+ if (!custom_alloc)
+ os << "delete[] ns;"
+ << "delete[] name;";
+ else
+ os << "::xsde::cxx::free (ns);"
+ << "::xsde::cxx::free (name);";
+
+ os << "}"
<< "if (!r)" << endl
<< "return;"
<< endl