Skip to main content

deferred-reporter-inlines.h File

C++ header file with inline implementations for the µTest++ internals. More...

Included Headers

#include <charconv> #include <cstdio>

Namespaces Index

namespacemicro_os_plus

The primary namespace for the µOS++ framework. More...

namespacemicro_test_plus

Primary namespace for the µTest++ testing framework. More...

namespacedetail

Internal implementation details for the µTest++ framework. More...

Description

C++ header file with inline implementations for the µTest++ internals.

This header provides the inline implementations for internal components of the µTest++ framework, including operator overloads and constructors for deferred reporting mechanisms.

It defines the logic for accumulating expectation messages, handling both arithmetic and string-like types, as well as the construction and destruction behaviour of deferred reporters, ensuring that test outcomes are accurately captured and reported.

All definitions reside within the micro_os_plus::micro_test_plus::detail namespace, ensuring clear separation from user code and minimising the risk of naming conflicts.

The header files are organised within the include/micro-os-plus/micro-test-plus folder to maintain a structured and modular codebase.

This file is intended solely for internal use within the framework and should not be included directly by user code.

File Listing

The file content with the documentation metadata removed is:

1/*
2 * This file is part of the µOS++ project (https://micro-os-plus.github.io/).
3 * Copyright (c) 2021-2026 Liviu Ionescu. All rights reserved.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose is hereby granted, under the terms of the MIT license.
7 *
8 * If a copy of the license was not distributed with this file, it can be
9 * obtained from https://opensource.org/licenses/mit.
10 *
11 * Major parts of the code are inspired from v1.1.8 of the Boost UT project,
12 * released under the terms of the Boost Version 1 Software License,
13 * which can be obtained from https://www.boost.org/LICENSE_1_0.txt.
14 */
15
16// ----------------------------------------------------------------------------
17
44
45#ifndef MICRO_TEST_PLUS_DEFERRED_REPORTER_INLINES_H_
46#define MICRO_TEST_PLUS_DEFERRED_REPORTER_INLINES_H_
47
48// ----------------------------------------------------------------------------
49
50#ifdef __cplusplus
51
52// ----------------------------------------------------------------------------
53
54#include <charconv>
55#include <cstdio>
56
57#if defined(MICRO_OS_PLUS_TRACE)
58#include <micro-os-plus/diag/trace.h>
59#endif // MICRO_OS_PLUS_TRACE
60
61// ----------------------------------------------------------------------------
62
63#if defined(__GNUC__)
64#pragma GCC diagnostic push
65#pragma GCC diagnostic ignored "-Waggregate-return"
66#if defined(__clang__)
67#pragma clang diagnostic ignored "-Wc++98-compat"
68#pragma clang diagnostic ignored "-Wc++98-compat-pedantic"
69#endif
70#endif
71
72// ============================================================================
73
75{
76 // --------------------------------------------------------------------------
77
78 namespace detail
79 {
80 // ========================================================================
81
86 inline bool
88 {
89 return value_;
90 }
91
92 // ------------------------------------------------------------------------
93
105 template <class T>
107 auto&
109 {
110 if constexpr (std::is_same_v<T, char>)
111 {
112 deferred_output_.push_back (msg);
113 }
114 else if constexpr (std::is_arithmetic_v<T>)
115 {
116 // Optimise to avoid dynamic memory allocation in std::to_string by
117 // using a fixed-size buffer and std::to_chars.
118#if defined(__GNUC__)
119#pragma GCC diagnostic push
120#if defined(__clang__)
121#pragma clang diagnostic ignored "-Wunsafe-buffer-usage"
122#endif
123#endif
124 char buf[64];
125 // 64 bytes is sufficient for the longest decimal representation
126 // of any standard arithmetic type (long double ~45 chars).
127 static_assert (sizeof (buf) >= 50,
128 "buf must be large enough for any arithmetic type");
129 auto [ptr, ec] = std::to_chars (buf, buf + sizeof (buf), msg);
130 if (ec == std::errc{})
131 deferred_output_.append (buf, ptr);
132#if defined(__GNUC__)
133#pragma GCC diagnostic pop
134#endif
135 }
136 else
137 {
138 deferred_output_.append (msg);
139 }
140 return *this;
141 }
142
143 // ------------------------------------------------------------------------
144
156 template <class Expr_T>
158 const Expr_T& expr, bool abort,
160 expression_formatter& expression)
161 : deferred_reporter_base{ static_cast<bool> (expr), location, subtest }
162
163 {
164#if defined(MICRO_OS_PLUS_TRACE) \
165 && defined(MICRO_OS_PLUS_TRACE_MICRO_TEST_PLUS_CONSTRUCTORS)
166 trace::printf ("%s\n", __PRETTY_FUNCTION__);
167#endif // MICRO_OS_PLUS_TRACE_MICRO_TEST_PLUS_CONSTRUCTORS
168 abort_ = abort;
170
171 expression.clear ();
172
173 expression << expr;
174 }
175
176 // ------------------------------------------------------------------------
177 } // namespace detail
178
179 // --------------------------------------------------------------------------
180} // namespace micro_os_plus::micro_test_plus
181
182#if defined(__GNUC__)
183#pragma GCC diagnostic pop
184#endif
185
186// ----------------------------------------------------------------------------
187
188#endif // __cplusplus
189
190// ----------------------------------------------------------------------------
191
192#endif // MICRO_TEST_PLUS_DEFERRED_REPORTER_INLINES_H_
193
194// ----------------------------------------------------------------------------

Generated via doxygen2docusaurus 2.2.0 by Doxygen 1.17.0.