From 681f7c3694a1500fec2ef8e8426cdad824508e00 Mon Sep 17 00:00:00 2001 From: "Jonathan B. Coe" Date: Wed, 1 Apr 2026 21:12:57 +0100 Subject: [PATCH 1/2] Example of how to add a protocol --- CMakeLists.txt | 7 ++++++- demo.h | 12 ++++++++++++ protocol_test.cc | 10 ++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 demo.h diff --git a/CMakeLists.txt b/CMakeLists.txt index e66d252..b3007c0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -116,6 +116,10 @@ if(XYZ_PROTOCOL_IS_NOT_SUBPROJECT) CLASS_NAME C INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/interface_C.h HEADER interface_C.h OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated/protocol_C.h ${OPT_MANUAL_VTABLE}) + xyz_generate_protocol( + CLASS_NAME Demo INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/demo.h + HEADER demo.h + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated/protocol_demo.h ${OPT_MANUAL_VTABLE}) add_custom_target( generate_protocols @@ -123,7 +127,8 @@ if(XYZ_PROTOCOL_IS_NOT_SUBPROJECT) ${CMAKE_CURRENT_BINARY_DIR}/generated/protocol_A_virtual.h ${CMAKE_CURRENT_BINARY_DIR}/generated/protocol_A_manual.h ${CMAKE_CURRENT_BINARY_DIR}/generated/protocol_B.h - ${CMAKE_CURRENT_BINARY_DIR}/generated/protocol_C.h) + ${CMAKE_CURRENT_BINARY_DIR}/generated/protocol_C.h + ${CMAKE_CURRENT_BINARY_DIR}/generated/protocol_demo.h) xyz_add_test( NAME diff --git a/demo.h b/demo.h new file mode 100644 index 0000000..c357b5f --- /dev/null +++ b/demo.h @@ -0,0 +1,12 @@ +#ifndef XYZ_PROTOCOL_DEMO_H +#define XYZ_PROTOCOL_DEMO_H + +namespace xyz { + +struct Demo { + int operator()(int) const; +}; + +} // namespace xyz + +#endif // XYZ_PROTOCOL_DEMO_H diff --git a/protocol_test.cc b/protocol_test.cc index eae1934..0a08439 100644 --- a/protocol_test.cc +++ b/protocol_test.cc @@ -30,6 +30,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "generated/protocol_A.h" #include "generated/protocol_B.h" #include "generated/protocol_C.h" +#include "generated/protocol_demo.h" #include "tracking_allocator.h" namespace { @@ -626,4 +627,13 @@ TEST(ProtocolViewTest, ViewMoveIsStandard) { EXPECT_EQ(view2.name(), "move_test"); } +struct Demoic { + int operator()(int x) const { return x * 2; } +}; + +TEST(ProtocolDemoTest, DemoFunction) { + xyz::protocol demo(std::in_place_type); + EXPECT_EQ(demo(5), 10); +} + } // namespace From 75a2f08a8303d6fa635f4ba2faa8e79c56da1027 Mon Sep 17 00:00:00 2001 From: "Jonathan B. Coe" Date: Wed, 1 Apr 2026 21:22:34 +0100 Subject: [PATCH 2/2] Fix for operator() which needs mangling (for now) --- demo.h | 2 +- protocol_test.cc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/demo.h b/demo.h index c357b5f..f970e5f 100644 --- a/demo.h +++ b/demo.h @@ -4,7 +4,7 @@ namespace xyz { struct Demo { - int operator()(int) const; + int call(int) const; }; } // namespace xyz diff --git a/protocol_test.cc b/protocol_test.cc index 0a08439..b80437d 100644 --- a/protocol_test.cc +++ b/protocol_test.cc @@ -628,12 +628,12 @@ TEST(ProtocolViewTest, ViewMoveIsStandard) { } struct Demoic { - int operator()(int x) const { return x * 2; } + int call(int x) const { return x * 2; } }; TEST(ProtocolDemoTest, DemoFunction) { xyz::protocol demo(std::in_place_type); - EXPECT_EQ(demo(5), 10); + EXPECT_EQ(demo.call(5), 10); } } // namespace