More JSON code simplifications.

Signed-off-by: Adrian Conlon <adrian.conlon@gmail.com>
This commit is contained in:
Adrian Conlon 2021-10-20 23:06:42 +01:00
parent c39178f9d1
commit 0deb37ab19
11 changed files with 42 additions and 91 deletions

View File

@ -27,20 +27,20 @@ void TestRunner::addActualCycle(const cycle_t& value) {
m_actualCycles.add(value); m_actualCycles.add(value);
} }
void TestRunner::addActualCycle(uint16_t address, uint8_t value, cycle_t::action_t action) { void TestRunner::addActualCycle(uint16_t address, uint8_t value, std::string action) {
addActualCycle({ address, value, action }); addActualCycle({ address, value, action });
} }
void TestRunner::addActualCycle(EightBit::register16_t address, uint8_t value, cycle_t::action_t action) { void TestRunner::addActualCycle(EightBit::register16_t address, uint8_t value, std::string action) {
addActualCycle(address.word, value, action); addActualCycle(address.word, value, action);
} }
void TestRunner::addActualReadCycle(EightBit::register16_t address, uint8_t value) { void TestRunner::addActualReadCycle(EightBit::register16_t address, uint8_t value) {
addActualCycle(address, value, cycle_t::action_t::read); addActualCycle(address, value, "read");
} }
void TestRunner::addActualWriteCycle(EightBit::register16_t address, uint8_t value) { void TestRunner::addActualWriteCycle(EightBit::register16_t address, uint8_t value) {
addActualCycle(address, value, cycle_t::action_t::write); addActualCycle(address, value, "write");
} }
void TestRunner::dumpCycles(std::string which, const cycles_t& events) { void TestRunner::dumpCycles(std::string which, const cycles_t& events) {
@ -58,7 +58,7 @@ void TestRunner::dumpCycle(const cycle_t& cycle) {
os() os()
<< "Address: " << std::setw(4) << cycle.address() << "Address: " << std::setw(4) << cycle.address()
<< ", value: " << std::setw(2) << (int)cycle.value() << ", value: " << std::setw(2) << (int)cycle.value()
<< ", action: " << cycle_t::to_string(cycle.action()); << ", action: " << cycle.action();
m_messages.push_back(os().str()); m_messages.push_back(os().str());
os().str(""); os().str("");
} }
@ -98,11 +98,11 @@ void TestRunner::raise(std::string what, uint8_t expected, uint8_t actual) {
os().str(""); os().str("");
} }
void TestRunner::raise(std::string what, cycle_t::action_t expected, cycle_t::action_t actual) { void TestRunner::raise(std::string what, std::string expected, std::string actual) {
os() os()
<< what << what
<< ": expected: " << cycle_t::to_string(expected) << ": expected: " << expected
<< ", actual: " << cycle_t::to_string(actual); << ", actual: " << actual;
m_messages.push_back(os().str()); m_messages.push_back(os().str());
os().str(""); os().str("");
} }

View File

