WIP: integrating PB with XML

This commit is contained in:
Matthias Koefferlein 2024-08-17 16:26:43 +02:00
parent 6857b55498
commit a5e26b7b99
12 changed files with 226 additions and 133 deletions

View File

@ -40,6 +40,8 @@ namespace db
template <class T>
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 <class P>
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 ());

View File

@ -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)

View File

@ -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)

View File

@ -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<double, std::pair<tl::Color, tl::Color> > value_type;
std::string to_string (const std::pair<double, std::pair<tl::Color, tl::Color> > &cm) const
{
std::string s;
@ -427,7 +431,7 @@ tl::XMLStruct<ImageProxy> 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<std::pair<double, std::pair<tl::Color, tl::Color> >, 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<std::pair<double, std::pair<tl::Color, tl::Color> >, img::DataMapping::false_color_nodes_type::const_iterator, img::DataMapping::false_color_nodes_type, tl::XMLStringBasedConverter<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", tl::XMLStringBasedConverter<ColorMapConverter> ())
) +
tl::make_member (&img::DataMapping::brightness, "brightness") +
tl::make_member (&img::DataMapping::contrast, "contrast") +
@ -437,7 +441,7 @@ tl::XMLStruct<ImageProxy> 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<db::DPoint, img::Object::landmarks_type::const_iterator, img::Object::landmarks_type, PointConverter> (&img::Object::landmarks_type::begin, &img::Object::landmarks_type::end, &img::Object::landmarks_type::push_back, "landmark", PointConverter ())
tl::make_member<db::DPoint, img::Object::landmarks_type::const_iterator, img::Object::landmarks_type, tl::XMLStringBasedConverter<PointConverter> > (&img::Object::landmarks_type::begin, &img::Object::landmarks_type::end, &img::Object::landmarks_type::push_back, "landmark", tl::XMLStringBasedConverter<PointConverter> ())
) +
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")

View File

@ -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<TimeConverter> ()) +
tl::make_member (&SaltGrain::installed_time, &SaltGrain::set_installed_time, "installed-time", tl::XMLStringBasedConverter<TimeConverter> ()) +
tl::make_member (&SaltGrain::icon, &SaltGrain::set_icon, "icon", tl::XMLStringBasedConverter<ImageConverter> ()) +
tl::make_member (&SaltGrain::screenshot, &SaltGrain::set_screenshot, "screenshot", tl::XMLStringBasedConverter<ImageConverter> ()) +
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") +

View File

@ -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 ..

View File

@ -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<lym::Macro> 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<Interpreter2s> ()) +
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<Macro> ("format") // for backward compatibility

View File

@ -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<db::LayerProperties, std::vector<db::LayerProperties>::const_iterator, std::vector<db::LayerProperties> > (&std::vector<db::LayerProperties>::begin, &std::vector<db::LayerProperties>::end, &std::vector<db::LayerProperties>::push_back, "layout-layer", db::LayoutLayerConverter ())
tl::make_member<db::LayerProperties, std::vector<db::LayerProperties>::const_iterator, std::vector<db::LayerProperties> > (&std::vector<db::LayerProperties>::begin, &std::vector<db::LayerProperties>::end, &std::vector<db::LayerProperties>::push_back, "layout-layer", tl::XMLStringBasedConverter<db::LayoutLayerConverter> ())
) +
tl::make_member (&GerberImportData::mounting, "mounting", MountingConverter ()) +
tl::make_member (&GerberImportData::mounting, "mounting", tl::XMLStringBasedConverter<MountingConverter> ()) +
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::pair <db::DPoint, db::DPoint>, std::vector<std::pair <db::DPoint, db::DPoint> >::const_iterator, std::vector<std::pair <db::DPoint, db::DPoint> > > (&std::vector<std::pair <db::DPoint, db::DPoint> >::begin, &std::vector<std::pair <db::DPoint, db::DPoint> >::end, &std::vector<std::pair <db::DPoint, db::DPoint> >::push_back, "reference-point",
tl::make_member (&std::pair <db::DPoint, db::DPoint>::first, "pcb", db::PointConverter<db::DPoint> ()) +
tl::make_member (&std::pair <db::DPoint, db::DPoint>::second, "layout", db::PointConverter<db::DPoint> ())
tl::make_member (&std::pair <db::DPoint, db::DPoint>::first, "pcb", tl::XMLStringBasedConverter<db::PointConverter<db::DPoint> > ()) +
tl::make_member (&std::pair <db::DPoint, db::DPoint>::second, "layout", tl::XMLStringBasedConverter<db::PointConverter<db::DPoint> > ())
)
) +
tl::make_member (&GerberImportData::explicit_trans, "explicit-trans", db::TransformationConverter<db::DCplxTrans> ()) +
tl::make_member (&GerberImportData::explicit_trans, "explicit-trans", tl::XMLStringBasedConverter<db::TransformationConverter<db::DCplxTrans> > ()) +
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") +

