How to wrap a linked list c struct, struct with pointer to another instance of itself #541
Answered
by
jeffective
jeffective
asked this question in
Q&A
-
Hello, I am a beginner, could someone point me to relevant documentation or provide some insight on how to wrap this linked list c struct and function? typedef struct ec_adapter ec_adaptert;
struct ec_adapter
{
char name[EC_MAXLEN_ADAPTERNAME];
char desc[EC_MAXLEN_ADAPTERNAME];
ec_adaptert *next;
};
ec_adaptert * ec_find_adapters(void); ChatGPT suggests something like this: nb::class_<ec_adaptert>(m, "ec_adapter")
.def_rw("name", &ec_adaptert::name)
.def_rw("desc", &ec_adaptert::desc)
.def_rw("next", &ec_adaptert::next);
m.def("ec_find_adapters", []() {
return nb::borrow<nb::list>(Py_BuildValue("N", ec_find_adapters()));
});
but that fails to compile. I'm thinking this function should perhaps return a list but definitely open to suggestions. |
Beta Was this translation helpful? Give feedback.
Answered by
jeffective
Apr 24, 2024
Replies: 2 comments
-
I figured out one way to do it. m.def("ec_find_adapters", []() {
ec_adaptert *adapters = ec_find_adapters();
nb::list adapter_list;
while (adapters != nullptr) {
nb::dict adapter_dict;
adapter_dict["name"] = nb::bytes(adapters->name);
adapter_dict["desc"] = nb::bytes(adapters->desc);
adapter_list.append(adapter_dict);
adapters = adapters->next;
}
return adapter_list;
});
|
Beta Was this translation helpful? Give feedback.
0 replies
-
I figured out an even better way nb::class_<ec_adaptert>(m, "ec_adaptert")
.def_prop_ro("name", [](ec_adaptert *adp) -> nb::bytes { return nb::bytes(adp->name); })
.def_prop_ro("desc", [](ec_adaptert *adp) -> nb::bytes { return nb::bytes(adp->desc); });
m.def("ec_find_adapters", []() -> nb::typed<nb::list, ec_adaptert> {
ec_adaptert *adapters = ec_find_adapters();
nb::typed<nb::list, ec_adaptert> adapter_list;
while (adapters != nullptr) {
adapter_list.append(adapters);
adapters = adapters->next;
}
return adapter_list;
});
which gives me the full stub from the stub generator class ec_adaptert:
@property
def name(self) -> bytes: ...
@property
def desc(self) -> bytes: ...
def ec_find_adapters() -> list[ec_adaptert]: ... |
Beta Was this translation helpful? Give feedback.
0 replies
Answer selected by
jeffective
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I figured out an even better way
which gives me the full stub from the stub generator