MCPcopy Create free account
hub / github.com/lief-project/LIEF / init_ref_iterator

Function init_ref_iterator

api/python/src/pyIterator.hpp:29–80  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

27
28template<class T>
29void init_ref_iterator(nanobind::handle& m, const char* it_name) {
30 using ElementTy = typename T::value_type;
31
32 if (auto type = nb::type<T>(); type.is_valid()) {
33 m.attr(it_name) = type;
34 return;
35 }
36
37 nb::class_<T>(m, it_name)
38 .def_prop_ro_static("__doc__",
39 [] (const nb::object&) -> std::string {
40 using namespace std::literals;
41 if (auto type = nb::type<ElementTy>(); type.is_valid()) {
42 nb::str name = nb::type_name(type);
43 return "Iterator over :class:`"s + name.c_str() + "`";
44 }
45 return "";
46 })
47
48 .def("__getitem__",
49 [] (T& v, Py_ssize_t i) -> typename T::reference {
50 const size_t size = v.size();
51 if (i < 0) {
52 i += static_cast<Py_ssize_t>(size);
53 }
54 if (i < 0 || static_cast<size_t>(i) >= size) {
55 throw nb::index_error();
56 }
57 return v[i];
58 },
59 nb::rv_policy::reference_internal)
60
61 .def("__len__",
62 [] (T& v) {
63 return v.size();
64 })
65
66 .def("__iter__",
67 [] (const T& v) {
68 return v;
69 }, nb::rv_policy::reference_internal)
70
71 .def("__next__",
72 [] (T& v) -> typename T::reference {
73 if (v == std::end(v)) {
74 throw nb::stop_iteration();
75 }
76 auto& value = *v;
77 ++v;
78 return value;
79 }, nb::rv_policy::reference_internal);
80}
81}
82
83#endif

Callers

nothing calls this directly

Calls 3

c_strMethod · 0.80
endFunction · 0.50
sizeMethod · 0.45

Tested by

no test coverage detected