#pragma once // Copyright (c) 2018-2019 David Burkett // Distributed under the MIT software license, see the accompanying // file LICENSE or http://www.opensource.org/licenses/mit-license.php. #include #include class Signature : public Traits::IPrintable, public Traits::ISerializable { public: using UPtr = std::unique_ptr; enum { SIZE = 64 }; // // Constructors // Signature() = default; Signature(const uint8_t* data) : m_bytes(data) { } Signature(BigInt&& bytes) : m_bytes(std::move(bytes)) { } Signature(const BigInt& bytes) : m_bytes(bytes) { } Signature(const Signature& other) = default; Signature(Signature&& other) noexcept = default; // // Destructor // virtual ~Signature() = default; // // Operators // Signature& operator=(const Signature& other) = default; Signature& operator=(Signature&& other) noexcept = default; bool operator<(const Signature& rhs) const { return m_bytes < rhs.GetBigInt(); } bool operator!=(const Signature& rhs) const { return m_bytes != rhs.GetBigInt(); } bool operator==(const Signature& rhs) const { return m_bytes == rhs.GetBigInt(); } // // Getters // const BigInt& GetBigInt() const { return m_bytes; } const std::vector& vec() const { return m_bytes.vec(); } const uint8_t* data() const { return m_bytes.data(); } uint8_t* data() { return m_bytes.data(); } // // Serialization/Deserialization // IMPL_SERIALIZABLE(Signature, obj) { READWRITE(obj.m_bytes); } std::string ToHex() const { return m_bytes.ToHex(); } static Signature FromHex(const std::string& hex) { return Signature(BigInt::FromHex(hex)); } // // Traits // std::string Format() const final { return m_bytes.Format(); } private: // The 64 byte Signature. BigInt m_bytes; }; class CompactSignature : public Signature { public: using UPtr = std::unique_ptr; CompactSignature() = default; CompactSignature(BigInt&& bytes) : Signature(std::move(bytes)) { } virtual ~CompactSignature() = default; };