From 328e6c0c9d0b2fb4374a61bffa4cb28feb868805 Mon Sep 17 00:00:00 2001 From: Julien Lamy Date: Thu, 19 Apr 2018 13:12:05 +0200 Subject: [PATCH] Fix wrapping shared pointers --- src/odil/Reader.h | 2 +- wrappers/python/DataSet.cpp | 35 +++++++++++++++++++++++++----- wrappers/python/Reader.cpp | 13 +++++++++-- wrappers/python/VRFinder.cpp | 15 ++++++++++++- wrappers/python/Writer.cpp | 14 ++++++++---- wrappers/python/json_converter.cpp | 2 +- wrappers/python/xml_converter.cpp | 2 +- 7 files changed, 67 insertions(+), 16 deletions(-) diff --git a/src/odil/Reader.h b/src/odil/Reader.h index 666dc274..5d97c836 100644 --- a/src/odil/Reader.h +++ b/src/odil/Reader.h @@ -85,7 +85,7 @@ class ODIL_API Reader */ Element read_element( Tag const & tag=Tag(0xffff,0xffff), - std::shared_ptr data_set={}) const; + std::shared_ptr data_set=std::make_shared()) const; /// @brief Return the meta-data header and data set stored in the stream. static std::pair, std::shared_ptr> diff --git a/wrappers/python/DataSet.cpp b/wrappers/python/DataSet.cpp index c58ae6a5..3dbf984b 100644 --- a/wrappers/python/DataSet.cpp +++ b/wrappers/python/DataSet.cpp @@ -20,6 +20,30 @@ namespace { +std::shared_ptr +constructor() +{ + return std::make_shared(); +} + +std::shared_ptr +constructor_string(std::string const & s) +{ + return std::make_shared(s); +} + +bool equal( + std::shared_ptr left, std::shared_ptr right) +{ + return *left == *right; +} + +bool different( + std::shared_ptr left, std::shared_ptr right) +{ + return !equal(left, right); +} + void add( odil::DataSet & data_set, odil::Tag const & tag, boost::python::object value_python=boost::python::object(), @@ -191,10 +215,9 @@ void wrap_DataSet() using namespace boost::python; using namespace odil; - - class_("DataSet") - .def(init<>()) - .def(init()) + class_>("DataSet", no_init) + .def("__init__", make_constructor(constructor)) + .def("__init__", make_constructor(constructor_string)) .def("add", add, add_overloads()) .def("remove", &DataSet::remove) .def("has", &DataSet::has) @@ -256,8 +279,8 @@ void wrap_DataSet() .def("__iter__", range(&begin, &end)) .def("values", &values) .def("items", &items) - .def(self == self) - .def(self != self) + .def("__eq__", equal) + .def("__ne__", different) .def( "__len__", static_cast(&DataSet::size)) diff --git a/wrappers/python/Reader.cpp b/wrappers/python/Reader.cpp index d876e7b4..226049f5 100644 --- a/wrappers/python/Reader.cpp +++ b/wrappers/python/Reader.cpp @@ -57,6 +57,14 @@ read_data_set( return reader.read_data_set(wrap_halt_condition(halt_condition)); } +odil::Element +read_element( + odil::Reader const & reader, + odil::Tag const & tag, std::shared_ptr data_set) +{ + return reader.read_element(tag, data_set); +} + boost::python::tuple read_file( odil::wrappers::python::iostream & stream, bool keep_group_length, @@ -90,8 +98,9 @@ void wrap_Reader() .def("read_tag", &Reader::read_tag) .def("read_length", &Reader::read_length) .def( - "read_element", &Reader::read_element, ( - arg("tag")=Tag(0xffff, 0xffff), arg("data_set")=DataSet() + "read_element", read_element, ( + arg("tag")=Tag(0xffff, 0xffff), + arg("data_set")=std::make_shared() )) .def( "read_file", read_file, ( diff --git a/wrappers/python/VRFinder.cpp b/wrappers/python/VRFinder.cpp index 9092e2ff..fda23938 100644 --- a/wrappers/python/VRFinder.cpp +++ b/wrappers/python/VRFinder.cpp @@ -12,12 +12,25 @@ #include "odil/VRFinder.h" +namespace +{ + +odil::VR VRFinder_call( + odil::VRFinder const & self, + odil::Tag const & tag, std::shared_ptr data_set, + std::string const & transfer_syntax) +{ + return self(tag, data_set, transfer_syntax); +} + +} + void wrap_VRFinder() { using namespace boost::python; using namespace odil; class_("VRFinder", init<>()) - .def("__call__", &VRFinder::operator()) + .def("__call__", VRFinder_call) ; } diff --git a/wrappers/python/Writer.cpp b/wrappers/python/Writer.cpp index 94ce02d3..e33bcb79 100644 --- a/wrappers/python/Writer.cpp +++ b/wrappers/python/Writer.cpp @@ -56,9 +56,9 @@ create_Writer_2( } void write_file( - std::shared_ptr data_set, + std::shared_ptr data_set, odil::wrappers::python::iostream & stream, - std::shared_ptr meta_information, + std::shared_ptr meta_information, std::string const & transfer_syntax, int item_encoding, bool use_group_length) { @@ -68,6 +68,12 @@ void write_file( use_group_length); } +void write_data_set( + odil::Writer const & writer, std::shared_ptr data_set) +{ + writer.write_data_set(data_set); +} + } void wrap_Writer() @@ -92,14 +98,14 @@ void wrap_Writer() arg("stream"), arg("transfer_syntax"), arg("item_encoding")=static_cast(Writer::ItemEncoding::ExplicitLength), arg("use_group_length")=false))) - .def("write_data_set", &Writer::write_data_set) + .def("write_data_set", write_data_set) .def("write_tag", &Writer::write_tag) .def("write_element", &Writer::write_element) .def( "write_file", write_file, ( arg("data_set"), arg("stream"), - arg("meta_information")=DataSet(), + arg("meta_information")=std::make_shared(), arg("transfer_syntax")=registry::ExplicitVRLittleEndian, arg("item_encoding")=static_cast(Writer::ItemEncoding::ExplicitLength), arg("use_group_length")=false)) diff --git a/wrappers/python/json_converter.cpp b/wrappers/python/json_converter.cpp index 6ac11a04..b4563dda 100644 --- a/wrappers/python/json_converter.cpp +++ b/wrappers/python/json_converter.cpp @@ -20,7 +20,7 @@ namespace { -std::string as_json(std::shared_ptr data_set, bool pretty_print) +std::string as_json(std::shared_ptr data_set, bool pretty_print) { auto const json = odil::as_json(data_set); diff --git a/wrappers/python/xml_converter.cpp b/wrappers/python/xml_converter.cpp index 5f971cc3..36727466 100644 --- a/wrappers/python/xml_converter.cpp +++ b/wrappers/python/xml_converter.cpp @@ -18,7 +18,7 @@ namespace { -std::string as_xml(std::shared_ptr data_set, bool pretty_print) +std::string as_xml(std::shared_ptr data_set, bool pretty_print) { auto const xml = odil::as_xml(data_set); std::ostringstream stream;