Skip to content

Commit 4f2e457

Browse files
committed
🎨 Decouple builder_meta
Problem: - `cib` offers `builder_meta` as a convenient way to provide a service. But sometimes other libs depend on cib only to use that, when instead they could be providing a service easily by modelling a concept. Solution: - Change `builder_meta` to a concept; libraries that don't need cib otherwise need not use it.
1 parent c2639b4 commit 4f2e457

File tree

11 files changed

+54
-67
lines changed

11 files changed

+54
-67
lines changed

docs/flows.adoc

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,10 @@ what happens by default when we run the flow.
389389
template <stdx::ct_string Name = "">
390390
using builder = flow::graph<Name, flow::graph_builder<impl>>;
391391
template <stdx::ct_string Name = "">
392-
struct service : cib::builder_meta<builder<Name>, flow::FunctionPtr> {};
392+
struct service {
393+
using builder_t = builder<Name>;
394+
using interface_t = flow::FunctionPtr;
395+
};
393396
394397
// declare a flow service
395398
struct MorningRoutine : public service<"MorningRoutine"> {};
@@ -411,7 +414,10 @@ But given a flow, other renderings are possible.
411414
template <stdx::ct_string Name = "">
412415
using viz_builder = flow::graph<Name, flow::graphviz_builder>;
413416
template <stdx::ct_string Name = "">
414-
struct viz_service : cib::builder_meta<builder<Name>, flow::VizFunctionPtr> {};
417+
struct viz_service {
418+
using builder_t = builder<Name>;
419+
using interface_t = flow::VizFunctionPtr;
420+
};
415421
----
416422

417423
Here, `viz_service` will produce a graphviz rendering of a flow using the

include/cib/builder_meta.hpp

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

