cd5ebd84d6
C/C++ extension built directly against the vendored Cockos reaper-sdk headers (no Rust/reaper-rs wrapper layer). Loads, registers a test action, and confirms via REAPER's console — confirmed working in REAPER 2026-07-15. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
111 lines
2.3 KiB
C++
111 lines
2.3 KiB
C++
#ifndef _WDL_TIMING2_H_
|
|
#define _WDL_TIMING2_H_
|
|
|
|
#if defined(_DEBUG) || defined(WDL_TIMING_ENABLE_FOR_RELEASE)
|
|
#include "time_precise.h"
|
|
#endif
|
|
|
|
class wdl_timing_accumulator
|
|
{
|
|
public:
|
|
|
|
#if defined(_DEBUG) || defined(WDL_TIMING_ENABLE_FOR_RELEASE)
|
|
|
|
wdl_timing_accumulator(const char *name=NULL)
|
|
{
|
|
m_cnt=0;
|
|
m_tot=m_cur=0.0;
|
|
m_name = name ? name : "[unnamed]";
|
|
m_depth = 0;
|
|
}
|
|
~wdl_timing_accumulator()
|
|
{
|
|
Report("final");
|
|
}
|
|
|
|
static void _format_big_integer(double usec, char *buf, int buflen)
|
|
{
|
|
char tmp[256];
|
|
#ifdef _MSC_VER
|
|
_snprintf(tmp, sizeof(tmp), "%.0f", usec);
|
|
#else
|
|
snprintf(tmp, sizeof(tmp), "%.0f", usec);
|
|
#endif
|
|
int len = strlen(tmp);
|
|
char *from = tmp, *to = buf;
|
|
if (len*4/3 < buflen)
|
|
{
|
|
while (len--)
|
|
{
|
|
*to++ = *from++;
|
|
if (len && len%3 == 0) *to++ = ',';
|
|
}
|
|
*to = 0;
|
|
}
|
|
else
|
|
{
|
|
lstrcpyn(to, from, buflen);
|
|
}
|
|
}
|
|
|
|
void Report(const char *caption=NULL) const
|
|
{
|
|
if (m_cnt)
|
|
{
|
|
const double usec=1000000.0;
|
|
char buf1[256], buf2[256];
|
|
_format_big_integer(m_tot*usec/(double)m_cnt, buf1, sizeof(buf1));
|
|
_format_big_integer(m_tot*usec, buf2, sizeof(buf2));
|
|
wdl_log_force("timing %s%s%s%s: %.0f calls, %s usec/call, %s usec total\n",
|
|
m_name, caption ? " (" : "", caption ? caption : "", caption ? ")" : "",
|
|
(double)m_cnt, buf1, buf2);
|
|
}
|
|
}
|
|
|
|
void Begin()
|
|
{
|
|
if (!m_depth++)
|
|
m_cur = time_precise();
|
|
}
|
|
void End()
|
|
{
|
|
WDL_ASSERT(m_depth > 0);
|
|
if (!--m_depth)
|
|
{
|
|
WDL_ASSERT(m_cur != 0.0);
|
|
m_tot += time_precise()-m_cur;
|
|
m_cur=0.0;
|
|
m_cnt++;
|
|
}
|
|
}
|
|
|
|
private:
|
|
WDL_INT64 m_cnt;
|
|
double m_tot, m_cur;
|
|
const char *m_name;
|
|
int m_depth;
|
|
#else
|
|
|
|
wdl_timing_accumulator(const char *name=NULL) {}
|
|
~wdl_timing_accumulator() {}
|
|
void Report(const char *caption=NULL) {}
|
|
void Begin() {}
|
|
void End() {}
|
|
|
|
#endif
|
|
};
|
|
|
|
class wdl_timing_accumulator_hold
|
|
{
|
|
public:
|
|
#if defined(_DEBUG) || defined(WDL_TIMING_ENABLE_FOR_RELEASE)
|
|
wdl_timing_accumulator_hold(wdl_timing_accumulator *p) : m_p(p) { if (p) p->Begin(); }
|
|
~wdl_timing_accumulator_hold() { if (m_p) m_p->End(); }
|
|
wdl_timing_accumulator *m_p;
|
|
#else
|
|
wdl_timing_accumulator_hold(wdl_timing_accumulator *p) {}
|
|
#endif
|
|
};
|
|
|
|
#endif
|