Skip to content

Commit 5ddf554

Browse files
proxy: add BuildList helper and dedup set/vector build handlers
1 parent 3c69d12 commit 5ddf554

3 files changed

Lines changed: 13 additions & 13 deletions

File tree

include/mp/proxy-types.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,17 @@ struct ListOutput<::capnp::List<T, kind>>
280280
// clang-format on
281281
};
282282

283+
template <typename LocalType, typename Value, typename Output>
284+
void BuildList(TypeList<LocalType>, InvokeContext& invoke_context, Output&& output, Value&& value)
285+
{
286+
auto list = output.init(value.size());
287+
size_t i = 0;
288+
for (const auto& elem : value) {
289+
BuildField(TypeList<LocalType>(), invoke_context, ListOutput<typename decltype(list)::Builds>(list, i), elem);
290+
++i;
291+
}
292+
}
293+
283294
template <typename LocalType, typename Value, typename Output>
284295
void CustomBuildField(TypeList<LocalType>, Priority<0>, InvokeContext& invoke_context, Value&& value, Output&& output)
285296
{

include/mp/type-set.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,7 @@ void CustomBuildField(TypeList<std::set<LocalType>>,
1616
Value&& value,
1717
Output&& output)
1818
{
19-
// FIXME dededup with vector handler above
20-
auto list = output.init(value.size());
21-
size_t i = 0;
22-
for (const auto& elem : value) {
23-
BuildField(TypeList<LocalType>(), invoke_context, ListOutput<typename decltype(list)::Builds>(list, i), elem);
24-
++i;
25-
}
19+
BuildList(TypeList<LocalType>(), invoke_context, output, value);
2620
}
2721

2822
template <typename LocalType, typename Input, typename ReadDest>

include/mp/type-vector.h

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,7 @@ void CustomBuildField(TypeList<std::vector<LocalType>>,
1616
Value&& value,
1717
Output&& output)
1818
{
19-
// FIXME dedup with set handler below
20-
auto list = output.init(value.size());
21-
size_t i = 0;
22-
for (auto it = value.begin(); it != value.end(); ++it, ++i) {
23-
BuildField(TypeList<LocalType>(), invoke_context, ListOutput<typename decltype(list)::Builds>(list, i), *it);
24-
}
19+
BuildList(TypeList<LocalType>(), invoke_context, output, value);
2520
}
2621

2722
inline static bool BuildPrimitive(InvokeContext& invoke_context, std::vector<bool>::const_reference value, TypeList<bool>)

0 commit comments

Comments
 (0)