aboutsummaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
Diffstat (limited to 'common')
-rw-r--r--common/pybindings.cc4
-rw-r--r--common/pycontainers.h20
2 files changed, 19 insertions, 5 deletions
diff --git a/common/pybindings.cc b/common/pybindings.cc
index 1746c517..f84d21f5 100644
--- a/common/pybindings.cc
+++ b/common/pybindings.cc
@@ -117,10 +117,6 @@ BOOST_PYTHON_MODULE(MODULE_NAME)
def("parse_json", parse_json_shim);
def("load_design", load_design_shim, return_value_policy<manage_new_object>());
- class_<IdString>("IdString")
- .def("__str__", &IdString::global_str, return_value_policy<copy_const_reference>())
- .def(self < self)
- .def(self == self);
arch_wrap_python();
}
diff --git a/common/pycontainers.h b/common/pycontainers.h
index e1a73d75..6870c3a4 100644
--- a/common/pycontainers.h
+++ b/common/pycontainers.h
@@ -24,6 +24,7 @@
#include <boost/python.hpp>
#include <boost/python/suite/indexing/map_indexing_suite.hpp>
#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
+#include <sstream>
#include <stdexcept>
#include <type_traits>
#include <utility>
@@ -81,6 +82,7 @@ template <typename T, typename P = return_value_policy<return_by_value>,
struct range_wrapper
{
typedef decltype(std::declval<T>().begin()) iterator_t;
+ typedef decltype(*(std::declval<iterator_t>())) value_t;
typedef typename PythonConversion::ContextualWrapper<T> wrapped_range;
typedef typename PythonConversion::ContextualWrapper<std::pair<iterator_t, iterator_t>> wrapped_pair;
static wrapped_pair iter(wrapped_range &range)
@@ -88,9 +90,25 @@ struct range_wrapper
return wrapped_pair(range.ctx, std::make_pair(range.base.begin(), range.base.end()));
}
+ static std::string repr(wrapped_range &range)
+ {
+ PythonConversion::string_converter<value_t> conv;
+ bool first = true;
+ std::stringstream ss;
+ ss << "[";
+ for (const auto &item : range.base) {
+ if (!first)
+ ss << ", ";
+ ss << "'" << conv.to_str(range.ctx, item) << "'";
+ first = false;
+ }
+ ss << "]";
+ return ss.str();
+ }
+
static void wrap(const char *range_name, const char *iter_name)
{
- class_<wrapped_range>(range_name, no_init).def("__iter__", iter);
+ class_<wrapped_range>(range_name, no_init).def("__iter__", iter).def("__repr__", repr);
iterator_wrapper<iterator_t, P, value_conv>().wrap(iter_name);
}