#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