mirror of https://github.com/KLayout/klayout.git
WIP: integrating PB with XML
This commit is contained in:
parent
6857b55498
commit
a5e26b7b99
|
|
@ -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 ());
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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") +
|
||||
|
|
|
|||
|
|
@ -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 ..
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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") +
|
||||
|
|
|
|||
|
|
@ -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") +
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
);
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
)
|
||||
)
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
*/
|
||||
|
|
|
|||
Loading…
Reference in New Issue