|
|
|
#pragma once
|
|
|
|
|
|
|
|
#if defined(DEBUG)
|
|
|
|
|
|
|
|
#include <cmath>
|
|
|
|
#include <string>
|
|
|
|
#include <iostream>
|
|
|
|
#include <sstream>
|
|
|
|
|
|
|
|
typedef size_t (*ValueInpector)(const std::string& tag, const float32_t valueToTest, const float32_t _min, float32_t _max, bool outDebugInfo);
|
|
|
|
|
|
|
|
inline size_t nanValueInspector(const std::string& tag, const float32_t valueToTest, const float32_t _min, float32_t _max, bool outDebugInfo)
|
|
|
|
{
|
|
|
|
if(std::isnan(valueToTest))
|
|
|
|
{
|
|
|
|
if(outDebugInfo)
|
|
|
|
{
|
|
|
|
std::cerr << tag << ": nan" << std::endl;
|
|
|
|
}
|
|
|
|
return 1u;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0u;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline size_t normalizedValueInspector(const std::string& tag, const float32_t valueToTest, const float32_t _min, float32_t _max, bool outDebugInfo)
|
|
|
|
{
|
|
|
|
if(valueToTest > _max || valueToTest < _min)
|
|
|
|
{
|
|
|
|
if(outDebugInfo)
|
|
|
|
{
|
|
|
|
std::cerr << tag << ": out of bounds - value: " << valueToTest << " - boundaries: [" << _min << ", " << _max << "]" << std::endl;
|
|
|
|
}
|
|
|
|
return 1u;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0u;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline size_t fullInspector(const std::string& tag, const float32_t valueToTest, const float32_t _min = -1.0f, float32_t _max = 1.0f, bool outDebugInfo = true)
|
|
|
|
{
|
|
|
|
if(std::isnan(valueToTest))
|
|
|
|
{
|
|
|
|
if(outDebugInfo)
|
|
|
|
{
|
|
|
|
std::cerr << tag << ": nan" << std::endl;
|
|
|
|
}
|
|
|
|
return 1u;
|
|
|
|
}
|
|
|
|
else if(valueToTest > _max || valueToTest < _min)
|
|
|
|
{
|
|
|
|
if(outDebugInfo)
|
|
|
|
{
|
|
|
|
std::cerr << tag << ": out of bounds - value: " << valueToTest << " - boundaries: [" << _min << ", " << _max << "]" << std::endl;
|
|
|
|
}
|
|
|
|
return 1u;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0u;
|
|
|
|
}
|
|
|
|
|
|
|
|
#define SS_RESET(ss, prec, align) ss.str(""); ss.precision(prec); ss << align; ss << std::fixed
|
|
|
|
#define SS_SPACE(ss, spc, nb, align, sep) ss.fill(spc); ss.width(nb); ss << "" << sep
|
|
|
|
#define SS__TEXT(ss, spc, nb, align, sep, txt) ss << align; ss.fill(spc); ss.width(nb); ss << txt << sep
|
|
|
|
|
|
|
|
class ValueInpectorDebugger
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
ValueInpectorDebugger() {}
|
|
|
|
virtual ~ValueInpectorDebugger() {}
|
|
|
|
|
|
|
|
virtual void dump(std::ostream& out, bool deepInspection = true, const std::string& tag = "") const = 0;
|
|
|
|
virtual size_t inspect(ValueInpector inspector, bool deepInspection = true, const std::string& tag = "") const = 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
#define INSPECTABLE(clazz) clazz : public ValueInpectorDebugger
|
|
|
|
#define IMPLEMENT_DUMP(code) \
|
|
|
|
public:\
|
|
|
|
__attribute__((noinline)) virtual void dump(std::ostream& out, bool deepInspection = true, const std::string& tag = "") const override\
|
|
|
|
{\
|
|
|
|
code\
|
|
|
|
}
|
|
|
|
|
|
|
|
#define DUMP(clazz, out) clazz->dump(out, true, "")
|
|
|
|
#define DUMP2(clazz, out, tag) clazz->dump(out, true, tag)
|
|
|
|
#define FAST_DUMP(clazz, out, tag) clazz->dump(out, false, "")
|
|
|
|
#define FAST_DUMP2(clazz, out, tag) clazz->dump(out, false, tag)
|
|
|
|
|
|
|
|
#define IMPLEMENT_INSPECT(code) \
|
|
|
|
public:\
|
|
|
|
__attribute__((noinline)) virtual size_t inspect(ValueInpector inspector, bool deepInspection = true, const std::string& tag = "") const override\
|
|
|
|
{\
|
|
|
|
code\
|
|
|
|
}
|
|
|
|
|
|
|
|
#define INSPECT(obj, inspector) obj->inspect(inspector, true)
|
|
|
|
#define INSPECT2(obj, inspector, deepInspection) obj->inspect(inspector, deepInspection)
|
|
|
|
#define FULL_INSPECT(obj, deepInspection) obj->inspect(fullInspector, deepInspection)
|
|
|
|
#define FULL_INSPECT2(obj, deepInspection, tag) obj->inspect(fullInspector, deepInspection, tag)
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
#define INSPECTABLE(clazz) clazz
|
|
|
|
#define IMPLEMENT_DUMP(code)
|
|
|
|
#define IMPLEMENT_INSPECT(code)
|
|
|
|
|
|
|
|
#define DUMP(clazz, out)
|
|
|
|
#define DUMP2(clazz, out, tag)
|
|
|
|
#define FAST_DUMP(clazz, out, tag)
|
|
|
|
#define FAST_DUMP2(clazz, out, tag)
|
|
|
|
|
|
|
|
#define INSPECT(obj, inspector)
|
|
|
|
#define INSPECT2(obj, inspector, deepInspection)
|
|
|
|
#define FULL_INSPECT(obj, deepInspection)
|
|
|
|
#define FULL_INSPECT2(obj, deepInspection, tag)
|
|
|
|
|
|
|
|
#endif
|