@ -33,7 +33,7 @@ private:
void raise(std::string what, uint16_t expected, uint16_t actual); void raise(std::string what, uint16_t expected, uint16_t actual);
void raise(std::string what, uint8_t expected, uint8_t actual); void raise(std::string what, uint8_t expected, uint8_t actual);
void raise(std::string what, cycle_t::action_t expected, cycle_t::action_t actual); void raise(std::string what, std::string expected, std::string actual);
template<class T> template<class T>
bool check(std::string what, T expected, T actual) { bool check(std::string what, T expected, T actual) {
@ -46,8 +46,8 @@ private:
bool check(std::string what, uint16_t address, uint8_t expected, uint8_t actual); bool check(std::string what, uint16_t address, uint8_t expected, uint8_t actual);
void addActualCycle(const cycle_t& value); void addActualCycle(const cycle_t& value);
void addActualCycle(uint16_t address, uint8_t value, cycle_t::action_t action); void addActualCycle(uint16_t address, uint8_t value, std::string action);
void addActualCycle(EightBit::register16_t address, uint8_t value, cycle_t::action_t action); void addActualCycle(EightBit::register16_t address, uint8_t value, std::string action);
void addActualReadCycle(EightBit::register16_t address, uint8_t value); void addActualReadCycle(EightBit::register16_t address, uint8_t value);
void addActualWriteCycle(EightBit::register16_t address, uint8_t value); void addActualWriteCycle(EightBit::register16_t address, uint8_t value);

View File

@ -6,12 +6,12 @@
class byte_t final { class byte_t final {
private: private:
simdjson::dom::array m_raw; const simdjson::dom::array m_raw;
public: public:
byte_t(simdjson::dom::element input) noexcept; byte_t(simdjson::dom::element input) noexcept;
byte_t(simdjson::dom::array input) noexcept; byte_t(simdjson::dom::array input) noexcept;
[[nodiscard]] auto address() const noexcept { return (uint16_t)(int64_t)*m_raw.begin(); } [[nodiscard]] auto address() const noexcept { return (uint16_t)(int64_t)m_raw.at(0); }
[[nodiscard]] auto value() const noexcept { return (uint8_t)(int64_t)m_raw.at(1); } [[nodiscard]] auto value() const noexcept { return (uint8_t)(int64_t)m_raw.at(1); }
}; };

View File

@ -1,25 +1,7 @@
#include "stdafx.h" #include "stdafx.h"
#include "cycle_t.h" #include "cycle_t.h"
#include <cassert> cycle_t::cycle_t(uint16_t address, uint8_t value, std::string action) noexcept
cycle_t::action_t cycle_t::to_action(std::string value) noexcept {
if (value == "read")
return action_t::read;
if (value == "write")
return action_t::write;
return action_t::unknown;
}
std::string cycle_t::to_string(action_t value) noexcept {
if (value == action_t::read)
return "read";
if (value == action_t::write)
return "write";
return "unknown";
}
cycle_t::cycle_t(uint16_t address, uint8_t value, action_t action) noexcept
: m_address(address), : m_address(address),
m_value(value), m_value(value),
m_action(action) {} m_action(action) {}
@ -27,10 +9,7 @@ cycle_t::cycle_t(uint16_t address, uint8_t value, action_t action) noexcept
cycle_t::cycle_t(simdjson::dom::element input) noexcept cycle_t::cycle_t(simdjson::dom::element input) noexcept
: cycle_t(input.get_array()) {} : cycle_t(input.get_array()) {}
cycle_t::cycle_t(simdjson::dom::array input) noexcept { cycle_t::cycle_t(simdjson::dom::array input) noexcept
assert(input.size() == 3); : m_address((uint16_t)(int64_t)input.at(0)),
auto iterator = input.begin(); m_value((uint8_t)(int64_t)input.at(1)),
m_address = (uint16_t)(int64_t)*iterator; m_action((std::string)input.at(2)) {}
m_value = (uint8_t)(int64_t)*++iterator;
m_action = to_action((std::string)*++iterator);
}

View File

@ -6,24 +6,18 @@
#include "simdjson/simdjson.h" #include "simdjson/simdjson.h"
class cycle_t final { class cycle_t final {
public:
enum class action_t { read, write, unknown };
private: private:
uint16_t m_address = 0xffff; const uint16_t m_address = 0xffff;
uint8_t m_value = 0xff; const uint8_t m_value = 0xff;
action_t m_action = action_t::unknown; const std::string m_action;
public: public:
[[nodiscard]] static std::string to_string(action_t value) noexcept; cycle_t(uint16_t address, uint8_t value, std::string action) noexcept;
[[nodiscard]] static action_t to_action(std::string value) noexcept;
cycle_t(uint16_t address, uint8_t value, action_t action) noexcept;
cycle_t(simdjson::dom::element input) noexcept; cycle_t(simdjson::dom::element input) noexcept;
cycle_t(simdjson::dom::array input) noexcept; cycle_t(simdjson::dom::array input) noexcept;
[[nodiscard]] constexpr auto address() const noexcept { return m_address; } [[nodiscard]] constexpr auto address() const noexcept { return m_address; }
[[nodiscard]] constexpr auto value() const noexcept { return m_value; } [[nodiscard]] constexpr auto value() const noexcept { return m_value; }
[[nodiscard]] constexpr auto action() const noexcept { return m_action; } [[nodiscard]] auto action() const noexcept { return m_action; }
}; };

View File

@ -23,6 +23,5 @@ public:
void clear() { m_cycles.clear(); } void clear() { m_cycles.clear(); }
[[nodiscard]] auto& operator[](size_t idx) noexcept { return m_cycles[idx]; }
[[nodiscard]] const auto& operator[](size_t idx) const noexcept { return m_cycles[idx]; } [[nodiscard]] const auto& operator[](size_t idx) const noexcept { return m_cycles[idx]; }
}; };

View File

