@@ -39,9 +39,34 @@ 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 operator ()(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 operator ()(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
+ };
67
+ template <typename T> log_writer (T) -> log_writer<T>;
44
68
69
+ template <typename Writer> struct log_handler {
45
70
template <typename Env, typename FilenameStringType,
46
71
typename LineNumberType, typename MsgType>
47
72
auto log (FilenameStringType, LineNumberType, MsgType const &msg) -> void {
@@ -88,40 +113,17 @@ template <typename TDestinations> struct log_handler {
88
113
}
89
114
}
90
115
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 ()); }
116
+ auto write (auto const &msg) -> void { w (msg.as_const_view ().data ()); }
115
117
116
- TDestinations dests ;
118
+ Writer w ;
117
119
};
118
120
119
121
template <typename ... TDestinations> struct config {
120
122
using destinations_tuple_t = stdx::tuple<TDestinations...>;
121
123
constexpr explicit config (TDestinations... dests)
122
- : logger{stdx::tuple{std::move (dests)...}} {}
124
+ : logger{log_writer{ stdx::tuple{std::move (dests)...} }} {}
123
125
124
- log_handler<destinations_tuple_t > logger;
126
+ log_handler<log_writer< destinations_tuple_t > > logger;
125
127
};
126
128
template <typename ... Ts> config (Ts...) -> config<Ts...>;
127
129
} // namespace logging::mipi
0 commit comments