View File

@ -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<LayerModeConverter> ()) +
tl::make_member (&StreamImportData::mode, "import-mode", tl::XMLStringBasedConverter<ModeConverter> ()) +
tl::make_element (&StreamImportData::reference_points, "reference-points",
tl::make_element<ref_point, ref_point_v::const_iterator, ref_point_v> (&ref_point_v::begin, &ref_point_v::end, &ref_point_v::push_back, "reference-point",
tl::make_member (&ref_point::first, "p1") +

View File

@ -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<db::NetTracerConnectionInfo>
{
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<db::NetTracerSymbolInfo>
{
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 <class Value, class Iter>
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<NetTracerConnectionInfo, NetTracerTechnologyComponent, FallbackXMLReadAdaptor <NetTracerConnectionInfo, NetTracerConnectivity::const_iterator>, FallbackXMLWriteAdaptor <NetTracerConnectionInfo>, tl::XMLStdConverter <NetTracerConnectionInfo> > (
tl::XMLMember<NetTracerConnectionInfo, NetTracerTechnologyComponent, FallbackXMLReadAdaptor <NetTracerConnectionInfo, NetTracerConnectivity::const_iterator>, FallbackXMLWriteAdaptor <NetTracerConnectionInfo>, tl::XMLStringBasedConverter <NetTracerConnectionInfoConverter> > (
FallbackXMLReadAdaptor <NetTracerConnectionInfo, NetTracerConnectivity::const_iterator> (&NetTracerConnectivity::begin, &NetTracerConnectivity::end),
FallbackXMLWriteAdaptor <NetTracerConnectionInfo> (&NetTracerConnectivity::add), "connection") +
tl::XMLMember<NetTracerSymbolInfo, NetTracerTechnologyComponent, FallbackXMLReadAdaptor <NetTracerSymbolInfo, NetTracerConnectivity::const_symbol_iterator>, FallbackXMLWriteAdaptor <NetTracerSymbolInfo>, tl::XMLStdConverter <NetTracerSymbolInfo> > (
tl::XMLMember<NetTracerSymbolInfo, NetTracerTechnologyComponent, FallbackXMLReadAdaptor <NetTracerSymbolInfo, NetTracerConnectivity::const_symbol_iterator>, FallbackXMLWriteAdaptor <NetTracerSymbolInfo>, tl::XMLStringBasedConverter <NetTracerSymbolInfoConverter> > (
FallbackXMLReadAdaptor <NetTracerSymbolInfo, NetTracerConnectivity::const_symbol_iterator> (&NetTracerConnectivity::begin_symbols, &NetTracerConnectivity::end_symbols),
FallbackXMLWriteAdaptor <NetTracerSymbolInfo> (&NetTracerConnectivity::add_symbol), "symbols")
);

View File

@ -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<std::string, rdb::Item> (&rdb::Item::comment, &rdb::Item::set_comment, "comment") +
tl::make_member<std::string, rdb::Item> (&rdb::Item::image_str, &rdb::Item::set_image_str, "image") +
tl::make_element<rdb::Values, rdb::Item> (&rdb::Item::values, &rdb::Item::set_values, "values",
tl::make_member<rdb::ValueWrapper, rdb::Values::const_iterator, rdb::Values> (&rdb::Values::begin, &rdb::Values::end, &rdb::Values::add, "value", ValueConverter (rdb))
tl::make_member<rdb::ValueWrapper, rdb::Values::const_iterator, rdb::Values> (&rdb::Values::begin, &rdb::Values::end, &rdb::Values::add, "value", ValueConverter (rdb))
)
)
)

View File

@ -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 Obj, class Parent, class Read, class Write>
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<Obj, Parent, Read, Write> &d)
XMLElementImplBase (const XMLElementImplBase<Obj, Parent, Read, Write> &d)
: XMLElementBase (d), m_r (d.m_r), m_w (d.m_w)
{
// .. nothing yet ..
}
virtual XMLElementBase *clone () const
{
return new XMLElement<Obj, Parent, Read, Write> (*this);
}
virtual void create (const XMLElementBase *, XMLReaderState &objs, const std::string & /*uri*/, const std::string & /*lname*/, const std::string & /*qname*/) const
{
XMLObjTag<Obj> 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<Obj> tag;
XMLObjTag<Parent> 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> parent_tag;
@ -673,7 +641,7 @@ public:
}
}
virtual bool has_any (XMLWriterState &objs) const
virtual bool has_any (XMLWriterState &objs) const
{
XMLObjTag<Parent> 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<Obj> tag;
objs.push (tag);
}
virtual void pb_finish (const XMLElementBase * /*parent*/, XMLReaderState &objs) const
{
XMLObjTag<Obj> tag;
XMLObjTag<Parent> 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 Obj, class Parent, class Read, class Write>
class TL_PUBLIC_TEMPLATE XMLElement
: public XMLElementImplBase<Obj, Parent, Read, Write>
{
public:
XMLElement (const Read &r, const Write &w, const std::string &name, const XMLElementList &children)
: XMLElementImplBase<Obj, Parent, Read, Write> (r, w, name, children)
{
// .. nothing yet ..
}
XMLElement (const Read &r, const Write &w, const std::string &name, const XMLElementList *children)
: XMLElementImplBase<Obj, Parent, Read, Write> (r, w, name, children)
{
// .. nothing yet ..
}
XMLElement (const XMLElement<Obj, Parent, Read, Write> &d)
: XMLElementImplBase<Obj, Parent, Read, Write> (d)
{
// .. nothing yet ..
}
virtual XMLElementBase *clone () const
{
return new XMLElement<Obj, Parent, Read, Write> (*this);
}
virtual void create (const XMLElementBase *, XMLReaderState &objs, const std::string & /*uri*/, const std::string & /*lname*/, const std::string & /*qname*/) const
{
XMLObjTag<Obj> 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<Obj> tag;
XMLObjTag<Parent> parent_tag;
this->m_w (*objs.parent (parent_tag), objs);
objs.pop (tag);
}
virtual void pb_create (const XMLElementBase *, XMLReaderState &objs) const
{
XMLObjTag<Obj> tag;
objs.push (tag);
}
virtual void pb_finish (const XMLElementBase * /*parent*/, XMLReaderState &objs) const
{
XMLObjTag<Obj> tag;
XMLObjTag<Parent> 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 Obj, class Parent, class Read, class Write>
class TL_PUBLIC_TEMPLATE XMLElementWithParentRef
: public XMLElement<Obj, Parent, Read, Write>
: public XMLElementImplBase<Obj, Parent, Read, Write>
{
public:
XMLElementWithParentRef (const Read &r, const Write &w, const std::string &name, const XMLElementList &children)
: XMLElement<Obj, Parent, Read, Write> (r, w, name, children)
: XMLElementImplBase<Obj, Parent, Read, Write> (r, w, name, children)
{
// .. nothing yet ..
}
XMLElementWithParentRef (const Read &r, const Write &w, const std::string &name, const XMLElementList *children)
: XMLElement<Obj, Parent, Read, Write> (r, w, name, children)
: XMLElementImplBase<Obj, Parent, Read, Write> (r, w, name, children)
{
// .. nothing yet ..
}
XMLElementWithParentRef (const XMLElementWithParentRef<Obj, Parent, Read, Write> &d)
: XMLElement<Obj, Parent, Read, Write> (d)
: XMLElementImplBase<Obj, Parent, Read, Write> (d)
{
// .. nothing yet ..
}
@ -848,7 +877,7 @@ public:
{
XMLObjTag<Obj> tag;
XMLObjTag<Parent> 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<Obj> tag;
XMLObjTag<Parent> 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<size_t, std::pair<const XMLElementBase *, std::string> > &) const { return std::string (); }
private:
Write m_w;
Converter m_c;
@ -1583,7 +1617,7 @@ template <class Value, class Parent>
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 <class Value, class Parent>
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 <class Value, class Parent>
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 <class Value, class Parent>
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 <class Value, class Iter, class Parent>
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 <class StringConverter>
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
*/