diff --git a/src/db/db/dbConverters.h b/src/db/db/dbConverters.h index 2403f6c21..3da99c447 100644 --- a/src/db/db/dbConverters.h +++ b/src/db/db/dbConverters.h @@ -40,6 +40,8 @@ namespace db template struct DB_PUBLIC_TEMPLATE TransformationConverter { + typedef T value_type; + std::string to_string (const T &t) const { return t.to_string (); @@ -58,6 +60,8 @@ struct DB_PUBLIC_TEMPLATE TransformationConverter */ struct DB_PUBLIC LayoutLayerConverter { + typedef db::LayerProperties value_type; + std::string to_string (const db::LayerProperties &p) const { return p.to_string (); @@ -79,6 +83,8 @@ struct DB_PUBLIC LayoutLayerConverter template struct DB_PUBLIC_TEMPLATE PointConverter { + typedef P value_type; + std::string to_string (const P &p) const { return tl::to_string (p.x ()) + "," + tl::to_string (p.y ()); diff --git a/src/db/db/dbStream.h b/src/db/db/dbStream.h index ace7531aa..88a30fbf5 100644 --- a/src/db/db/dbStream.h +++ b/src/db/db/dbStream.h @@ -154,7 +154,7 @@ class StreamOptionsReadAdaptor { public: typedef tl::pass_by_ref_tag tag; - typedef tl::pb_zero_cardinality_tag cardinality; + typedef tl::zero_cardinality_tag cardinality; StreamOptionsReadAdaptor () : mp_options (0), m_done (false) diff --git a/src/db/db/dbTechnology.h b/src/db/db/dbTechnology.h index 2fa1c6f5e..9477a18cd 100644 --- a/src/db/db/dbTechnology.h +++ b/src/db/db/dbTechnology.h @@ -807,6 +807,7 @@ class TechnologyComponentReadAdaptor { public: typedef tl::pass_by_ref_tag tag; + typedef tl::single_cardinality_tag cardinality; TechnologyComponentReadAdaptor (const std::string &name) : m_name (name), mp_t (0), m_done (false) diff --git a/src/img/img/imgStream.cc b/src/img/img/imgStream.cc index 4f6833aca..5de8bdddc 100644 --- a/src/img/img/imgStream.cc +++ b/src/img/img/imgStream.cc @@ -359,6 +359,8 @@ namespace { struct PointConverter { + typedef db::DPoint value_type; + std::string to_string (const db::DPoint &p) const { return p.to_string (); @@ -373,6 +375,8 @@ namespace { struct ColorMapConverter { + typedef std::pair > value_type; + std::string to_string (const std::pair > &cm) const { std::string s; @@ -427,7 +431,7 @@ tl::XMLStruct s_img_structure ("image-data", tl::make_member (&ImageProxy::max_value, &ImageProxy::set_max_value, "max-value") + tl::make_element (&ImageProxy::data_mapping, &ImageProxy::set_data_mapping, "data-mapping", tl::make_element (&img::DataMapping::false_color_nodes, "color-map", - tl::make_member >, img::DataMapping::false_color_nodes_type::const_iterator, img::DataMapping::false_color_nodes_type, ColorMapConverter> (&img::DataMapping::false_color_nodes_type::begin, &img::DataMapping::false_color_nodes_type::end, &img::DataMapping::false_color_nodes_type::push_back, "color-map-entry", ColorMapConverter ()) + tl::make_member >, img::DataMapping::false_color_nodes_type::const_iterator, img::DataMapping::false_color_nodes_type, tl::XMLStringBasedConverter > (&img::DataMapping::false_color_nodes_type::begin, &img::DataMapping::false_color_nodes_type::end, &img::DataMapping::false_color_nodes_type::push_back, "color-map-entry", tl::XMLStringBasedConverter ()) ) + tl::make_member (&img::DataMapping::brightness, "brightness") + tl::make_member (&img::DataMapping::contrast, "contrast") + @@ -437,7 +441,7 @@ tl::XMLStruct s_img_structure ("image-data", tl::make_member (&img::DataMapping::blue_gain, "blue-gain") ) + tl::make_element (&ImageProxy::landmarks, &ImageProxy::set_landmarks, "landmarks", - tl::make_member (&img::Object::landmarks_type::begin, &img::Object::landmarks_type::end, &img::Object::landmarks_type::push_back, "landmark", PointConverter ()) + tl::make_member > (&img::Object::landmarks_type::begin, &img::Object::landmarks_type::end, &img::Object::landmarks_type::push_back, "landmark", tl::XMLStringBasedConverter ()) ) + tl::make_member (&ImageProxy::begin_byte_data, &ImageProxy::end_byte_data, &ImageProxy::push_byte_data, "byte-data") + tl::make_member (&ImageProxy::begin_data, &ImageProxy::end_data, &ImageProxy::push_data, "data") diff --git a/src/lay/lay/laySaltGrain.cc b/src/lay/lay/laySaltGrain.cc index f9c3cb181..ff06fdb2b 100644 --- a/src/lay/lay/laySaltGrain.cc +++ b/src/lay/lay/laySaltGrain.cc @@ -353,6 +353,8 @@ SaltGrain::valid_version (const std::string &v) struct TimeConverter { + typedef QDateTime value_type; + std::string to_string (const QDateTime &time) const { if (time.isNull ()) { @@ -374,6 +376,8 @@ struct TimeConverter struct ImageConverter { + typedef QImage value_type; + std::string to_string (const QImage &image) const { if (image.isNull ()) { @@ -416,10 +420,10 @@ SaltGrain::xml_elements () tl::make_member (&SaltGrain::license, &SaltGrain::set_license, "license") + tl::make_member (&SaltGrain::author, &SaltGrain::set_author, "author") + tl::make_member (&SaltGrain::author_contact, &SaltGrain::set_author_contact, "author-contact") + - tl::make_member (&SaltGrain::authored_time, &SaltGrain::set_authored_time, "authored-time", TimeConverter ()) + - tl::make_member (&SaltGrain::installed_time, &SaltGrain::set_installed_time, "installed-time", TimeConverter ()) + - tl::make_member (&SaltGrain::icon, &SaltGrain::set_icon, "icon", ImageConverter ()) + - tl::make_member (&SaltGrain::screenshot, &SaltGrain::set_screenshot, "screenshot", ImageConverter ()) + + tl::make_member (&SaltGrain::authored_time, &SaltGrain::set_authored_time, "authored-time", tl::XMLStringBasedConverter ()) + + tl::make_member (&SaltGrain::installed_time, &SaltGrain::set_installed_time, "installed-time", tl::XMLStringBasedConverter ()) + + tl::make_member (&SaltGrain::icon, &SaltGrain::set_icon, "icon", tl::XMLStringBasedConverter ()) + + tl::make_member (&SaltGrain::screenshot, &SaltGrain::set_screenshot, "screenshot", tl::XMLStringBasedConverter ()) + tl::make_element (&SaltGrain::begin_dependencies, &SaltGrain::end_dependencies, &SaltGrain::add_dependency, "depends", tl::make_member (&SaltGrainDependency::name, "name") + tl::make_member (&SaltGrainDependency::url, "url") + diff --git a/src/laybasic/laybasic/layDispatcher.cc b/src/laybasic/laybasic/layDispatcher.cc index 5422c4ab0..91455a406 100644 --- a/src/laybasic/laybasic/layDispatcher.cc +++ b/src/laybasic/laybasic/layDispatcher.cc @@ -108,6 +108,8 @@ Dispatcher::config_finalize () struct ConfigGetAdaptor { + typedef tl::zero_cardinality_tag cardinality; + ConfigGetAdaptor (const std::string &name) : mp_owner (0), m_done (false), m_name (name) { @@ -145,6 +147,8 @@ private: struct ConfigGetNullAdaptor { + typedef tl::zero_cardinality_tag cardinality; + ConfigGetNullAdaptor () { // .. nothing yet .. diff --git a/src/lym/lym/lymMacro.cc b/src/lym/lym/lymMacro.cc index 7c239a757..de0004a3a 100644 --- a/src/lym/lym/lymMacro.cc +++ b/src/lym/lym/lymMacro.cc @@ -150,6 +150,8 @@ bool Macro::del () struct Interpreter2s { + typedef Macro::Interpreter value_type; + std::string to_string (Macro::Interpreter i) const { switch (i) { @@ -199,7 +201,7 @@ static tl::XMLStruct xml_struct ("klayout-macro", tl::make_member (&Macro::show_in_menu, &Macro::set_show_in_menu, "show-in-menu") + tl::make_member (&Macro::group_name, &Macro::set_group_name, "group-name") + tl::make_member (&Macro::menu_path, &Macro::set_menu_path, "menu-path") + - tl::make_member (&Macro::interpreter, &Macro::set_interpreter, "interpreter", Interpreter2s ()) + + tl::make_member (&Macro::interpreter, &Macro::set_interpreter, "interpreter", tl::XMLStringBasedConverter ()) + tl::make_member (&Macro::dsl_interpreter, &Macro::set_dsl_interpreter, "dsl-interpreter-name") + tl::make_member (&Macro::text, &Macro::set_text, "text") + tl::make_member ("format") // for backward compatibility diff --git a/src/plugins/streamers/pcb/db_plugin/dbGerberImportData.cc b/src/plugins/streamers/pcb/db_plugin/dbGerberImportData.cc index 00b04b164..608090f3c 100644 --- a/src/plugins/streamers/pcb/db_plugin/dbGerberImportData.cc +++ b/src/plugins/streamers/pcb/db_plugin/dbGerberImportData.cc @@ -166,6 +166,8 @@ GerberImportData::setup_importer (db::GerberImporter *importer) struct MountingConverter { + typedef GerberImportData::mounting_type value_type; + std::string to_string (GerberImportData::mounting_type m) const { return m == GerberImportData::MountingTop ? "top" : "bottom"; @@ -190,9 +192,9 @@ pcb_project_structure ("pcb-project", tl::make_member (&GerberImportData::border, "border") + tl::make_member (&GerberImportData::free_layer_mapping, "free-layer-mapping") + tl::make_element (&GerberImportData::layout_layers, "layout-layers", - tl::make_member::const_iterator, std::vector > (&std::vector::begin, &std::vector::end, &std::vector::push_back, "layout-layer", db::LayoutLayerConverter ()) + tl::make_member::const_iterator, std::vector > (&std::vector::begin, &std::vector::end, &std::vector::push_back, "layout-layer", tl::XMLStringBasedConverter ()) ) + - tl::make_member (&GerberImportData::mounting, "mounting", MountingConverter ()) + + tl::make_member (&GerberImportData::mounting, "mounting", tl::XMLStringBasedConverter ()) + tl::make_member (&GerberImportData::num_metal_layers, "num-metal-layers") + tl::make_member (&GerberImportData::num_via_types, "num-via-types") + tl::make_element (&GerberImportData::artwork_files, "artwork-files", @@ -217,11 +219,11 @@ pcb_project_structure ("pcb-project", ) + tl::make_element (&GerberImportData::reference_points, "reference-points", tl::make_element, std::vector >::const_iterator, std::vector > > (&std::vector >::begin, &std::vector >::end, &std::vector >::push_back, "reference-point", - tl::make_member (&std::pair ::first, "pcb", db::PointConverter ()) + - tl::make_member (&std::pair ::second, "layout", db::PointConverter ()) + tl::make_member (&std::pair ::first, "pcb", tl::XMLStringBasedConverter > ()) + + tl::make_member (&std::pair ::second, "layout", tl::XMLStringBasedConverter > ()) ) ) + - tl::make_member (&GerberImportData::explicit_trans, "explicit-trans", db::TransformationConverter ()) + + tl::make_member (&GerberImportData::explicit_trans, "explicit-trans", tl::XMLStringBasedConverter > ()) + tl::make_member (&GerberImportData::layer_properties_file, "layer-properties-file") + tl::make_member (&GerberImportData::num_circle_points, "num-circle-points") + tl::make_member (&GerberImportData::merge_flag, "merge-flag") + diff --git a/src/plugins/tools/import/lay_plugin/layStreamImportDialog.cc b/src/plugins/tools/import/lay_plugin/layStreamImportDialog.cc index 3f5e7841d..a3c56853c 100644 --- a/src/plugins/tools/import/lay_plugin/layStreamImportDialog.cc +++ b/src/plugins/tools/import/lay_plugin/layStreamImportDialog.cc @@ -49,6 +49,8 @@ static struct { struct ModeConverter { + typedef lay::StreamImportData::mode_type value_type; + std::string to_string (lay::StreamImportData::mode_type t) const { for (unsigned int i = 0; i < sizeof (mode_strings) / sizeof (mode_strings [0]); ++i) { @@ -82,6 +84,8 @@ static struct { struct LayerModeConverter { + typedef lay::StreamImportData::layer_mode_type value_type; + std::string to_string (lay::StreamImportData::layer_mode_type t) const { for (unsigned int i = 0; i < sizeof (layer_mode_strings) / sizeof (layer_mode_strings [0]); ++i) { @@ -144,8 +148,8 @@ static tl::XMLElementList xml_elements () ) + tl::make_member (&StreamImportData::topcell, "cell-name") + tl::make_member (&StreamImportData::layer_offset, "layer-offset") + - tl::make_member (&StreamImportData::layer_mode, "layer-mode", LayerModeConverter ()) + - tl::make_member (&StreamImportData::mode, "import-mode", ModeConverter ()) + + tl::make_member (&StreamImportData::layer_mode, "layer-mode", tl::XMLStringBasedConverter ()) + + tl::make_member (&StreamImportData::mode, "import-mode", tl::XMLStringBasedConverter ()) + tl::make_element (&StreamImportData::reference_points, "reference-points", tl::make_element (&ref_point_v::begin, &ref_point_v::end, &ref_point_v::push_back, "reference-point", tl::make_member (&ref_point::first, "p1") + diff --git a/src/plugins/tools/net_tracer/db_plugin/dbNetTracerPlugin.cc b/src/plugins/tools/net_tracer/db_plugin/dbNetTracerPlugin.cc index 1967f7bb0..ce45a45ac 100644 --- a/src/plugins/tools/net_tracer/db_plugin/dbNetTracerPlugin.cc +++ b/src/plugins/tools/net_tracer/db_plugin/dbNetTracerPlugin.cc @@ -24,50 +24,49 @@ #include "dbTechnology.h" #include "tlClassRegistry.h" -namespace tl -{ - /** - * @brief A specialization of the XMLConverter that is used to serialize the connection info - */ - - template <> - struct XMLStdConverter - { - std::string to_string (const db::NetTracerConnectionInfo &v) const - { - return v.to_string (); - } - - void from_string (const std::string &s, db::NetTracerConnectionInfo &v) const - { - tl::Extractor ex (s.c_str ()); - v.parse (ex); - } - }; - - /** - * @brief A specialization of the XMLConverter that is used to serialize the symbol info - */ - - template <> - struct XMLStdConverter - { - std::string to_string (const db::NetTracerSymbolInfo &v) const - { - return v.to_string (); - } - - void from_string (const std::string &s, db::NetTracerSymbolInfo &v) const - { - tl::Extractor ex (s.c_str ()); - v.parse (ex); - } - }; -} - namespace { +/** + * @brief A string converter for NetTracerConnectionInfo + */ + +struct NetTracerConnectionInfoConverter +{ + typedef db::NetTracerConnectionInfo value_type; + + std::string to_string (const db::NetTracerConnectionInfo &v) const + { + return v.to_string (); + } + + void from_string (const std::string &s, db::NetTracerConnectionInfo &v) const + { + tl::Extractor ex (s.c_str ()); + v.parse (ex); + } +}; + +/** + * @brief A specialization of the XMLConverter that is used to serialize the symbol info + */ + +struct NetTracerSymbolInfoConverter +{ + typedef db::NetTracerSymbolInfo value_type; + + std::string to_string (const db::NetTracerSymbolInfo &v) const + { + return v.to_string (); + } + + void from_string (const std::string &s, db::NetTracerSymbolInfo &v) const + { + tl::Extractor ex (s.c_str ()); + v.parse (ex); + } +}; + static const db::NetTracerConnectivity * get_fallback_default (const db::NetTracerTechnologyComponent &tc) { @@ -129,6 +128,7 @@ template struct FallbackXMLReadAdaptor { typedef tl::pass_by_ref_tag tag; + typedef tl::many_cardinality_tag cardinality; FallbackXMLReadAdaptor (Iter (db::NetTracerConnectivity::*begin) () const, Iter (db::NetTracerConnectivity::*end) () const) : mp_begin (begin), mp_end (end) @@ -195,10 +195,10 @@ public: tl::make_member ((NetTracerConnectivity::const_symbol_iterator (NetTracerConnectivity::*) () const) &NetTracerConnectivity::begin_symbols, (NetTracerConnectivity::const_symbol_iterator (NetTracerConnectivity::*) () const) &NetTracerConnectivity::end_symbols, &NetTracerConnectivity::add_symbol, "symbols") ) + // Fallback readers for migrating pre-0.28 setups to 0.28 and backward compatibility - tl::XMLMember, FallbackXMLWriteAdaptor , tl::XMLStdConverter > ( + tl::XMLMember, FallbackXMLWriteAdaptor , tl::XMLStringBasedConverter > ( FallbackXMLReadAdaptor (&NetTracerConnectivity::begin, &NetTracerConnectivity::end), FallbackXMLWriteAdaptor (&NetTracerConnectivity::add), "connection") + - tl::XMLMember, FallbackXMLWriteAdaptor , tl::XMLStdConverter > ( + tl::XMLMember, FallbackXMLWriteAdaptor , tl::XMLStringBasedConverter > ( FallbackXMLReadAdaptor (&NetTracerConnectivity::begin_symbols, &NetTracerConnectivity::end_symbols), FallbackXMLWriteAdaptor (&NetTracerConnectivity::add_symbol), "symbols") ); diff --git a/src/rdb/rdb/rdbFile.cc b/src/rdb/rdb/rdbFile.cc index e6159b6a4..dc533bf7f 100644 --- a/src/rdb/rdb/rdbFile.cc +++ b/src/rdb/rdb/rdbFile.cc @@ -38,6 +38,8 @@ namespace rdb struct ValueConverter { + typedef std::string pb_type; + ValueConverter (rdb::Database *rdb) : mp_rdb (rdb) { @@ -53,6 +55,16 @@ struct ValueConverter value.from_string (mp_rdb, s); } + std::string pb_encode (const ValueWrapper &value) const + { + return value.to_string (mp_rdb); + } + + void pb_decode (const std::string &s, ValueWrapper &value) const + { + value.from_string (mp_rdb, s); + } + private: rdb::Database *mp_rdb; }; @@ -110,7 +122,7 @@ make_rdb_structure (rdb::Database *rdb) tl::make_member (&rdb::Item::comment, &rdb::Item::set_comment, "comment") + tl::make_member (&rdb::Item::image_str, &rdb::Item::set_image_str, "image") + tl::make_element (&rdb::Item::values, &rdb::Item::set_values, "values", - tl::make_member (&rdb::Values::begin, &rdb::Values::end, &rdb::Values::add, "value", ValueConverter (rdb)) + tl::make_member (&rdb::Values::begin, &rdb::Values::end, &rdb::Values::add, "value", ValueConverter (rdb)) ) ) ) diff --git a/src/tl/tl/tlXMLParser.h b/src/tl/tl/tlXMLParser.h index 7efb7c585..f8d73d5b3 100644 --- a/src/tl/tl/tlXMLParser.h +++ b/src/tl/tl/tlXMLParser.h @@ -62,16 +62,16 @@ struct pass_by_ref_tag { pass_by_ref_tag () { } }; -struct pb_zero_cardinality_tag { - pb_zero_cardinality_tag () { } +struct zero_cardinality_tag { + zero_cardinality_tag () { } }; -struct pb_single_cardinality_tag { - pb_single_cardinality_tag () { } +struct single_cardinality_tag { + single_cardinality_tag () { } }; -struct pb_many_cardinality_tag { - pb_many_cardinality_tag () { } +struct many_cardinality_tag { + many_cardinality_tag () { } }; /** @@ -570,17 +570,17 @@ protected: std::string make_message_name () const; - static Cardinality get_cardinality (tl::pb_zero_cardinality_tag) + static Cardinality get_cardinality (tl::zero_cardinality_tag) { return Zero; } - static Cardinality get_cardinality (tl::pb_single_cardinality_tag) + static Cardinality get_cardinality (tl::single_cardinality_tag) { return Single; } - static Cardinality get_cardinality (tl::pb_many_cardinality_tag) + static Cardinality get_cardinality (tl::many_cardinality_tag) { return Many; } @@ -593,69 +593,37 @@ private: }; /** - * @brief A XML child element - * - * This class is a XML structure component describing a child - * element in the XML tree. There is no limit about the number of - * child elements. - * This object must be provided a pointer to a factory method (in - * the parent's class), a name and a list of children (which can be - * empty). - * Write is a class providing a Obj &operator(Parent &) operator. - * It is supposed to create a new instance of Obj within Parent. - * Read is a class providing a start(const Parent &) method to start - * iterating over the instances, a const Obj &operator() const for - * access and a bool at_end() method to determine if the iterator - * is at the end and next() to increment the iterator. + * @brief Basic implementation for XMLElement and XMLElementWithParentRef */ template -class TL_PUBLIC_TEMPLATE XMLElement +class TL_PUBLIC_TEMPLATE XMLElementImplBase : public XMLElementBase { public: - XMLElement (const Read &r, const Write &w, const std::string &name, const XMLElementList &children) + XMLElementImplBase (const Read &r, const Write &w, const std::string &name, const XMLElementList &children) : XMLElementBase (name, children), m_r (r), m_w (w) { // .. nothing yet .. } - XMLElement (const Read &r, const Write &w, const std::string &name, const XMLElementList *children) + XMLElementImplBase (const Read &r, const Write &w, const std::string &name, const XMLElementList *children) : XMLElementBase (name, children), m_r (r), m_w (w) { // .. nothing yet .. } - XMLElement (const XMLElement &d) + XMLElementImplBase (const XMLElementImplBase &d) : XMLElementBase (d), m_r (d.m_r), m_w (d.m_w) { // .. nothing yet .. } - virtual XMLElementBase *clone () const - { - return new XMLElement (*this); - } - - virtual void create (const XMLElementBase *, XMLReaderState &objs, const std::string & /*uri*/, const std::string & /*lname*/, const std::string & /*qname*/) const - { - XMLObjTag tag; - objs.push (tag); - } - virtual void cdata (const std::string & /*cdata*/, XMLReaderState & /*objs*/) const { // .. nothing yet .. } - virtual void finish (const XMLElementBase * /*parent*/, XMLReaderState &objs, const std::string & /*uri*/, const std::string & /*lname*/, const std::string & /*qname*/) const - { - XMLObjTag tag; - XMLObjTag parent_tag; - m_w (*objs.parent (parent_tag), objs); - objs.pop (tag); - } - virtual void write (const XMLElementBase * /*parent*/, tl::OutputStream &os, int indent, XMLWriterState &objs) const { XMLObjTag parent_tag; @@ -673,7 +641,7 @@ public: } } - virtual bool has_any (XMLWriterState &objs) const + virtual bool has_any (XMLWriterState &objs) const { XMLObjTag parent_tag; Read r (m_r); @@ -681,20 +649,6 @@ public: return (! r.at_end ()); } - virtual void pb_create (const XMLElementBase *, XMLReaderState &objs) const - { - XMLObjTag tag; - objs.push (tag); - } - - virtual void pb_finish (const XMLElementBase * /*parent*/, XMLReaderState &objs) const - { - XMLObjTag tag; - XMLObjTag parent_tag; - m_w (*objs.parent (parent_tag), objs); - objs.pop (tag); - } - virtual void pb_parse (PBParser *parser, tl::ProtocolBufferReaderBase &reader) const { reader.open (); @@ -739,10 +693,11 @@ public: } } -private: +protected: Read m_r; Write m_w; +private: // this write helper is used if the reader delivers an object by value void write_obj (Obj obj, tl::OutputStream &os, int indent, tl::pass_by_value_tag, XMLWriterState &objs) const { @@ -773,7 +728,7 @@ private: writer.begin_seq (tag, pass == 0); objs.push (&obj); for (XMLElementBase::iterator c = this->begin (); c != this->end (); ++c) { - c->get ()->write (this, writer, objs); + c->get ()->pb_write (this, writer, objs); } objs.pop (self_tag); writer.end_seq (); @@ -802,6 +757,80 @@ private: } }; +/** + * @brief A XML child element + * + * This class is a XML structure component describing a child + * element in the XML tree. There is no limit about the number of + * child elements. + * This object must be provided a pointer to a factory method (in + * the parent's class), a name and a list of children (which can be + * empty). + * Write is a class providing a Obj &operator(Parent &) operator. + * It is supposed to create a new instance of Obj within Parent. + * Read is a class providing a start(const Parent &) method to start + * iterating over the instances, a const Obj &operator() const for + * access and a bool at_end() method to determine if the iterator + * is at the end and next() to increment the iterator. + */ + +template +class TL_PUBLIC_TEMPLATE XMLElement + : public XMLElementImplBase +{ +public: + XMLElement (const Read &r, const Write &w, const std::string &name, const XMLElementList &children) + : XMLElementImplBase (r, w, name, children) + { + // .. nothing yet .. + } + + XMLElement (const Read &r, const Write &w, const std::string &name, const XMLElementList *children) + : XMLElementImplBase (r, w, name, children) + { + // .. nothing yet .. + } + + XMLElement (const XMLElement &d) + : XMLElementImplBase (d) + { + // .. nothing yet .. + } + + virtual XMLElementBase *clone () const + { + return new XMLElement (*this); + } + + virtual void create (const XMLElementBase *, XMLReaderState &objs, const std::string & /*uri*/, const std::string & /*lname*/, const std::string & /*qname*/) const + { + XMLObjTag tag; + objs.push (tag); + } + + virtual void finish (const XMLElementBase * /*parent*/, XMLReaderState &objs, const std::string & /*uri*/, const std::string & /*lname*/, const std::string & /*qname*/) const + { + XMLObjTag tag; + XMLObjTag parent_tag; + this->m_w (*objs.parent (parent_tag), objs); + objs.pop (tag); + } + + virtual void pb_create (const XMLElementBase *, XMLReaderState &objs) const + { + XMLObjTag tag; + objs.push (tag); + } + + virtual void pb_finish (const XMLElementBase * /*parent*/, XMLReaderState &objs) const + { + XMLObjTag tag; + XMLObjTag parent_tag; + this->m_w (*objs.parent (parent_tag), objs); + objs.pop (tag); + } +}; + /** * @brief A XML child element with is instantiated with a parent reference * @@ -811,23 +840,23 @@ private: template class TL_PUBLIC_TEMPLATE XMLElementWithParentRef - : public XMLElement + : public XMLElementImplBase { public: XMLElementWithParentRef (const Read &r, const Write &w, const std::string &name, const XMLElementList &children) - : XMLElement (r, w, name, children) + : XMLElementImplBase (r, w, name, children) { // .. nothing yet .. } XMLElementWithParentRef (const Read &r, const Write &w, const std::string &name, const XMLElementList *children) - : XMLElement (r, w, name, children) + : XMLElementImplBase (r, w, name, children) { // .. nothing yet .. } XMLElementWithParentRef (const XMLElementWithParentRef &d) - : XMLElement (d) + : XMLElementImplBase (d) { // .. nothing yet .. } @@ -848,7 +877,7 @@ public: { XMLObjTag tag; XMLObjTag parent_tag; - m_w (*objs.parent (parent_tag), objs); + this->m_w (*objs.parent (parent_tag), objs); objs.pop (tag); } @@ -863,7 +892,7 @@ public: { XMLObjTag tag; XMLObjTag parent_tag; - m_w (*objs.parent (parent_tag), objs); + this->m_w (*objs.parent (parent_tag), objs); objs.pop (tag); } }; @@ -1297,6 +1326,11 @@ public: return false; } + virtual void pb_create (const XMLElementBase *, XMLReaderState &) const { } + virtual void pb_parse (PBParser *, tl::ProtocolBufferReaderBase &) const { } + virtual void pb_finish (const XMLElementBase *, XMLReaderState &) const { } + virtual std::string create_def_entry (std::map > &) const { return std::string (); } + private: Write m_w; Converter m_c; @@ -1583,7 +1617,7 @@ template struct XMLMemberDummyReadAdaptor { typedef pass_by_ref_tag tag; - typedef pb_zero_cardinality_tag cardinality; + typedef zero_cardinality_tag cardinality; XMLMemberDummyReadAdaptor () { @@ -1615,7 +1649,7 @@ template struct XMLMemberReadAdaptor { typedef pass_by_ref_tag tag; - typedef pb_single_cardinality_tag cardinality; + typedef single_cardinality_tag cardinality; XMLMemberReadAdaptor (Value Parent::*member) : mp_member (member), mp_owner (0), m_done (false) @@ -1654,7 +1688,7 @@ template struct XMLMemberAccRefReadAdaptor { typedef pass_by_ref_tag tag; - typedef pb_single_cardinality_tag cardinality; + typedef single_cardinality_tag cardinality; XMLMemberAccRefReadAdaptor (const Value &(Parent::*member) () const) : mp_member (member), mp_owner (0), m_done (false) @@ -1693,7 +1727,7 @@ template struct XMLMemberAccReadAdaptor { typedef pass_by_value_tag tag; - typedef pb_single_cardinality_tag cardinality; + typedef single_cardinality_tag cardinality; XMLMemberAccReadAdaptor (Value (Parent::*member) () const) : mp_member (member), mp_owner (0), m_done (false) @@ -1732,7 +1766,7 @@ template struct XMLMemberIterReadAdaptor { typedef pass_by_ref_tag tag; - typedef pb_many_cardinality_tag cardinality; + typedef many_cardinality_tag cardinality; XMLMemberIterReadAdaptor (Iter (Parent::*begin) () const, Iter (Parent::*end) () const) : mp_begin (begin), mp_end (end) @@ -2115,6 +2149,26 @@ struct XMLStdConverter } }; +/** + * @brief A helper class to convert a string converter to a XML converter + */ +template +struct XMLStringBasedConverter + : public StringConverter +{ + typedef std::string pb_type; + + pb_type pb_encode (const typename StringConverter::value_type &v) const + { + return StringConverter::to_string (v); + } + + void pb_decode (const pb_type &s, typename StringConverter::value_type &v) const + { + StringConverter::from_string (s, v); + } +}; + /** * @brief Utility: create a XMLMember object without read & write capability */