@@ -157,6 +157,51 @@ namespace glz
157
157
std::ignore = glz::write_json (std::forward<Args>(args)..., event->args .str );
158
158
}
159
159
}
160
+
161
+ // Automatically adds the end event when it leave scope
162
+ struct duration_scoper final
163
+ {
164
+ trace& tr;
165
+
166
+ duration_scoper (trace& tr, const std::string_view name) noexcept : tr(tr), name(name) {
167
+ if (not tr.disabled ) {
168
+ tr.begin (name);
169
+ }
170
+ }
171
+ ~duration_scoper () noexcept {
172
+ if (not tr.disabled ) {
173
+ tr.end (name);
174
+ }
175
+ }
176
+
177
+ const std::string_view name{};
178
+ };
179
+
180
+ struct async_scoper final
181
+ {
182
+ trace& tr;
183
+
184
+ async_scoper (trace& tr, const std::string_view name) noexcept : tr(tr), name(name) {
185
+ if (not tr.disabled ) {
186
+ tr.begin (name);
187
+ }
188
+ }
189
+ ~async_scoper () noexcept {
190
+ if (not tr.disabled ) {
191
+ tr.end (name);
192
+ }
193
+ }
194
+
195
+ const std::string_view name{};
196
+ };
197
+
198
+ duration_scoper scope (const std::string_view name) {
199
+ return {*this , name};
200
+ }
201
+
202
+ async_scoper async_scope (const std::string_view name) {
203
+ return {*this , name};
204
+ }
160
205
};
161
206
162
207
template <>
@@ -165,85 +210,4 @@ namespace glz
165
210
using T = trace;
166
211
static constexpr auto value = object(&T::traceEvents, &T::displayTimeUnit);
167
212
};
168
-
169
- // Global approach to user a trace
170
- // instead of calling: my_trace.begin("my event");
171
- // you can call: glz::trace_begin("my event");
172
- template <size_t I>
173
- inline trace& global_trace () noexcept
174
- {
175
- static trace trc{};
176
- return trc;
177
- }
178
-
179
- template <size_t I>
180
- inline void enable_trace () noexcept
181
- {
182
- global_trace<0 >().disabled = false ;
183
- }
184
-
185
- template <size_t I>
186
- inline void disable_trace () noexcept
187
- {
188
- global_trace<0 >().disabled = true ;
189
- }
190
-
191
- template <opts Opts = opts{}>
192
- [[nodiscard]] error_ctx write_file_trace (const std::string& file_name, auto && buffer) noexcept
193
- {
194
- const auto ec = write <set_json<Opts>()>(global_trace<0 >(), buffer);
195
- if (bool (ec)) [[unlikely]] {
196
- return ec;
197
- }
198
- return {buffer_to_file (buffer, file_name)};
199
- }
200
-
201
- template <class ... Args>
202
- requires (sizeof ...(Args) <= 1 )
203
- constexpr void trace_begin (const std::string_view name, Args&&... args) noexcept
204
- {
205
- auto & trc = global_trace<0 >();
206
- trc.begin (name, std::forward<Args>(args)...);
207
- }
208
-
209
- template <class ... Args>
210
- requires (sizeof ...(Args) <= 1 )
211
- constexpr void trace_end (const std::string_view name, Args&&... args) noexcept
212
- {
213
- auto & trc = global_trace<0 >();
214
- trc.end (name, std::forward<Args>(args)...);
215
- }
216
-
217
- template <class ... Args>
218
- requires (sizeof ...(Args) <= 1 )
219
- constexpr void trace_async_begin (const std::string_view name, Args&&... args) noexcept
220
- {
221
- auto & trc = global_trace<0 >();
222
- trc.async_begin (name, std::forward<Args>(args)...);
223
- }
224
-
225
- template <class ... Args>
226
- requires (sizeof ...(Args) <= 1 )
227
- constexpr void trace_async_end (const std::string_view name, Args&&... args) noexcept
228
- {
229
- auto & trc = global_trace<0 >();
230
- trc.async_end (name, std::forward<Args>(args)...);
231
- }
232
-
233
- // Automatically adds the end event when it leave scope
234
- struct duration_trace final
235
- {
236
- duration_trace (const std::string_view name) noexcept : name(name) { trace_begin (name); }
237
- ~duration_trace () noexcept { trace_end (name); }
238
-
239
- const std::string_view name{};
240
- };
241
-
242
- struct async_trace final
243
- {
244
- async_trace (const std::string_view name) noexcept : name(name) { trace_async_begin (name); }
245
- ~async_trace () noexcept { trace_async_end (name); }
246
-
247
- const std::string_view name{};
248
- };
249
213
}
0 commit comments