Skip to content

Commit

Permalink
Merge branch 'fix_lambda_missed_reference'
Browse files Browse the repository at this point in the history
  • Loading branch information
pthom committed Dec 2, 2024
2 parents b56f3c8 + be1e800 commit de3a455
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 1 deletion.
12 changes: 11 additions & 1 deletion src/litgen/internal/adapt_function_params/apply_all_adapters.py
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,17 @@ def _make_adapted_lambda_code_end(adapted_function: AdaptedFunction, lambda_adap

# Fill auto_r_equal_or_void
_fn_return_type = adapted_function.cpp_adapted_function.str_full_return_type()
auto_r_equal_or_void = "auto lambda_result = " if _fn_return_type != "void" else ""
_return_referenced = False

if hasattr(adapted_function.cpp_element(), "return_type"):
_return_referenced = '&' in adapted_function.cpp_element().return_type.modifiers

# Fill auto_r_equal_or_void
if _fn_return_type != "void":
_auto = "auto&" if _return_referenced else "auto"
auto_r_equal_or_void = f"{_auto} lambda_result = "
else:
auto_r_equal_or_void = ""

# Fill function_or_lambda_to_call
if adapted_function.lambda_to_call is not None:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,14 @@
from dataclasses import dataclass
from typing import Optional

from codemanip import code_utils

import srcmlcpp
from srcmlcpp import srcmlcpp_main
from srcmlcpp.cpp_types import CppFunctionDecl

import litgen
from litgen import litgen_generator

@dataclass
class AdaptedFunction2(CppFunctionDecl):
Expand All @@ -31,3 +35,44 @@ def test_inherit():
cpp_function = srcmlcpp_main.code_first_child_of_type(options, CppFunctionDecl, code)
assert isinstance(cpp_function, CppFunctionDecl)
_ = AdaptedFunction2(cpp_function, "Foo")


def test_lambda_correctly_returns_reference():
"""
Test for check the "auto& lambda_result" has a reference
"""
options = litgen.LitgenOptions()
code = """
class MyClass {
public:
MyClass& setArray(const uint8_t arr[20]) {
memcpy(_signature, arr, sizeof(arr));
return *this;
}
private:
uint8_t _arr[20];
};
"""

generated_code = litgen.generate_code(options, code)
code_utils.assert_are_codes_equal(
generated_code.pydef_code,
"""
auto pyClassMyClass =
py::class_<MyClass>
(m, "MyClass", "")
.def(py::init<>()) // implicit default constructor
.def("set_array",
[](MyClass & self, const std::array<uint8_t, 20>& arr) -> MyClass &
{
auto setArray_adapt_fixed_size_c_arrays = [&self](const std::array<uint8_t, 20>& arr) -> MyClass &
{
auto& lambda_result = self.setArray(arr.data());
return lambda_result;
};
return setArray_adapt_fixed_size_c_arrays(arr);
}, py::arg("arr"))
;
""",
)

0 comments on commit de3a455

Please sign in to comment.