33
namespace cib {
4-
/**
5-
* Describe a builder to cib.
6-
*
7-
* @tparam Builder
8-
* The initial builder type cib should use when creating a builder.
9-
* This is only the initial type, the Builder::add(...) function
10-
* may return a different type and cib will track that correctly.
11-
*
12-
* @tparam Interface
13-
* The type-erased interface services built with this builder
14-
* will implement. For example, cib::callback allows many other
15-
* callables to get executed when its service gets invoked. The
16-
* type-erased interface for cib::callback is a function pointer.
17-
*
18-
* @see cib::built
19-
*
20-
* @example callback::service
21-
*/
22-
template <typename Builder, typename Interface> struct builder_meta {
23-
using builder_t = Builder;
24-
using interface_t = Interface;
4+
template <typename T>
5+
concept builder_meta = requires {
6+
typename T::builder_t;
7+
typename T::interface_t;
258
};
269

27-
template <typename BuilderMeta>
28-
using builder_t = typename BuilderMeta::builder_t;
29-
30-
template <typename BuilderMeta>
31-
using interface_t = typename BuilderMeta::interface_t;
10+
template <builder_meta T> using builder_t = typename T::builder_t;
11+
template <builder_meta T> using interface_t = typename T::interface_t;
3212
} // namespace cib

include/cib/built.hpp

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,5 @@
33
#include <cib/builder_meta.hpp>
44

55
namespace cib {
6-
/**
7-
* Pointer to a built service implementation.
8-
*
9-
* @tparam ServiceMeta
10-
* Tag name of the service.
11-
*
12-
* @see cib::builder_meta
13-
*/
14-
template <typename ServiceMeta> interface_t<ServiceMeta> service;
6+
template <builder_meta ServiceMeta> interface_t<ServiceMeta> service;
157
} // namespace cib

include/cib/callback.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ template <int NumFuncs = 0, typename... ArgTypes> struct builder {
105105
/**
106106
* Extend this to create named callback services.
107107
*
108-
* Types that extend callback_meta can be used as unique names with
108+
* Types that extend service can be used as unique names with
109109
* cib::exports and cib::extend.
110110
*
111111
* @tparam ArgTypes
@@ -116,8 +116,8 @@ template <int NumFuncs = 0, typename... ArgTypes> struct builder {
116116
* @see cib::exports
117117
* @see cib::extend
118118
*/
119-
template <typename... ArgTypes>
120-
struct service
121-
: public cib::builder_meta<builder<0, ArgTypes...>, void (*)(ArgTypes...)> {
119+
template <typename... ArgTypes> struct service {
120+
using builder_t = builder<0, ArgTypes...>;
121+
using interface_t = void (*)(ArgTypes...);
122122
};
123123
} // namespace callback

include/cib/config.hpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
#pragma once
22

3-
#include <cib/builder_meta.hpp>
43
#include <cib/detail/components.hpp>
54
#include <cib/detail/config_details.hpp>
65
#include <cib/detail/config_item.hpp>

include/flow/builder.hpp

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

3-
#include <cib/builder_meta.hpp>
43
#include <flow/common.hpp>
54
#include <flow/graph_builder.hpp>
65
#include <flow/impl.hpp>
@@ -11,6 +10,8 @@ namespace flow {
1110
template <stdx::ct_string Name = "">
1211
using builder = graph<Name, graph_builder<Name, impl>>;
1312

14-
template <stdx::ct_string Name = "">
15-
struct service : cib::builder_meta<builder<Name>, FunctionPtr> {};
13+
template <stdx::ct_string Name = ""> struct service {
14+
using builder_t = builder<Name>;
15+
using interface_t = FunctionPtr;
16+
};
1617
} // namespace flow

include/msg/indexed_service.hpp

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

3-
#include <cib/builder_meta.hpp>
43
#include <msg/handler_interface.hpp>
54
#include <msg/indexed_builder.hpp>
65

76
#include <stdx/tuple.hpp>
87

98
namespace msg {
109
template <typename IndexSpec, typename MsgBase, typename... ExtraCallbackArgs>
11-
struct indexed_service
12-
: cib::builder_meta<
13-
indexed_builder<IndexSpec, stdx::tuple<>, MsgBase,
14-
ExtraCallbackArgs...>,
15-
handler_interface<MsgBase, ExtraCallbackArgs...> const *> {};
10+
struct indexed_service {
11+
using builder_t = indexed_builder<IndexSpec, stdx::tuple<>, MsgBase,
12+
ExtraCallbackArgs...>;
13+
using interface_t =
14+
handler_interface<MsgBase, ExtraCallbackArgs...> const *;
15+
};
1616
} // namespace msg

include/msg/service.hpp

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

3-
#include <cib/builder_meta.hpp>
43
#include <msg/handler_builder.hpp>
54
#include <msg/handler_interface.hpp>
65

76
#include <stdx/tuple.hpp>
87

98
namespace msg {
10-
template <typename MsgBase, typename... ExtraCallbackArgs>
11-
struct service
12-
: cib::builder_meta<
13-
handler_builder<stdx::tuple<>, MsgBase, ExtraCallbackArgs...>,
14-
handler_interface<MsgBase, ExtraCallbackArgs...> const *> {};
9+
template <typename MsgBase, typename... ExtraCallbackArgs> struct service {
10+
using builder_t =
11+
handler_builder<stdx::tuple<>, MsgBase, ExtraCallbackArgs...>;
12+
using interface_t =
13+
handler_interface<MsgBase, ExtraCallbackArgs...> const *;
14+
};
1515
} // namespace msg

include/seq/builder.hpp

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

3-
#include <cib/builder_meta.hpp>
43
#include <flow/common.hpp>
54
#include <flow/graph_builder.hpp>
65
#include <seq/impl.hpp>
@@ -11,6 +10,8 @@ namespace seq {
1110
template <stdx::ct_string Name = "">
1211
using builder = flow::graph<Name, flow::graph_builder<Name, impl>>;
1312

14-
template <stdx::ct_string Name = "">
15-
struct service : cib::builder_meta<builder<Name>, flow::FunctionPtr> {};
13+
template <stdx::ct_string Name = ""> struct service {
14+
using builder_t = builder<Name>;
15+
using interface_t = flow::FunctionPtr;
16+
};
1617
} // namespace seq

test/cib/builder_meta.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,20 @@ namespace {
88
struct TestBuilderTag;
99
struct TestInterfaceTag;
1010

11-
struct test_builder_meta
12-
: public cib::builder_meta<TestBuilderTag, TestInterfaceTag> {};
11+
struct test_builder_meta {
12+
using builder_t = TestBuilderTag;
13+
using interface_t = TestInterfaceTag;
14+
};
1315
} // namespace
1416

17+
TEST_CASE("builder_meta concept") {
18+
static_assert(cib::builder_meta<test_builder_meta>);
19+
}
20+
1521
TEST_CASE(
1622
"builder_meta builder and interface type traits return correct values") {
17-
REQUIRE(std::is_same_v<TestBuilderTag, cib::builder_t<test_builder_meta>>);
18-
REQUIRE(
23+
static_assert(
24+
std::is_same_v<TestBuilderTag, cib::builder_t<test_builder_meta>>);
25+
static_assert(
1926
std::is_same_v<TestInterfaceTag, cib::interface_t<test_builder_meta>>);
2027
}

0 commit comments

Comments
 (0)