Skip to content

Commit 08268cb

Browse files
committed
🎨 Allow indexed handler to handle messages by value
- remove the `T` suffix from several template arguments - rename `BaseMsg` to `MsgBase` where appropriate: there was a mix of uses, and it isn't necessarily a message at all, but the raw storage underlying. So it's not a base message, but it is a message base. - handle by-value callbacks in the indexed builder/handler.
1 parent c1ea393 commit 08268cb

12 files changed

+175
-92
lines changed

include/msg/detail/indexed_builder_common.hpp

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -127,28 +127,26 @@ template <typename... Fields>
127127
using index_spec = decltype(stdx::make_indexed_tuple<get_field_type>(
128128
temp_index<Fields, 512, 256>{}...));
129129

130-
template <template <typename, typename, typename, typename...> typename ParentT,
131-
typename IndexSpec, typename CallbacksT, typename BaseMsgT,
132-
typename... ExtraCallbackArgsT>
130+
template <template <typename, typename, typename, typename...> typename Parent,
131+
typename IndexSpec, typename Callbacks, typename MsgBase,
132+
typename... ExtraCallbackArgs>
133133
struct indexed_builder_base {
134-
CallbacksT callbacks;
134+
Callbacks callbacks;
135135

136136
template <typename... Ts> [[nodiscard]] constexpr auto add(Ts... ts) {
137137
auto new_callbacks =
138138
stdx::tuple_cat(callbacks, separate_sum_terms(ts)...);
139139
using new_callbacks_t = decltype(new_callbacks);
140-
return ParentT<IndexSpec, new_callbacks_t, BaseMsgT,
141-
ExtraCallbackArgsT...>{new_callbacks};
140+
return Parent<IndexSpec, new_callbacks_t, MsgBase,
141+
ExtraCallbackArgs...>{new_callbacks};
142142
}
143143

144-
using callback_func_t = auto (*)(BaseMsgT const &,
145-
ExtraCallbackArgsT... args) -> bool;
144+
using callback_func_t = auto (*)(MsgBase const &,
145+
ExtraCallbackArgs... args) -> bool;
146146

147147
template <typename BuilderValue, std::size_t I>
148-
constexpr static auto invoke_callback(BaseMsgT const &data,
149-
ExtraCallbackArgsT... args) -> bool {
150-
// FIXME: incomplete message callback invocation...
151-
// 1) bit_cast message argument
148+
constexpr static auto invoke_callback(MsgBase const &data,
149+
ExtraCallbackArgs... args) -> bool {
152150
constexpr auto cb = IndexSpec{}.apply([&]<typename... Indices>(
153151
Indices...) {
154152
constexpr auto orig_cb =
@@ -164,15 +162,14 @@ struct indexed_builder_base {
164162
"Indexed callback has matcher that is never matched!");
165163
}
166164

167-
auto view = typename CB::msg_t::view_t{data};
168-
169-
if (cb.matcher(view)) {
165+
using msg_t = typename CB::msg_t;
166+
if (msg::call_with_message<msg_t>(cb.matcher, data)) {
170167
CIB_INFO(
171168
"Incoming message matched [{}], because [{}] (collapsed to "
172169
"[{}]), executing callback",
173170
stdx::ct_string_to_type<cb.name, sc::string_constant>(),
174171
orig_cb.matcher.describe(), cb.matcher.describe());
175-
cb.callable(view, args...);
172+
msg::call_with_message<msg_t>(cb.callable, data, args...);
176173
return true;
177174
}
178175
return false;

include/msg/detail/indexed_handler_common.hpp

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,15 @@
22

33
#include <log/log.hpp>
44
#include <msg/handler_interface.hpp>
5+
#include <msg/message.hpp>
56

67
#include <stdx/compiler.hpp>
78
#include <stdx/ranges.hpp>
89

10+
#include <iterator>
11+
#include <type_traits>
12+
#include <utility>
13+
914
namespace msg {
1015

1116
template <typename Field, typename Lookup> struct index {
@@ -23,30 +28,25 @@ template <typename Field, typename Lookup> struct index {
2328
}
2429
};
2530

26-
template <typename BaseMsgT, typename... ExtraCallbackArgsT>
27-
struct callback_args_t {};
28-
29-
template <typename BaseMsgT, typename... ExtraCallbackArgsT>
30-
constexpr callback_args_t<BaseMsgT, ExtraCallbackArgsT...> callback_args{};
31+
template <typename Index, typename Callbacks, typename MsgBase,
32+
typename... ExtraCallbackArgs>
33+
struct indexed_handler : handler_interface<MsgBase, ExtraCallbackArgs...> {
34+
Index index;
35+
Callbacks callback_entries;
3136

32-
template <typename IndexT, typename CallbacksT, typename BaseMsgT,
33-
typename... ExtraCallbackArgsT>
34-
struct indexed_handler : handler_interface<BaseMsgT, ExtraCallbackArgsT...> {
35-
IndexT index;
36-
CallbacksT callback_entries;
37+
template <typename Idx, typename CBs>
38+
constexpr explicit indexed_handler(Idx &&idx, CBs &&cbs)
39+
: index{std::forward<Idx>(idx)},
40+
callback_entries{std::forward<CBs>(cbs)} {}
3741

38-
constexpr explicit indexed_handler(
39-
callback_args_t<BaseMsgT, ExtraCallbackArgsT...>, IndexT new_index,
40-
CallbacksT new_callbacks)
41-
: index{new_index}, callback_entries{new_callbacks} {}
42-
43-
auto is_match(BaseMsgT const &msg) const -> bool final {
42+
// This function may lie... it may claim to match when it doesn't because
43+
// there are further conditions on the non-indexed parts of the matcher
44+
auto is_match(MsgBase const &msg) const -> bool final {
4445
return not index(msg).none();
4546
}
4647

4748
__attribute__((flatten)) auto
48-
handle(BaseMsgT const &msg,
49-
ExtraCallbackArgsT... args) const -> bool final {
49+
handle(MsgBase const &msg, ExtraCallbackArgs... args) const -> bool final {
5050
auto const callback_candidates = index(msg);
5151

5252
bool handled{};
@@ -60,4 +60,11 @@ struct indexed_handler : handler_interface<BaseMsgT, ExtraCallbackArgsT...> {
6060
}
6161
};
6262

63+
template <typename MsgBase, typename... ExtraCallbackArgs>
64+
constexpr auto make_indexed_handler = []<typename Idx, typename CBs>(
65+
Idx &&idx, CBs &&cbs) {
66+
return indexed_handler<std::remove_cvref_t<Idx>, std::remove_cvref_t<CBs>,
67+
MsgBase, ExtraCallbackArgs...>{
68+
std::forward<Idx>(idx), std::forward<CBs>(cbs)};
69+
};
6370
} // namespace msg

include/msg/handler.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,19 @@
77

88
namespace msg {
99

10-
template <typename Callbacks, typename BaseMsg, typename... ExtraCallbackArgs>
11-
struct handler : handler_interface<BaseMsg, ExtraCallbackArgs...> {
10+
template <typename Callbacks, typename MsgBase, typename... ExtraCallbackArgs>
11+
struct handler : handler_interface<MsgBase, ExtraCallbackArgs...> {
1212
Callbacks callbacks{};
1313

1414
constexpr explicit handler(Callbacks new_callbacks)
1515
: callbacks{new_callbacks} {}
1616

17-
auto is_match(BaseMsg const &msg) const -> bool final {
17+
auto is_match(MsgBase const &msg) const -> bool final {
1818
return stdx::any_of(
1919
[&](auto &callback) { return callback.is_match(msg); }, callbacks);
2020
}
2121

22-
auto handle(BaseMsg const &msg,
22+
auto handle(MsgBase const &msg,
2323
ExtraCallbackArgs... args) const -> bool final {
2424
auto const found_valid_callback = stdx::apply(
2525
[&](auto &...cbs) -> bool {

include/msg/handler_builder.hpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,20 @@
66
#include <stdx/tuple_algorithms.hpp>
77

88
namespace msg {
9-
template <typename CallbacksT, typename BaseMsgT,
10-
typename... ExtraCallbackArgsT>
9+
template <typename CallbacksT, typename MsgBase, typename... ExtraCallbackArgs>
1110
struct handler_builder {
1211
CallbacksT callbacks;
1312

1413
template <typename... Ts> [[nodiscard]] constexpr auto add(Ts... ts) {
1514
auto new_callbacks =
1615
stdx::tuple_cat(callbacks, stdx::make_tuple(ts...));
1716
using new_callbacks_t = decltype(new_callbacks);
18-
return handler_builder<new_callbacks_t, BaseMsgT,
19-
ExtraCallbackArgsT...>{new_callbacks};
17+
return handler_builder<new_callbacks_t, MsgBase, ExtraCallbackArgs...>{
18+
new_callbacks};
2019
}
2120

2221
template <typename BuilderValue> constexpr static auto build() {
23-
return handler<CallbacksT, BaseMsgT, ExtraCallbackArgsT...>{
22+
return handler<CallbacksT, MsgBase, ExtraCallbackArgs...>{
2423
BuilderValue::value.callbacks};
2524
}
2625
};

include/msg/handler_interface.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
#pragma once
22

33
namespace msg {
4-
template <typename MsgBaseT, typename... ExtraCallbackArgsT>
4+
template <typename MsgBase, typename... ExtraCallbackArgs>
55
struct handler_interface {
6-
virtual auto is_match(MsgBaseT const &msg) const -> bool = 0;
6+
virtual auto is_match(MsgBase const &msg) const -> bool = 0;
77

8-
virtual auto handle(MsgBaseT const &msg,
9-
ExtraCallbackArgsT... extra_args) const -> bool = 0;
8+
virtual auto handle(MsgBase const &msg,
9+
ExtraCallbackArgs... extra_args) const -> bool = 0;
1010
};
1111
} // namespace msg

include/msg/indexed_builder.hpp

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@
1717

1818
namespace msg {
1919
// TODO: needs index configuration
20-
template <typename IndexSpec, typename CallbacksT, typename BaseMsgT,
21-
typename... ExtraCallbackArgsT>
20+
template <typename IndexSpec, typename Callbacks, typename MsgBase,
21+
typename... ExtraCallbackArgs>
2222
struct indexed_builder
23-
: indexed_builder_base<indexed_builder, IndexSpec, CallbacksT, BaseMsgT,
24-
ExtraCallbackArgsT...> {
25-
using base_t = indexed_builder_base<indexed_builder, IndexSpec, CallbacksT,
26-
BaseMsgT, ExtraCallbackArgsT...>;
23+
: indexed_builder_base<indexed_builder, IndexSpec, Callbacks, MsgBase,
24+
ExtraCallbackArgs...> {
25+
using base_t = indexed_builder_base<indexed_builder, IndexSpec, Callbacks,
26+
MsgBase, ExtraCallbackArgs...>;
2727

2828
template <typename I, auto E>
2929
static CONSTEVAL auto get_entry(auto const &indices) {
@@ -73,14 +73,12 @@ struct indexed_builder
7373
});
7474

7575
constexpr auto num_callbacks = BuilderValue::value.callbacks.size();
76-
constexpr std::array<typename base_t::callback_func_t, num_callbacks>
77-
callback_array =
78-
base_t::template create_callback_array<BuilderValue>(
79-
std::make_index_sequence<num_callbacks>{});
76+
constexpr auto callback_array =
77+
base_t::template create_callback_array<BuilderValue>(
78+
std::make_index_sequence<num_callbacks>{});
8079

81-
return indexed_handler{
82-
callback_args_t<BaseMsgT, ExtraCallbackArgsT...>{}, baked_indices,
83-
callback_array};
80+
return make_indexed_handler<MsgBase, ExtraCallbackArgs...>(
81+
baked_indices, callback_array);
8482
}
8583
};
8684

include/msg/indexed_handler.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@
66

77
namespace msg {
88

9-
template <typename... IndicesT> struct indices : IndicesT... {
10-
CONSTEVAL explicit indices(IndicesT... index_args)
11-
: IndicesT{index_args}... {}
9+
template <typename... Indices> struct indices : Indices... {
10+
CONSTEVAL explicit indices(Indices... index_args)
11+
: Indices{index_args}... {}
1212

1313
constexpr auto operator()(auto const &data) const {
14-
return (this->IndicesT::operator()(data) & ...);
14+
return (this->Indices::operator()(data) & ...);
1515
}
1616
};
1717

include/msg/indexed_service.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
#include <stdx/tuple.hpp>
88

99
namespace msg {
10-
template <typename IndexSpec, typename MsgBaseT, typename... ExtraCallbackArgsT>
10+
template <typename IndexSpec, typename MsgBase, typename... ExtraCallbackArgs>
1111
struct indexed_service
1212
: cib::builder_meta<
13-
indexed_builder<IndexSpec, stdx::tuple<>, MsgBaseT,
14-
ExtraCallbackArgsT...>,
15-
handler_interface<MsgBaseT, ExtraCallbackArgsT...> const *> {};
13+
indexed_builder<IndexSpec, stdx::tuple<>, MsgBase,
14+
ExtraCallbackArgs...>,
15+
handler_interface<MsgBase, ExtraCallbackArgs...> const *> {};
1616
} // namespace msg

include/msg/message.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -629,8 +629,8 @@ constexpr auto equivalent(O1 const &lhs, O2 const &rhs) {
629629
}
630630

631631
template <typename Msg, typename F, typename S, typename... Args>
632-
constexpr auto call_with_message(F &&f, S &&s,
633-
Args &&...args) -> decltype(auto) {
632+
__attribute__((flatten, always_inline)) constexpr auto
633+
call_with_message(F &&f, S &&s, Args &&...args) -> decltype(auto) {
634634
if constexpr (requires {
635635
std::forward<F>(f)(std::forward<S>(s),
636636
std::forward<Args>(args)...);

include/msg/service.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
#include <stdx/tuple.hpp>
88

99
namespace msg {
10-
template <typename MsgBaseT, typename... ExtraCallbackArgsT>
10+
template <typename MsgBase, typename... ExtraCallbackArgs>
1111
struct service
1212
: cib::builder_meta<
13-
handler_builder<stdx::tuple<>, MsgBaseT, ExtraCallbackArgsT...>,
14-
handler_interface<MsgBaseT, ExtraCallbackArgsT...> const *> {};
13+
handler_builder<stdx::tuple<>, MsgBase, ExtraCallbackArgs...>,
14+
handler_interface<MsgBase, ExtraCallbackArgs...> const *> {};
1515
} // namespace msg

0 commit comments

Comments
 (0)