Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HELP WANTED: type_caster_incomplete_type sketch #5409

Draft
wants to merge 2 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@ set(PYBIND11_TEST_FILES
test_stl_binders
test_tagbased_polymorphic
test_thread
test_type_caster_incomplete_type
test_type_caster_pyobject_ptr
test_type_caster_std_function_specializations
test_union
Expand Down
47 changes: 47 additions & 0 deletions tests/test_type_caster_incomplete_type.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
#include "pybind11_tests.h"

namespace test_type_caster_incomplete_type {

struct ForwardDeclaredType {};

} // namespace test_type_caster_incomplete_type

using ForwardDeclaredType = test_type_caster_incomplete_type::ForwardDeclaredType;

// TODO: Move to pybind11/type_caster_incomplete_type.h, wrap in a macro.
namespace pybind11 {
namespace detail {

template <>
class type_caster<ForwardDeclaredType> {
public:
static constexpr auto name = const_name("object");

static handle
cast(ForwardDeclaredType * /*src*/, return_value_policy /*policy*/, handle /*parent*/) {
return py::none().release(); // TODO: Build and return capsule with src pointer;
}

bool load(handle /*src*/, bool /*convert*/) {
// TODO: Assign pointer_capsule = src after inspecting src.
return true;
}

template <typename T>
using cast_op_type = ForwardDeclaredType *;

explicit operator ForwardDeclaredType *() {
return nullptr; // TODO: Retrieve C++ pointer from pointer_capsule.
}

private:
capsule pointer_capsule;
};

} // namespace detail
} // namespace pybind11

TEST_SUBMODULE(type_caster_incomplete_type, m) {
m.def("rtrn_fwd_decl_type_ptr", []() { return reinterpret_cast<ForwardDeclaredType *>(0); });
m.def("pass_fwd_decl_type_ptr", [](ForwardDeclaredType *) {});
}
11 changes: 11 additions & 0 deletions tests/test_type_caster_incomplete_type.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from __future__ import annotations

from pybind11_tests import type_caster_incomplete_type as m


def test_rtrn_fwd_decl_type_ptr():
assert m.rtrn_fwd_decl_type_ptr() is None


def test_pass_fwd_decl_type_ptr():
assert m.pass_fwd_decl_type_ptr(None) is None