@ -21,8 +21,6 @@ public:
[[nodiscard]] auto size() const noexcept { return m_bytes.size(); } [[nodiscard]] auto size() const noexcept { return m_bytes.size(); }
void clear() noexcept { m_bytes.clear(); }
[[nodiscard]] auto& operator[](size_t idx) noexcept { return m_bytes[idx]; } [[nodiscard]] auto& operator[](size_t idx) noexcept { return m_bytes[idx]; }
[[nodiscard]] auto operator[](size_t idx) const noexcept { return m_bytes[idx]; } [[nodiscard]] auto operator[](size_t idx) const noexcept { return m_bytes[idx]; }
}; };

View File

@ -1,11 +1,5 @@
#include "stdafx.h" #include "stdafx.h"
#include "state_t.h" #include "state_t.h"
state_t::state_t(const simdjson::dom::element serialised) state_t::state_t(const simdjson::dom::element input)
: m_pc((uint16_t)(int64_t)serialised["pc"]), : m_raw(input) {}
m_s((uint8_t)(int64_t)serialised["s"]),
m_a((uint8_t)(int64_t)serialised["a"]),
m_x((uint8_t)(int64_t)serialised["x"]),
m_y((uint8_t)(int64_t)serialised["y"]),
m_p((uint8_t)(int64_t)serialised["p"]),
m_ram(serialised["ram"].get_array()) {}

View File

@ -8,22 +8,16 @@
class state_t final { class state_t final {
private: private:
uint16_t m_pc = 0xffff; const simdjson::dom::element m_raw;
uint8_t m_s = 0xff;
uint8_t m_a = 0xff;
uint8_t m_x = 0xff;
uint8_t m_y = 0xff;
uint8_t m_p = 0xff;
ram_t m_ram;
public: public:
state_t(simdjson::dom::element serialised); state_t(simdjson::dom::element input);
[[nodiscard]] constexpr auto pc() const noexcept { return m_pc; } [[nodiscard]] auto pc() const noexcept { return (uint16_t)(int64_t)m_raw["pc"]; }
[[nodiscard]] constexpr auto s() const noexcept { return m_s; } [[nodiscard]] auto s() const noexcept { return (uint8_t)(int64_t)m_raw["s"]; }
[[nodiscard]] constexpr auto a() const noexcept { return m_a; } [[nodiscard]] auto a() const noexcept { return (uint8_t)(int64_t)m_raw["a"]; }
[[nodiscard]] constexpr auto x() const noexcept { return m_x; } [[nodiscard]] auto x() const noexcept { return (uint8_t)(int64_t)m_raw["x"]; }
[[nodiscard]] constexpr auto y() const noexcept { return m_y; } [[nodiscard]] auto y() const noexcept { return (uint8_t)(int64_t)m_raw["y"]; }
[[nodiscard]] constexpr auto p() const noexcept { return m_p; } [[nodiscard]] auto p() const noexcept { return (uint8_t)(int64_t)m_raw["p"]; }
[[nodiscard]] constexpr const auto& ram() const noexcept { return m_ram; } [[nodiscard]] const auto ram() const noexcept { return ram_t(m_raw["ram"].get_array()); }
}; };

View File

@ -1,9 +1,5 @@
#include "stdafx.h" #include "stdafx.h"
#include "test_t.h" #include "test_t.h"
#include <cassert>
test_t::test_t(const simdjson::dom::element serialised) test_t::test_t(const simdjson::dom::element input)
: m_name(serialised["name"]), : m_raw(input) {}
m_initial_state(serialised["initial"]),
m_final_state(serialised["final"]),
m_cycles(serialised["cycles"].get_array()) {}

View File

@ -9,16 +9,13 @@
class test_t final { class test_t final {
private: private:
std::string m_name; simdjson::dom::element m_raw;
state_t m_initial_state;
state_t m_final_state;
cycles_t m_cycles;
public: public:
test_t(simdjson::dom::element serialised); test_t(simdjson::dom::element input);
[[nodiscard]] constexpr const auto& name() const noexcept { return m_name; } [[nodiscard]] const auto name() const noexcept { return m_raw["name"]; }
[[nodiscard]] constexpr const auto& initial_state() const noexcept { return m_initial_state; } [[nodiscard]] const auto initial_state() const noexcept { return state_t(m_raw["initial"]); }
[[nodiscard]] constexpr const auto& final_state() const noexcept { return m_final_state; } [[nodiscard]] const auto final_state() const noexcept { return state_t(m_raw["final"]); }
[[nodiscard]] constexpr const auto& cycles() const noexcept { return m_cycles; } [[nodiscard]] const auto cycles() const noexcept { return cycles_t(m_raw["cycles"].get_array()); }
}; };