diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2010-05-11 12:20:11 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2010-05-11 12:20:11 +0200 |
commit | 2e501c68a8641a2b3c430b55f13491a9c1c5d0f5 (patch) | |
tree | 49c2748443fe3c1f01108756b647440e0647a11b /xsde/cxx/serializer | |
parent | 161beba6cdb0d91b15ad19fa8b3e51d986203915 (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.cxx | 16 | ||||
-rw-r--r-- | xsde/cxx/serializer/cli.hxx | 2 | ||||
-rw-r--r-- | xsde/cxx/serializer/element-validation-source.cxx | 16 | ||||
-rw-r--r-- | xsde/cxx/serializer/elements.cxx | 1 | ||||
-rw-r--r-- | xsde/cxx/serializer/generator.cxx | 25 | ||||
-rw-r--r-- | xsde/cxx/serializer/name-processor.cxx | 1 | ||||
-rw-r--r-- | xsde/cxx/serializer/serializer-header.cxx | 20 | ||||
-rw-r--r-- | xsde/cxx/serializer/serializer-source.cxx | 28 |
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 |