mirror of https://github.com/KLayout/klayout.git
Supporting to_bytes and from_bytes also for the ..WithProperties types
This commit is contained in:
parent
1de28f2d6b
commit
77fb74e072
|
|
@ -35,6 +35,7 @@
|
||||||
#include "dbPath.h"
|
#include "dbPath.h"
|
||||||
#include "dbTrans.h"
|
#include "dbTrans.h"
|
||||||
#include "dbText.h"
|
#include "dbText.h"
|
||||||
|
#include "dbObjectWithProperties.h"
|
||||||
|
|
||||||
#include "tlBinaryStream.h"
|
#include "tlBinaryStream.h"
|
||||||
#include "tlException.h"
|
#include "tlException.h"
|
||||||
|
|
@ -210,6 +211,23 @@ tl::BinaryOutputStream &operator<< (tl::BinaryOutputStream &s, const db::path<C>
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
tl::BinaryOutputStream &operator<< (tl::BinaryOutputStream &s, const db::object_with_properties<T> &o)
|
||||||
|
{
|
||||||
|
s << (uint16_t) 1; // version
|
||||||
|
|
||||||
|
s << (const T &) o;
|
||||||
|
|
||||||
|
const auto &ps = db::properties (o.properties_id ());
|
||||||
|
|
||||||
|
s << (uint64_t) ps.size ();
|
||||||
|
for (auto i = ps.begin (); i != ps.end (); ++i) {
|
||||||
|
s << db::property_name (i->first) << db::property_value (i->second);
|
||||||
|
}
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------------------
|
||||||
// Stream extractors
|
// Stream extractors
|
||||||
|
|
||||||
|
|
@ -530,6 +548,33 @@ tl::BinaryInputStream &operator>> (tl::BinaryInputStream &s, db::path<C> &p)
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
tl::BinaryInputStream &operator>> (tl::BinaryInputStream &s, db::object_with_properties<T> &o)
|
||||||
|
{
|
||||||
|
uint16_t fmt = 0;
|
||||||
|
s >> fmt;
|
||||||
|
if (fmt > 1) {
|
||||||
|
throw FutureBinarySerializationFormatException ();
|
||||||
|
}
|
||||||
|
|
||||||
|
s >> (T &) o;
|
||||||
|
|
||||||
|
uint64_t n = 0;
|
||||||
|
s >> n;
|
||||||
|
|
||||||
|
db::PropertiesSet ps;
|
||||||
|
|
||||||
|
while (n-- > 0) {
|
||||||
|
tl::Variant name, value;
|
||||||
|
s >> name >> value;
|
||||||
|
ps.insert (name, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
o.properties_id (db::properties_id (ps));
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------------------
|
||||||
// Converters of objects to a binary string
|
// Converters of objects to a binary string
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,12 +27,27 @@
|
||||||
#include "tlTypeTraits.h"
|
#include "tlTypeTraits.h"
|
||||||
#include "dbPropertiesRepository.h"
|
#include "dbPropertiesRepository.h"
|
||||||
#include "dbObjectWithProperties.h"
|
#include "dbObjectWithProperties.h"
|
||||||
|
#include "dbBinarySerialize.h"
|
||||||
#include "dbTrans.h"
|
#include "dbTrans.h"
|
||||||
#include "dbEdge.h"
|
#include "dbEdge.h"
|
||||||
|
|
||||||
namespace gsi
|
namespace gsi
|
||||||
{
|
{
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
static T *from_bytes (const std::vector<char> &s)
|
||||||
|
{
|
||||||
|
std::unique_ptr<T> t (new T ());
|
||||||
|
db::from_bytes (s, *t);
|
||||||
|
return t.release ();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
static std::vector<char> to_bytes (const T *t)
|
||||||
|
{
|
||||||
|
return db::to_bytes (*t);
|
||||||
|
}
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
static void delete_property_meth_impl (T *s, const tl::Variant &key)
|
static void delete_property_meth_impl (T *s, const tl::Variant &key)
|
||||||
{
|
{
|
||||||
|
|
@ -253,6 +268,19 @@ static gsi::Methods properties_support_methods ()
|
||||||
gsi::method ("to_s", (std::string (T::*) () const) &T::to_string,
|
gsi::method ("to_s", (std::string (T::*) () const) &T::to_string,
|
||||||
"@brief Returns a string representing the object\n"
|
"@brief Returns a string representing the object\n"
|
||||||
) +
|
) +
|
||||||
|
gsi::constructor ("from_bytes", &from_bytes<T>, gsi::arg ("s"),
|
||||||
|
"@brief Creates an object from a binary serialization\n"
|
||||||
|
"Creates the object from a binary representation (as returned by \\to_bytes)\n"
|
||||||
|
"\n"
|
||||||
|
"This method has been added in version 0.30.9.\n"
|
||||||
|
) +
|
||||||
|
gsi::method_ext ("to_bytes", &to_bytes<T>,
|
||||||
|
"@brief Returns a binary string representing this object\n"
|
||||||
|
"\n"
|
||||||
|
"This string can be turned into an object again by using \\from_bytes\n. "
|
||||||
|
"\n"
|
||||||
|
"This method has been added in version 0.30.9.\n"
|
||||||
|
) +
|
||||||
gsi::method_ext ("properties", &get_properties_meth_impl<T>,
|
gsi::method_ext ("properties", &get_properties_meth_impl<T>,
|
||||||
"@brief Gets the user properties\n"
|
"@brief Gets the user properties\n"
|
||||||
"This method is a convenience method that gets the properties of the shape as a single hash.\n"
|
"This method is a convenience method that gets the properties of the shape as a single hash.\n"
|
||||||
|
|
|
||||||
|
|
@ -552,6 +552,20 @@ class DBBox_TestClass < TestBase
|
||||||
assert_equal(s.to_s, "(0,0;100,200) props={}")
|
assert_equal(s.to_s, "(0,0;100,200) props={}")
|
||||||
assert_equal(s.property(1), nil)
|
assert_equal(s.property(1), nil)
|
||||||
|
|
||||||
|
# binary serialization
|
||||||
|
|
||||||
|
s = RBA::BoxWithProperties::new(RBA::Box::new(0, 0, 100, 200), {})
|
||||||
|
assert_equal(RBA::BoxWithProperties::from_bytes(s.to_bytes).to_s, s.to_s)
|
||||||
|
|
||||||
|
s = RBA::BoxWithProperties::new(RBA::Box::new(0, 0, 100, 200), { 1 => "one", "key" => 17 })
|
||||||
|
assert_equal(RBA::BoxWithProperties::from_bytes(s.to_bytes).to_s, s.to_s)
|
||||||
|
|
||||||
|
s = RBA::DBoxWithProperties::new(RBA::DBox::new(0, 0, 100, 200), {})
|
||||||
|
assert_equal(RBA::DBoxWithProperties::from_bytes(s.to_bytes).to_s, s.to_s)
|
||||||
|
|
||||||
|
s = RBA::DBoxWithProperties::new(RBA::DBox::new(0, 0, 100, 200), { 1 => "one", "key" => 17 })
|
||||||
|
assert_equal(RBA::DBoxWithProperties::from_bytes(s.to_bytes).to_s, s.to_s)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -990,6 +990,24 @@ class DBPolygon_TestClass < TestBase
|
||||||
assert_equal(s.class.to_s, "RBA::DSimplePolygonWithProperties")
|
assert_equal(s.class.to_s, "RBA::DSimplePolygonWithProperties")
|
||||||
assert_equal(s.downcast.class.to_s, "RBA::DSimplePolygon")
|
assert_equal(s.downcast.class.to_s, "RBA::DSimplePolygon")
|
||||||
|
|
||||||
|
# binary serialization
|
||||||
|
s = RBA::PolygonWithProperties::new(RBA::Box::new(0, 0, 100, 200), {})
|
||||||
|
assert_equal(RBA::PolygonWithProperties::from_bytes(s.to_bytes).to_s, s.to_s)
|
||||||
|
s = RBA::PolygonWithProperties::new(RBA::Box::new(0, 0, 100, 200), { 1 => "one", "key" => 17 })
|
||||||
|
assert_equal(RBA::PolygonWithProperties::from_bytes(s.to_bytes).to_s, s.to_s)
|
||||||
|
s = RBA::DPolygonWithProperties::new(RBA::DBox::new(0, 0, 100, 200), {})
|
||||||
|
assert_equal(RBA::DPolygonWithProperties::from_bytes(s.to_bytes).to_s, s.to_s)
|
||||||
|
s = RBA::DPolygonWithProperties::new(RBA::DBox::new(0, 0, 100, 200), { 1 => "one", "key" => 17 })
|
||||||
|
assert_equal(RBA::DPolygonWithProperties::from_bytes(s.to_bytes).to_s, s.to_s)
|
||||||
|
s = RBA::SimplePolygonWithProperties::new(RBA::Box::new(0, 0, 100, 200), {})
|
||||||
|
assert_equal(RBA::SimplePolygonWithProperties::from_bytes(s.to_bytes).to_s, s.to_s)
|
||||||
|
s = RBA::SimplePolygonWithProperties::new(RBA::Box::new(0, 0, 100, 200), { 1 => "one", "key" => 17 })
|
||||||
|
assert_equal(RBA::SimplePolygonWithProperties::from_bytes(s.to_bytes).to_s, s.to_s)
|
||||||
|
s = RBA::DSimplePolygonWithProperties::new(RBA::DBox::new(0, 0, 100, 200), {})
|
||||||
|
assert_equal(RBA::DSimplePolygonWithProperties::from_bytes(s.to_bytes).to_s, s.to_s)
|
||||||
|
s = RBA::DSimplePolygonWithProperties::new(RBA::DBox::new(0, 0, 100, 200), { 1 => "one", "key" => 17 })
|
||||||
|
assert_equal(RBA::DSimplePolygonWithProperties::from_bytes(s.to_bytes).to_s, s.to_s)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_triangulation
|
def test_triangulation
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue