Merge pull request #15 from amplab/tuples

make it possible to serialize tuples
This commit is contained in:
Robert Nishihara
2016-03-15 22:48:25 -07:00
3 changed files with 22 additions and 0 deletions
+5
View File
@@ -21,6 +21,7 @@ message Obj {
String string_data = 1;
Int int_data = 2;
Double double_data = 3;
Tuple tuple_data = 7;
List list_data = 4;
Array array_data = 5;
PyObj pyobj_data = 6;
@@ -30,6 +31,10 @@ message List {
repeated Obj elem = 1;
}
message Tuple {
repeated Obj elem = 1;
}
message Value {
uint64 ref = 1; // for pass by reference
Obj obj = 2; // for pass by value
+16
View File
@@ -163,6 +163,14 @@ int serialize(PyObject* val, Obj* obj) {
Double* data = obj->mutable_double_data();
double d = PyFloat_AsDouble(val);
data->set_data(d);
} else if (PyTuple_Check(val)) {
Tuple* data = obj->mutable_tuple_data();
for (size_t i = 0, size = PyTuple_Size(val); i < size; ++i) {
Obj* elem = data->add_elem();
if (serialize(PyTuple_GetItem(val, i), elem) != 0) {
return -1;
}
}
} else if (PyList_Check(val)) {
List* data = obj->mutable_list_data();
for (size_t i = 0, size = PyList_Size(val); i < size; ++i) {
@@ -247,6 +255,14 @@ PyObject* deserialize(const Obj& obj) {
return PyInt_FromLong(obj.int_data().data());
} else if (obj.has_double_data()) {
return PyFloat_FromDouble(obj.double_data().data());
} else if (obj.has_tuple_data()) {
const Tuple& data = obj.tuple_data();
size_t size = data.elem_size();
PyObject* tuple = PyTuple_New(size);
for (size_t i = 0; i < size; ++i) {
PyTuple_SetItem(tuple, i, deserialize(data.elem(i)));
}
return tuple;
} else if (obj.has_list_data()) {
const List& data = obj.list_data();
size_t size = data.elem_size();
+1
View File
@@ -65,6 +65,7 @@ class SerializationTest(unittest.TestCase):
self.roundTripTest(42)
self.roundTripTest("hello world")
self.roundTripTest(42.0)
self.roundTripTest((1.0, "hi"))
a = np.zeros((100, 100))
res = orchpy.lib.serialize_object(a)