micro-test-plus
5.0.1
µTest++ Testing Framework
Toggle main menu visibility
Loading...
Searching...
No Matches
reflection-inlines.h
Go to the documentation of this file.
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.0 Software License,
13
* which can be obtained from https://www.boost.org/LICENSE_1_0.txt.
14
*/
15
16
// ----------------------------------------------------------------------------
17
47
48
#ifndef MICRO_OS_PLUS_MICRO_TEST_PLUS_INLINES_REFLECTION_INLINES_H_
49
#define MICRO_OS_PLUS_MICRO_TEST_PLUS_INLINES_REFLECTION_INLINES_H_
50
51
// ----------------------------------------------------------------------------
52
53
#if defined(__cplusplus)
54
55
// ----------------------------------------------------------------------------
56
57
#include <cstdint>
58
59
// ----------------------------------------------------------------------------
60
61
#if defined(__GNUC__)
62
#pragma GCC diagnostic push
63
64
#pragma GCC diagnostic ignored "-Waggregate-return"
65
#if defined(__clang__)
66
#pragma clang diagnostic ignored "-Wc++98-compat"
67
#pragma clang diagnostic ignored "-Wc++98-compat-pedantic"
68
#endif
// defined(__clang__)
69
#endif
// defined(__GNUC__)
70
71
// ============================================================================
72
73
namespace
micro_os_plus::micro_test_plus
74
{
75
// --------------------------------------------------------------------------
76
77
namespace
reflection
78
{
79
// ------------------------------------------------------------------------
80
81
#if !defined(__cpp_lib_source_location)
82
91
constexpr
source_location
92
source_location::current
(
const
char
* file,
unsigned
int
line
)
noexcept
93
{
94
source_location
sl{};
95
sl.
file_
= file;
96
sl.
line_
=
line
;
97
return
sl;
98
}
99
105
constexpr
auto
106
source_location::file_name
(
void
)
const
noexcept
107
{
108
return
file_
;
109
}
110
116
constexpr
auto
117
source_location::line
(
void
)
const
noexcept
118
{
119
return
line_
;
120
}
121
122
#endif
// !defined(__cpp_lib_source_location)
123
144
template
<
class
T>
145
constexpr
auto
146
type_name
(
void
) -> std::string_view
147
{
148
const
std::string_view sv = __PRETTY_FUNCTION__;
149
#if defined(__clang__)
150
// Clang: "... [T = <typename>]"
151
// rfind('[') locates the opening bracket of "[T = ...]".
152
const
auto
start = sv.rfind (
'['
) + 5;
// skip "[T = "
153
const
auto
end = sv.rfind (
']'
);
154
#elif defined(__GNUC__)
155
// GCC: "... [with T = <typename>]" or, on some versions,
156
// "... [with T = <typename>; std::string_view = ...]"
157
// Search for "T = " explicitly to avoid landing on a later '='.
158
const
auto
t_eq = sv.find (
"T = "
);
159
const
auto
start = t_eq + 4;
// skip "T = "
160
const
auto
semi = sv.find (
';'
, start);
161
const
auto
end
162
= (semi != std::string_view::npos) ? semi : sv.rfind (
']'
);
163
#else
164
// Note: MSVC uses __FUNCSIG__ instead of __PRETTY_FUNCTION__.
165
// MSVC is not a supported target for this framework.
166
#error "Unsupported compiler"
167
#endif
// defined(__clang__) || defined(__GNUC__)
168
return
sv.substr (start, end - start);
169
}
170
171
// ------------------------------------------------------------------------
172
}
// namespace reflection
173
174
// --------------------------------------------------------------------------
175
}
// namespace micro_os_plus::micro_test_plus
176
177
#if defined(__GNUC__)
178
#pragma GCC diagnostic pop
179
#endif
// defined(__GNUC__)
180
181
// ----------------------------------------------------------------------------
182
183
#endif
// defined(__cplusplus)
184
185
// ----------------------------------------------------------------------------
186
187
#endif
// MICRO_OS_PLUS_MICRO_TEST_PLUS_INLINES_REFLECTION_INLINES_H_
188
189
// ----------------------------------------------------------------------------
micro_os_plus::micro_test_plus::reflection::source_location
Local implementation of source location information for diagnostics.
Definition
reflection.h:150
micro_os_plus::micro_test_plus::reflection::source_location::line_
unsigned int line_
The line number where the source location was captured.
Definition
reflection.h:198
micro_os_plus::micro_test_plus::reflection::source_location::file_name
constexpr auto file_name(void) const noexcept
Retrieve the file name associated with this source location.
Definition
reflection-inlines.h:106
micro_os_plus::micro_test_plus::reflection::source_location::line
constexpr auto line(void) const noexcept
Retrieve the line number associated with this source location.
Definition
reflection-inlines.h:117
micro_os_plus::micro_test_plus::reflection::source_location::file_
const char * file_
The file name where the source location was captured.
Definition
reflection.h:193
micro_os_plus::micro_test_plus::reflection::source_location::current
static constexpr source_location current(const char *file="unknown", unsigned int line={}) noexcept
Obtain the current source location.
Definition
reflection-inlines.h:92
micro_os_plus::micro_test_plus::reflection
Reflection utilities for the µTest++ testing framework.
Definition
reflection-inlines.h:78
micro_os_plus::micro_test_plus::reflection::type_name
constexpr auto type_name(void) -> std::string_view
Extract the type name from the __PRETTY_FUNCTION__ macro.
Definition
reflection-inlines.h:146
micro_os_plus::micro_test_plus
Primary namespace for the µTest++ testing framework.
Definition
deferred-reporter.h:82
include
micro-os-plus
micro-test-plus
inlines
reflection-inlines.h
Generated by
1.17.0