From 6133e5e80132ef9f07ce2adc9192abacbac9addd Mon Sep 17 00:00:00 2001 From: Dominic Hoeglinger Date: Thu, 18 Sep 2025 05:23:38 +0200 Subject: [PATCH] Basic structure figured out --- main.cpp | 199 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 main.cpp diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..547623b --- /dev/null +++ b/main.cpp @@ -0,0 +1,199 @@ +#include +#include +#include +#include +#include +#include + + +class IFrame +{ +public: + using FieldKey = int; + + virtual bool read(const std::vector &data) = 0; + virtual bool write(std::vector &data) const = 0; + virtual bool set(const FieldKey key, int index, T value) = 0; + bool set(const FieldKey key, T value) +}; + +/* +class Codec +{ +public: + virtual bool encode() = 0 +};*/ + +class TextFrame : public IFrame +{ +public: + std::string text; + + TextFrame(const std::string &text) : text(text) {} + + virtual bool read(const std::vector &data) override { + text = std::string(data.begin(), data.end()); + return true; + } + virtual bool write(std::vector &data) const override { + data = std::vector(text.begin(), text.end()); + return true; + } +}; + +class ComplexFrame : public IFrame +{ + uint32_t from; + uint32_t to; + uint8_t flags; + std::vector data; +}; + +class BaseCodec +{ + +}; + +template +class Codec +{ +public: + using FrameType = T; + using DecodeSignal = Signal; + using EncodeSignal = Signal &data)>; + + DecodeSignal decoded; + EncodeSignal encoded; + + bool encode(const FrameType &input, std::vector &output) { + auto success = doEncode(input, output); + if (success) encoded.emit(output); + return success; + } + + bool decode(const std::vector &input, FrameType &output) { + auto success = doDecode(input, output); + if (success) decoded.emit(output); + return success; + } + + bool input(const std::vector &decodable) { + FrameType _; + return decode(decodable, _); + } + + bool output(const FrameType &encodable) { + std::vector _; + return encode(encodable, _); + } + +protected: + virtual bool doEncode(const FrameType &input, std::vector &output) = 0; + virtual bool doDecode(const std::vector &input, FrameType &output) = 0; +}; + +class MorseCodec : public Codec +{ +private: + static constexpr std::array ENCODE_LUT = []{ + std::array lut{}; + lut['A'] = ".-"; + lut['B'] = "-..."; + lut['C'] = "-.-."; + lut['D'] = "-.."; + lut['E'] = "."; + lut['F'] = "..-."; + lut['G'] = "--."; + lut['H'] = "...."; + lut['I'] = ".."; + lut['J'] = ".---"; + lut['K'] = "-.-"; + lut['L'] = ".-.."; + lut['M'] = "--"; + lut['N'] = "-."; + lut['O'] = "---"; + lut['P'] = ".--."; + lut['Q'] = "--.-"; + lut['R'] = ".-."; + lut['S'] = "..."; + lut['T'] = "-"; + lut['U'] = "..-"; + lut['V'] = "...-"; + lut['W'] = ".--"; + lut['X'] = "-..-"; + lut['Y'] = "-.--"; + lut['Z'] = "--.."; + lut['0'] = "-----"; + lut['1'] = ".----"; + lut['2'] = "..---"; + lut['3'] = "...--"; + lut['4'] = "....-"; + lut['5'] = "....."; + lut['6'] = "-...."; + lut['7'] = "--..."; + lut['8'] = "---.."; + lut['9'] = "----."; + return lut; + }(); +public: + bool encode(const IFrame &input, std::vector &data) { + bool succ = true; + std::vector bytes; + data.clear(); + input.write(bytes); + for (const auto b : bytes) { + auto i = static_cast(b); + auto morse = ENCODE_LUT[std::toupper(i)]; + if (morse) { + for (const auto c : std::string(morse)) { + data.push_back(static_cast(c)); + } + data.push_back(' '); + } else { + succ = false; + } + } + return succ; + } + + bool decode(const std::vector &data, std::shared_ptr