Skip to content

Commit 50239be

Browse files
authored
More repr, fix infinite loop when calling repr on a lanele->regelem->lanelet cycle (#383)
1 parent d9320cf commit 50239be

File tree

4 files changed

+175
-90
lines changed

4 files changed

+175
-90
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#pragma once
2+
#include <boost/python.hpp>
3+
#include <sstream>
4+
#include <string>
5+
6+
namespace lanelet {
7+
namespace python {
8+
inline void formatHelper(std::ostream& os) {}
9+
10+
template <typename... Args>
11+
// NOLINTNEXTLINE(readability-identifier-naming)
12+
void formatHelper(std::ostream& os, const std::string& s, const Args&... Args_) {
13+
if (!s.empty()) {
14+
os << ", ";
15+
}
16+
os << s;
17+
formatHelper(os, Args_...);
18+
}
19+
20+
template <typename T, typename... Args>
21+
// NOLINTNEXTLINE(readability-identifier-naming)
22+
void formatHelper(std::ostream& os, const T& next, const Args&... Args_) {
23+
os << ", ";
24+
os << next;
25+
formatHelper(os, Args_...);
26+
}
27+
28+
template <typename T, typename... Args>
29+
// NOLINTNEXTLINE(readability-identifier-naming)
30+
void format(std::ostream& os, const T& first, const Args&... Args_) {
31+
os << first;
32+
formatHelper(os, Args_...);
33+
}
34+
35+
template <typename... Args>
36+
// NOLINTNEXTLINE(readability-identifier-naming)
37+
std::string makeRepr(const char* name, const Args&... Args_) {
38+
std::ostringstream os;
39+
os << name << '(';
40+
format(os, Args_...);
41+
os << ')';
42+
return os.str();
43+
}
44+
45+
inline std::string repr(const boost::python::object& o) {
46+
using namespace boost::python;
47+
object repr = import("builtins").attr("repr");
48+
return call<std::string>(repr.ptr(), o);
49+
}
50+
} // namespace python
51+
} // namespace lanelet

0 commit comments

Comments
 (0)