@@ -39,9 +39,33 @@ template <stdx::ct_string S> constexpr auto to_module() {
39
39
}
40
40
} // namespace detail
41
41
42
- template <typename TDestinations> struct log_handler {
43
- constexpr explicit log_handler (TDestinations &&ds) : dests{std::move (ds)} {}
42
+ template <typename Destinations> struct log_writer {
43
+ template <std::size_t N>
44
+ auto write (stdx::span<std::uint8_t const , N> msg) -> void {
45
+ stdx::for_each (
46
+ [&]<typename Dest>(Dest &dest) {
47
+ conc::call_in_critical_section<Dest>(
48
+ [&] { dest.log_by_buf (msg); });
49
+ },
50
+ dests);
51
+ }
52
+
53
+ template <std::size_t N>
54
+ auto write (stdx::span<std::uint32_t const , N> msg) -> void {
55
+ [&]<std::size_t ... Is>(std::index_sequence<Is...>) {
56
+ stdx::for_each (
57
+ [&]<typename Dest>(Dest &dest) {
58
+ conc::call_in_critical_section<Dest>(
59
+ [&] { dest.log_by_args (msg[Is]...); });
60
+ },
61
+ dests);
62
+ }(std::make_index_sequence<N>{});
63
+ }
64
+
65
+ Destinations dests;
66
+ };
44
67
68
+ template <typename Writer> struct log_handler {
45
69
template <typename Env, typename FilenameStringType,
46
70
typename LineNumberType, typename MsgType>
47
71
auto log (FilenameStringType, LineNumberType, MsgType const &msg) -> void {
@@ -88,40 +112,17 @@ template <typename TDestinations> struct log_handler {
88
112
}
89
113
}
90
114
91
- private:
92
- template <std::size_t N>
93
- auto write (stdx::span<std::uint8_t const , N> msg) -> void {
94
- stdx::for_each (
95
- [&]<typename Dest>(Dest &dest) {
96
- conc::call_in_critical_section<Dest>(
97
- [&] { dest.log_by_buf (msg); });
98
- },
99
- dests);
100
- }
101
-
102
- template <std::size_t N>
103
- auto write (stdx::span<std::uint32_t const , N> msg) -> void {
104
- [&]<std::size_t ... Is>(std::index_sequence<Is...>) {
105
- stdx::for_each (
106
- [&]<typename Dest>(Dest &dest) {
107
- conc::call_in_critical_section<Dest>(
108
- [&] { dest.log_by_args (msg[Is]...); });
109
- },
110
- dests);
111
- }(std::make_index_sequence<N>{});
112
- }
113
-
114
- auto write (auto const &msg) -> void { write (msg.as_const_view ().data ()); }
115
+ auto write (auto const &msg) -> void { w.write (msg.as_const_view ().data ()); }
115
116
116
- TDestinations dests ;
117
+ Writer w ;
117
118
};
118
119
119
120
template <typename ... TDestinations> struct config {
120
121
using destinations_tuple_t = stdx::tuple<TDestinations...>;
121
122
constexpr explicit config (TDestinations... dests)
122
- : logger{stdx::tuple{std::move (dests)...}} {}
123
+ : logger{log_writer{ stdx::tuple{std::move (dests)...} }} {}
123
124
124
- log_handler<destinations_tuple_t > logger;
125
+ log_handler<log_writer< destinations_tuple_t > > logger;
125
126
};
126
127
template <typename ... Ts> config (Ts...) -> config<Ts...>;
127
128
} // namespace logging::mipi
0 commit comments