Files
2026-08-16 18:24:52 +07:00

130 lines
2.9 KiB
C++

// This file is part of VSTGUI. It is subject to the license terms
// in the LICENSE file found in the top-level directory of this
// distribution and at http://github.com/steinbergmedia/vstgui/LICENSE
#include "vstguidebug.h"
#include <cstdarg>
#include <exception>
#if !defined(NDEBUG) && !defined(DEBUG)
#error VSTGUI expects either NDEBUG or DEBUG to be defined
#endif
#if DEBUG
#include "cstring.h"
#if WINDOWS
#include "platform/win32/win32support.h"
#endif
#include <cstdio>
namespace VSTGUI {
//-----------------------------------------------------------------------------
TimeWatch::TimeWatch (UTF8StringPtr inName, bool startNow)
: startTime (0)
{
if (inName)
{
auto len = std::strlen (inName);
name = std::unique_ptr<char[]> (new char[len + 1]);
std::strcpy (name.get (), inName);
}
if (startNow)
start ();
}
//-----------------------------------------------------------------------------
TimeWatch::~TimeWatch () noexcept
{
stop ();
}
//-----------------------------------------------------------------------------
void TimeWatch::start ()
{
startTime = std::clock ();
}
//-----------------------------------------------------------------------------
void TimeWatch::stop ()
{
if (startTime > 0)
{
clock_t stopTime = std::clock ();
if (name)
DebugPrint ("%s took %d\n", name.get (), stopTime - startTime);
else
DebugPrint ("it took %d\n", stopTime - startTime);
startTime = 0;
}
}
//-----------------------------------------------------------------------------
void DebugPrint (const char *format, ...)
{
static constexpr auto BufferSize = 1024u;
char string[BufferSize];
std::va_list marker;
va_start (marker, format);
if (std::vsnprintf (string, BufferSize, format, marker) == 0)
std::strcpy (string, "Empty string\n");
#if WINDOWS
UTF8StringHelper debugString (string);
OutputDebugString (debugString);
#else
std::fprintf (stderr, "%s", string);
#endif
}
} // VSTGUI
#endif // DEBUG
namespace VSTGUI {
static AssertionHandler assertionHandler = nullptr;
//------------------------------------------------------------------------
void setAssertionHandler (AssertionHandler handler)
{
assertionHandler = handler;
}
//------------------------------------------------------------------------
bool hasAssertionHandler ()
{
return assertionHandler ? true : false;
}
//------------------------------------------------------------------------
void doAssert (const char* filename, const char* line, const char* condition,
const char* desc) noexcept (false)
{
#if NDEBUG
if (!hasAssertionHandler ())
return;
#endif
if (hasAssertionHandler ())
{
try {
assertionHandler (filename, line, condition, desc);
} catch (...)
{
std::rethrow_exception (std::current_exception ());
}
}
#if DEBUG
else
{
DebugPrint ("%s:%s: Assertion '%s' failed. %s\n", filename, line, condition,
desc ? desc : "");
assert (false);
}
#endif // DEBUG
}
} // VSTGUI