diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2009-03-11 17:32:01 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2009-03-11 17:32:01 +0200 |
commit | 0bfda486167432a9da8eec62b4578a22592a9275 (patch) | |
tree | 968d622d3918c9ac969de8b9c1e97e67b6cbee8b /xsde | |
parent | f8bb2faef4b272ed150eb3ca4cedaa79da410694 (diff) |
Add generation of detach functions
New option: --generate-detach. Also added detach/attach functionality
to var_seq, non-STL str_seq, and string_base.
Diffstat (limited to 'xsde')
-rw-r--r-- | xsde/cxx/hybrid/cli.hxx | 2 | ||||
-rw-r--r-- | xsde/cxx/hybrid/elements.cxx | 1 | ||||
-rw-r--r-- | xsde/cxx/hybrid/elements.hxx | 17 | ||||
-rw-r--r-- | xsde/cxx/hybrid/generator.cxx | 6 | ||||
-rw-r--r-- | xsde/cxx/hybrid/tree-header.cxx | 82 | ||||
-rw-r--r-- | xsde/cxx/hybrid/tree-inline.cxx | 128 | ||||
-rw-r--r-- | xsde/cxx/hybrid/tree-name-processor.cxx | 57 |
7 files changed, 284 insertions, 9 deletions
diff --git a/xsde/cxx/hybrid/cli.hxx b/xsde/cxx/hybrid/cli.hxx index be680ea..343e53b 100644 --- a/xsde/cxx/hybrid/cli.hxx +++ b/xsde/cxx/hybrid/cli.hxx @@ -33,6 +33,7 @@ namespace CXX extern Key suppress_validation; extern Key suppress_parser_val; extern Key suppress_serializer_val; + extern Key generate_detach; extern Key generate_insertion; extern Key generate_extraction; extern Key generate_inline; @@ -113,6 +114,7 @@ namespace CXX suppress_validation, Boolean, suppress_parser_val, Boolean, suppress_serializer_val, Boolean, + generate_detach, Boolean, generate_insertion, Cult::Containers::Vector<NarrowString>, generate_extraction, Cult::Containers::Vector<NarrowString>, generate_inline, Boolean, diff --git a/xsde/cxx/hybrid/elements.cxx b/xsde/cxx/hybrid/elements.cxx index 68af8df..68bc0c2 100644 --- a/xsde/cxx/hybrid/elements.cxx +++ b/xsde/cxx/hybrid/elements.cxx @@ -36,6 +36,7 @@ namespace CXX poly_code (false), poly_runtime (false), reset (!ops.value<CLI::suppress_reset> ()), + detach (ops.value<CLI::generate_detach> ()), mixin (ops.value<CLI::reuse_style_mixin> ()), tiein (!mixin), fwd_expr (fe), diff --git a/xsde/cxx/hybrid/elements.hxx b/xsde/cxx/hybrid/elements.hxx index f5d959b..cd1a40f 100644 --- a/xsde/cxx/hybrid/elements.hxx +++ b/xsde/cxx/hybrid/elements.hxx @@ -44,6 +44,7 @@ namespace CXX poly_code (c.poly_code), poly_runtime (c.poly_runtime), reset (c.reset), + detach (c.detach), mixin (c.mixin), tiein (c.tiein), fwd_expr (c.fwd_expr), @@ -67,6 +68,7 @@ namespace CXX poly_code (c.poly_code), poly_runtime (c.poly_runtime), reset (c.reset), + detach (c.detach), mixin (c.mixin), tiein (c.tiein), fwd_expr (c.fwd_expr), @@ -109,6 +111,20 @@ namespace CXX return a.context ().get<String> ("member"); } + // Detach. + // + static String const& + edetach (SemanticGraph::Particle& p) + { + return p.context ().get<String> ("detach"); + } + + static String const& + edetach (SemanticGraph::Attribute& a) + { + return a.context ().get<String> ("detach"); + } + // Optional. // static String const& @@ -524,6 +540,7 @@ namespace CXX Boolean poly_code; Boolean poly_runtime; Boolean reset; + Boolean detach; Boolean mixin; Boolean tiein; diff --git a/xsde/cxx/hybrid/generator.cxx b/xsde/cxx/hybrid/generator.cxx index 495e649..28d851b 100644 --- a/xsde/cxx/hybrid/generator.cxx +++ b/xsde/cxx/hybrid/generator.cxx @@ -121,6 +121,7 @@ namespace CXX extern Key suppress_validation = "suppress-validation"; extern Key suppress_parser_val = "suppress-parser-val"; extern Key suppress_serializer_val = "suppress-serializer-val"; + extern Key generate_detach = "generate-detach"; extern Key generate_insertion = "generate-insertion"; extern Key generate_extraction = "generate-extraction"; extern Key generate_inline = "generate-inline"; @@ -244,6 +245,11 @@ namespace CXX << " serializer." << endl; + e << "--generate-detach" << endl + << " Generate detach functions for elements and\n" + << " attributes of variable-length types." + << endl; + e << "--generate-insertion <os>" << endl << " Generate data representation stream insertion\n" << " operators for the <os> output stream type." diff --git a/xsde/cxx/hybrid/tree-header.cxx b/xsde/cxx/hybrid/tree-header.cxx index 2412b86..dc378fe 100644 --- a/xsde/cxx/hybrid/tree-header.cxx +++ b/xsde/cxx/hybrid/tree-header.cxx @@ -178,6 +178,16 @@ namespace CXX os << "void" << endl << value << " (char*);" << endl; + + // char* + // detach () + // + if (detach) + { + os << "char*" << endl + << uc.get<String> ("value-detach") << " ();" + << endl; + } } // Custom data. @@ -1050,6 +1060,17 @@ namespace CXX arg_.dispatch (t); os << ");" << endl; + + // type* + // detach () + // + if (detach && !fixed_length (t)) + { + arg_.dispatch (t); + os << endl + << edetach (a) << " ();" + << endl; + } } private: @@ -1150,6 +1171,17 @@ namespace CXX arg_.dispatch (t); os << ");" << endl; + + // type* + // detach () + // + if (detach && !fixed_length (t)) + { + arg_.dispatch (t); + os << endl + << edetach (e) << " ();" + << endl; + } } } @@ -1293,6 +1325,16 @@ namespace CXX os << ");" << endl; + + // type* + // detach () + // + if (detach && !fl) + { + os << type << "*" << endl + << edetach (a) << " ();" + << endl; + } } else All::contains (a); @@ -1571,6 +1613,16 @@ namespace CXX os << ");" << endl; + + // type* + // detach () + // + if (detach && !fl) + { + os << type << "*" << endl + << edetach (c) << " ();" + << endl; + } } } @@ -1786,6 +1838,16 @@ namespace CXX os << ");" << endl; + + // type* + // detach () + // + if (detach && !fl) + { + os << type << "*" << endl + << edetach (c) << " ();" + << endl; + } } } @@ -1970,6 +2032,16 @@ namespace CXX os << ");" << endl; + + // type* + // detach () + // + if (detach && !fl) + { + os << type << "*" << endl + << edetach (s) << " ();" + << endl; + } } } @@ -2149,6 +2221,16 @@ namespace CXX os << ");" << endl; + + // type* + // detach () + // + if (detach && !fl) + { + os << type << "*" << endl + << edetach (s) << " ();" + << endl; + } } } diff --git a/xsde/cxx/hybrid/tree-inline.cxx b/xsde/cxx/hybrid/tree-inline.cxx index 72d2d8f..34d0cc3 100644 --- a/xsde/cxx/hybrid/tree-inline.cxx +++ b/xsde/cxx/hybrid/tree-inline.cxx @@ -177,6 +177,21 @@ namespace CXX << "delete[] this->" << member << ";" << "this->" << member << " = x;" << "}"; + + // char* + // detach () + // + if (detach) + { + os << inl + << "char* " << name << "::" << endl + << uc.get<String> ("value-detach") << " ()" + << "{" + << "char* r = this->" << member << ";" + << "this->" << member << " = 0;" + << "return r;" + << "}"; + } } // Custom data. @@ -326,6 +341,24 @@ namespace CXX os << "this->" << epresent_member (a) << " = true;"; os << "}"; + + + // type* + // detach () + // + if (detach && !fl) + { + os << inl; + arg_.dispatch (t); + os << " " << scope << "::" << endl + << edetach (a) << " ()" + << "{"; + arg_.dispatch (t); + os << " r = this->" << member << ";" + << "this->" << member << " = 0;" + << "return r;" + << "}"; + } } private: @@ -475,6 +508,23 @@ namespace CXX os << "this->" << epresent_member (e) << " = true;"; os << "}"; + + // type* + // detach () + // + if (detach && !fl) + { + os << inl; + arg_.dispatch (t); + os << " " << scope << "::" << endl + << edetach (e) << " ()" + << "{"; + arg_.dispatch (t); + os << " r = this->" << member << ";" + << "this->" << member << " = 0;" + << "return r;" + << "}"; + } } } @@ -691,6 +741,23 @@ namespace CXX } os << "}"; + + // type* + // detach () + // + if (detach && !fl) + { + os << inl; + arg_.dispatch (t); + os << " " << scope << "::" << endl + << edetach (e) << " ()" + << "{"; + arg_.dispatch (t); + os << " r = this->" << umember << "." << member << ";" + << "this->" << umember << "." << member << " = 0;" + << "return r;" + << "}"; + } } } @@ -822,6 +889,21 @@ namespace CXX os << "this->" << epresent_member (a) << " = true;"; os << "}"; + + // type* + // detach () + // + if (detach && !fl) + { + os << inl + << type << "* " << scope << "::" << endl + << edetach (a) << " ()" + << "{" + << type << "* r = this->" << member << ";" + << "this->" << member << " = 0;" + << "return r;" + << "}"; + } } else All::contains (a); @@ -989,6 +1071,21 @@ namespace CXX os << "this->" << epresent_member (c) << " = true;"; os << "}"; + + // type* + // detach () + // + if (detach && !fl) + { + os << inl + << type << "* " << scope << "::" << endl + << edetach (c) << " ()" + << "{" + << type << "* r = this->" << member << ";" + << "this->" << member << " = 0;" + << "return r;" + << "}"; + } } } }; @@ -1142,6 +1239,21 @@ namespace CXX os << "this->" << epresent_member (s) << " = true;"; os << "}"; + + // type* + // detach () + // + if (detach && !fl) + { + os << inl + << type << "* " << scope << "::" << endl + << edetach (s) << " ()" + << "{" + << type << "* r = this->" << member << ";" + << "this->" << member << " = 0;" + << "return r;" + << "}"; + } } } }; @@ -1331,6 +1443,22 @@ namespace CXX } os << "}"; + + + // type* + // detach () + // + if (detach && !fl) + { + os << inl + << type << "* " << scope << "::" << endl + << edetach (c) << " ()" + << "{" + << type << "* r = this->" << umember << "." << member << ";" + << "this->" << umember << "." << member << " = 0;" + << "return r;" + << "}"; + } } } }; diff --git a/xsde/cxx/hybrid/tree-name-processor.cxx b/xsde/cxx/hybrid/tree-name-processor.cxx index c828250..7783ba5 100644 --- a/xsde/cxx/hybrid/tree-name-processor.cxx +++ b/xsde/cxx/hybrid/tree-name-processor.cxx @@ -49,6 +49,8 @@ namespace CXX schema_path_ (file), schema (root), schema_path (schema_path_), + stl (!ops.value<CLI::no_stl> ()), + detach (ops.value<CLI::generate_detach> ()), custom_data_map (custom_data_map_), global_type_names (global_type_names_) { @@ -98,6 +100,8 @@ namespace CXX : CXX::Context (c), schema (c.schema), schema_path (c.schema_path), + stl (c.stl), + detach (c.detach), custom_data_map (c.custom_data_map), global_type_names (c.global_type_names) { @@ -174,6 +178,9 @@ namespace CXX SemanticGraph::Schema& schema; SemanticGraph::Path const& schema_path; + Boolean stl; + Boolean detach; + CustomDataMap& custom_data_map; Cult::Containers::Map<String, NameSet*>& global_type_names; }; @@ -263,7 +270,11 @@ namespace CXX NameSet& set (uc.get<NameSet> (member_set_key)); set.insert (name); - uc.set ("value", find_name ("value", set)); + String v (find_name ("value", set)); + uc.set ("value", v); + + if (detach && !stl) + uc.set ("value-detach", find_name (v + L"_detach", set)); // Check if this type has custom data. // @@ -432,6 +443,12 @@ namespace CXX ac.set ( "present", find_name (ac.get<String> ("name") + L"_present", set_)); + + if (detach && !fixed_length (a.type ())) + ac.set ( + "detach", + find_name (ac.get<String> ("name") + L"_detach", set_)); + } else { @@ -476,11 +493,17 @@ namespace CXX ec.set ("const-iterator", find_name (base + L"_const_iterator", set_)); } - else if (e.min () == 0) + else { - ec.set ( - "present", - find_name (ec.get<String> ("name") + L"_present", set_)); + if (e.min () == 0) + ec.set ( + "present", + find_name (ec.get<String> ("name") + L"_present", set_)); + + if (detach && !fixed_length (e.type ())) + ec.set ( + "detach", + find_name (ec.get<String> ("name") + L"_detach", set_)); } } else @@ -589,6 +612,9 @@ namespace CXX } ac.set ("present", find_name (base + L"_present", set_)); + + if (detach && !fixed_length (a)) + ac.set ("detach", find_name (base + L"_detach", set_)); } else { @@ -819,8 +845,14 @@ namespace CXX cc.set ("const-iterator", find_name (base + L"_const_iterator", set_)); } - else if (c.min () == 0) - cc.set ("present", find_name (base + L"_present", set_)); + else + { + if (c.min () == 0) + cc.set ("present", find_name (base + L"_present", set_)); + + if (detach && !fixed_length (c)) + cc.set ("detach", find_name (base + L"_detach", set_)); + } } else { @@ -1018,8 +1050,15 @@ namespace CXX sc.set ("const-iterator", find_name (base + L"_const_iterator", set_)); } - else if (s.min () == 0) - sc.set ("present", find_name (base + L"_present", set_)); + else + { + if (s.min () == 0) + sc.set ("present", find_name (base + L"_present", set_)); + + if (detach && !fixed_length (s)) + sc.set ("detach", find_name (base + L"_detach", set_)); + } + } else { |