4 #ifndef CPPAPE_TRACING_ENABLED
11 #define TRC(...) __VA_ARGS__
19 namespace ape::Tracing
22 using Twine = std::pair<const char*, const char*>;
27 void reset() noexcept { index = 0; }
30 if (index < data.size())
31 data[index++] = thing;
34 data.resize(std::max<std::size_t>(1, data.size() * 2));
35 data[index++] = thing;
48 Trace<float>& getTrace(Twine
id) noexcept
55 for (
auto& pair : traces)
59 const std::map<Twine, Trace<float>>& getTraces()
const noexcept {
return traces; }
62 std::map<Twine, Trace<float>> traces;
65 template<
typename Input,
typename = std::true_type>
68 template<
typename Input>
69 struct TraceTraits<Input, typename std::is_arithmetic<Input>::type>
71 static constexpr std::size_t numElements() noexcept {
return 1; }
72 static constexpr
const char* nameForElement(std::size_t index) noexcept {
return nullptr; }
73 static constexpr
float valueForElement(
const Input& r, std::size_t index) noexcept {
return static_cast<float>(r); }
76 template<
typename InnerType>
77 struct TraceTraits<std::complex<InnerType>>
79 static constexpr std::size_t numElements() noexcept {
return 2; }
80 static constexpr
const char* nameForElement(std::size_t index) noexcept {
return index == 0 ?
"real" :
"imag"; }
81 static constexpr
float valueForElement(
const std::complex<InnerType>& r, std::size_t index) noexcept {
return index == 0 ? r.real() : r.imag(); }
84 template<
typename Result>
85 inline typename std::enable_if<TraceTraits<Result>::numElements() == 1>::type
86 TraceData(std::size_t index,
const char* identifier,
const Result& result)
88 extern Tracer GlobalTracer;
91 .getTrace(std::make_pair(identifier,
nullptr))
92 .enqueue(TraceTraits<Result>::valueForElement(result, 0));
95 template<
typename Result>
96 inline typename std::enable_if<TraceTraits<Result>::numElements() != 1>::type
97 TraceData(std::size_t index,
const char* identifier,
const Result& result)
99 extern Tracer GlobalTracer;
101 for (std::size_t i = 0; i < TraceTraits<Result>::numElements(); ++i)
104 .getTrace(std::make_pair(identifier, TraceTraits<Result>::nameForElement(i)))
105 .enqueue(TraceTraits<Result>::valueForElement(result, i));
112 #define TRC(...) ape::Tracing::TraceData(0, #__VA_ARGS__, (__VA_ARGS__))