From d475003215828d8b78b79e5062b64cb9bc7fb58d Mon Sep 17 00:00:00 2001 From: King_DuckZ Date: Fri, 20 Mar 2020 01:43:50 +0100 Subject: [PATCH] Add frame() method. --- subprojects/memcard/include/memcard/block.hpp | 3 +++ subprojects/memcard/src/block.cpp | 21 +++++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/subprojects/memcard/include/memcard/block.hpp b/subprojects/memcard/include/memcard/block.hpp index ec277cb..d4cf491 100644 --- a/subprojects/memcard/include/memcard/block.hpp +++ b/subprojects/memcard/include/memcard/block.hpp @@ -33,6 +33,9 @@ public: const data_type* begin() const { return m_begin; } const data_type* end() const { return m_begin + size(); } + data_type* frame(unsigned int idx); + const data_type* frame(unsigned int idx) const; + static constexpr std::size_t size() { return 8192; } const std::vector& palette() const { return m_icon_palette; } diff --git a/subprojects/memcard/src/block.cpp b/subprojects/memcard/src/block.cpp index cdcf7b5..5410a6c 100644 --- a/subprojects/memcard/src/block.cpp +++ b/subprojects/memcard/src/block.cpp @@ -85,27 +85,40 @@ BasicBlock::BasicBlock (data_type* beg) : template BasicBlock::~BasicBlock() = default; +template +auto BasicBlock::frame(unsigned int idx) -> data_type* { + return const_cast(const_cast*>(this)->frame(idx)); +} + +template +auto BasicBlock::frame(unsigned int idx) const -> const data_type* { + const constexpr unsigned int framesize = 128; + assert(idx * framesize + framesize <= this->size()); + return this->begin() + framesize * idx; +} + template bool BasicBlock::has_magic() const { const constexpr uint16_t magic = ('S' << 8) | 'C'; //0x5343 "SC" - return magic == static_cast((m_begin[0] << 8) | m_begin[1]); + const data_type* const ptr = frame(0); + return magic == static_cast((ptr[0] << 8) | ptr[1]); } template IconDisplayFlag BasicBlock::icon_display_flag() const { - const uint8_t val = m_begin[2]; + const uint8_t val = frame(0)[2]; return static_cast(val); } template int BasicBlock::block_count() const { - return m_begin[3]; + return frame(0)[3]; } template std::string BasicBlock::title() const { char mem[64 + 1]; - std::strncpy(mem, reinterpret_cast(m_begin + 4), sizeof(mem) / sizeof(mem[0])); + std::strncpy(mem, reinterpret_cast(frame(0) + 4), sizeof(mem) / sizeof(mem[0])); std::string_view temp(mem, std::strlen(mem)); auto name = full_to_halfwidth_ascii(shiftjis_to_utf8(temp));