aboutsummaryrefslogtreecommitdiff
path: root/xsde
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2009-03-11 17:32:01 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2009-03-11 17:32:01 +0200
commit0bfda486167432a9da8eec62b4578a22592a9275 (patch)
tree968d622d3918c9ac969de8b9c1e97e67b6cbee8b /xsde
parentf8bb2faef4b272ed150eb3ca4cedaa79da410694 (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.hxx2
-rw-r--r--xsde/cxx/hybrid/elements.cxx1
-rw-r--r--xsde/cxx/hybrid/elements.hxx17
-rw-r--r--xsde/cxx/hybrid/generator.cxx6
-rw-r--r--xsde/cxx/hybrid/tree-header.cxx82
-rw-r--r--xsde/cxx/hybrid/tree-inline.cxx128
-rw-r--r--xsde/cxx/hybrid/tree-name-processor.cxx57
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
{