diff options
author | Jörg Frings-Fürst <debian@jff.email> | 2024-03-06 10:24:08 +0100 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff.email> | 2024-03-06 10:24:08 +0100 |
commit | aad5ad9bf0c02aa4e79bc6b7d6c934612fff4026 (patch) | |
tree | 9cc224b059f248a6229ab0dcdc64eb4a73fa9800 /xsd/cxx/tree/stream-insertion-header.cxx | |
parent | c1034fc5e99197f507caf450aa15bc178698b26e (diff) |
New upstream version 4.2.0upstream/4.2.0upstream
Diffstat (limited to 'xsd/cxx/tree/stream-insertion-header.cxx')
-rw-r--r-- | xsd/cxx/tree/stream-insertion-header.cxx | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/xsd/cxx/tree/stream-insertion-header.cxx b/xsd/cxx/tree/stream-insertion-header.cxx new file mode 100644 index 0000000..9eb4bc4 --- /dev/null +++ b/xsd/cxx/tree/stream-insertion-header.cxx @@ -0,0 +1,178 @@ +// file : xsd/cxx/tree/stream-insertion-header.cxx +// license : GNU GPL v2 + exceptions; see accompanying LICENSE file + +#include <xsd/cxx/tree/stream-insertion-header.hxx> + +#include <libxsd-frontend/semantic-graph.hxx> +#include <libxsd-frontend/traversal.hxx> + +namespace CXX +{ + namespace Tree + { + namespace + { + struct List: Traversal::List, Context + { + List (Context& c) + : Context (c) + { + } + + virtual void + traverse (Type& l) + { + String name (ename (l)); + + // If renamed name is empty then we do not need to generate + // anything for this type. + // + if (renamed_type (l, name) && !name) + return; + + NarrowStrings const& st (options.generate_insertion ()); + for (NarrowStrings::const_iterator i (st.begin ()); i != st.end (); + ++i) + { + String stream_type (ostream_type + L"< " + String (*i) + L" >"); + + os << inst_exp + << stream_type << "&" << endl + << "operator<< (" << stream_type << "&," << endl + << "const " << name << "&);" + << endl; + } + } + }; + + + struct Union: Traversal::Union, Context + { + Union (Context& c) + : Context (c) + { + } + + virtual void + traverse (Type& u) + { + String name (ename (u)); + + // If renamed name is empty then we do not need to generate + // anything for this type. + // + if (renamed_type (u, name) && !name) + return; + + NarrowStrings const& st (options.generate_insertion ()); + for (NarrowStrings::const_iterator i (st.begin ()); i != st.end (); + ++i) + { + String stream_type (ostream_type + L"< " + String (*i) + L" >"); + + os << inst_exp + << stream_type << "&" << endl + << "operator<< (" << stream_type << "&," << endl + << "const " << name << "&);" + << endl; + } + } + }; + + + struct Enumeration: Traversal::Enumeration, Context + { + Enumeration (Context& c) + : Context (c) + { + } + + virtual void + traverse (Type& e) + { + String name (ename (e)); + + // If renamed name is empty then we do not need to generate + // anything for this type. + // + if (renamed_type (e, name) && !name) + return; + + NarrowStrings const& st (options.generate_insertion ()); + for (NarrowStrings::const_iterator i (st.begin ()); i != st.end (); + ++i) + { + String stream_type (ostream_type + L"< " + String (*i) + L" >"); + + os << inst_exp + << stream_type << "&" << endl + << "operator<< (" << stream_type << "&," << endl + << "const " << name << "&);" + << endl; + } + } + }; + + struct Complex: Traversal::Complex, Context + { + Complex (Context& c) + : Context (c) + { + } + + virtual void + traverse (Type& c) + { + String name (ename (c)); + + // If renamed name is empty then we do not need to generate + // anything for this type. + // + if (renamed_type (c, name) && !name) + return; + + NarrowStrings const& st (options.generate_insertion ()); + for (NarrowStrings::const_iterator i (st.begin ()); i != st.end (); + ++i) + { + String stream_type (ostream_type + L"< " + String (*i) + L" >"); + + os << inst_exp + << stream_type << "&" << endl + << "operator<< (" << stream_type << "&," << endl + << "const " << name << "&);" + << endl; + } + } + }; + } + + void + generate_stream_insertion_header (Context& ctx) + { + String c (ctx.char_type); + + Traversal::Schema schema; + + Sources sources; + Traversal::Names names_ns, names; + + Namespace ns (ctx); + + List list (ctx); + Union union_ (ctx); + Complex complex (ctx); + Enumeration enumeration (ctx); + + schema >> sources >> schema; + schema >> names_ns >> ns >> names; + + names >> list; + names >> union_; + names >> complex; + names >> enumeration; + + schema.dispatch (ctx.schema_root); + } + } +} |