Skip to content

Commit be22663

Browse files
committed
Add assertions
1 parent 41151cb commit be22663

File tree

8 files changed

+87
-7
lines changed

8 files changed

+87
-7
lines changed

src/Robocode/Assert.h

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#pragma once
2+
3+
#include <cstdarg>
4+
#include <filesystem>
5+
#include <string>
6+
#include <utility>
7+
8+
#define assert_true(condition, ...) \
9+
do \
10+
{ \
11+
assert_throw_if( \
12+
!(condition), \
13+
(#condition), \
14+
__FILE__, \
15+
__LINE__, \
16+
__VA_ARGS__); \
17+
} \
18+
while(0) //
19+
20+
#define assert_false(condition, ...) \
21+
do \
22+
{ \
23+
assert_throw_if( \
24+
(condition), \
25+
(#condition), \
26+
__FILE__, \
27+
__LINE__, \
28+
__VA_ARGS__); \
29+
} \
30+
while(0) //
31+
32+
template<typename... Args>
33+
static void assert_throw_if(
34+
const bool condition,
35+
const char* expression,
36+
const char* file,
37+
const int line,
38+
const char* message,
39+
Args&&... args)
40+
{
41+
if (!condition)
42+
{
43+
return;
44+
}
45+
46+
auto format = [](const char* format, ...)
47+
{
48+
va_list args;
49+
va_list temp;
50+
51+
va_start(args, format);
52+
53+
va_copy(temp, args);
54+
auto size = std::vsnprintf(nullptr, 0, format, temp);
55+
va_end(temp);
56+
57+
std::string buffer(size + 1, '\0');
58+
std::vsnprintf(buffer.data(), buffer.size(), format, args);
59+
if (!buffer.empty()) { buffer.pop_back(); }
60+
61+
va_end(args);
62+
63+
return buffer;
64+
};
65+
66+
auto filename = std::filesystem::path(file).filename();
67+
68+
throw std::runtime_error(
69+
format(message, std::forward<Args>(args)...) +
70+
format(" (%s in %s at %d)", expression, filename.c_str(), line));
71+
}

src/Robocode/Channel.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ Channel::Channel(const size_t index, const size_t dftsize, const double samplera
99
// https://newt.phys.unsw.edu.au/jw/notes.html
1010
const double hz = std::pow(2, (double(index) - 69) / 12) * concertpitch;
1111

12+
config.dftsize = dftsize;
13+
1214
config.freq = hz;
1315
config.gain = 0;
1416

@@ -49,6 +51,8 @@ double Channel::synthesize(const std::span<std::complex<double>> dft,
4951
const std::span<const double> pvcfreqs,
5052
const double gestalt) // TODO: gestalt
5153
{
54+
assert_true(dft.size() == config.dftsize, "Invalid DFT size!");
55+
5256
const double tophase = (2 * std::numbers::pi) / config.samplerate;
5357

5458
const double freq = config.freq;
@@ -62,12 +66,12 @@ double Channel::synthesize(const std::span<std::complex<double>> dft,
6266
const double f0 = pvcfreqs[i];
6367
const double f1 = freq * i;
6468

65-
freqs[i] = f1 * f0 / dftfreqs[i]; // TODO: f1 + (f0 - dftfreqs[i]) * (f1 / dftfreqs[i])
69+
freqs[i] = f1 * f0 / dftfreqs[i];
6670
}
6771

6872
for (size_t i = 1; i < dft.size() - 1; ++i)
6973
{
70-
phase[i] += freqs[i] * tophase; // TODO: omega[i] + (freqs[i] - dftfreqs[i]) * tophase
74+
phase[i] += freqs[i] * tophase;
7175

7276
if (freqs[i] <= dftfreqs.front())
7377
{

src/Robocode/Channel.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ class Channel final
2525

2626
struct
2727
{
28+
size_t dftsize;
29+
2830
double freq;
2931
double gain;
3032

src/Robocode/Channels.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ void Channels::synthesize(const std::span<const std::complex<double>> dftanal,
2525
sum += channels[channel].synthesize(dftsynth, dftfreqs, pvcfreqs, gestalt);
2626
}
2727

28-
for (size_t i = 1; i < dftsynth.size() - 1; ++i)
28+
for (size_t i = 1; i < dftfreqs.size() - 1; ++i)
2929
{
3030
const double abs = std::abs(dftanal[i]);
3131

src/Robocode/Header.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,5 @@
1515
#include <stdexcept>
1616
#include <utility>
1717
#include <vector>
18+
19+
#include <Robocode/Assert.h>

src/Robocode/SDFT.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ SDFT::SDFT(const double samplerate, const size_t dftsize) :
55
input(dftsize),
66
output(dftsize)
77
{
8+
assert_true(dftsize > 0, "Invalid DFT size!");
89
}
910

1011
float SDFT::transform(const float x, const std::function<void(

src/Robocode/Vocoder.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,17 @@ inline double angle(const std::complex<double>& z)
1313

1414
Vocoder::Vocoder(const double samplerate, const std::vector<double>& frequencies) :
1515
samplerate(samplerate),
16-
frequencies(frequencies)
16+
dftsize(frequencies.size())
1717
{
18-
const size_t dftsize = frequencies.size();
19-
2018
cache.resize(dftsize);
2119
freqs.resize(dftsize);
2220
}
2321

2422
void Vocoder::analyze(const std::span<const std::complex<double>> dft,
2523
const std::function<void(const std::span<const double> pvcfreqs)> callback)
2624
{
25+
assert_true(dft.size() == dftsize, "Invalid DFT size!");
26+
2727
const double tofreq = samplerate / (2 * std::numbers::pi);
2828

2929
for (size_t i = 0; i < dft.size(); ++i)

src/Robocode/Vocoder.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class Vocoder final
1515
private:
1616

1717
const double samplerate;
18-
const std::vector<double> frequencies;
18+
const size_t dftsize;
1919

2020
std::vector<std::complex<double>> cache;
2121
std::vector<double> freqs;

0 commit comments

Comments
 (0)