From 905e6be0c409bec443785d747add6c5b0ec52612 Mon Sep 17 00:00:00 2001 From: King_DuckZ Date: Fri, 20 Mar 2020 14:54:05 +0100 Subject: [PATCH] Add proper typedefs and restore block number printing in CLI. --- src/cli/memcard.cpp | 2 +- subprojects/memcard/include/memcard/block.hpp | 5 ++++- .../include/memcard/block_iterator.hpp | 8 +++++-- subprojects/memcard/src/block.cpp | 3 ++- subprojects/memcard/src/block_iterator.cpp | 22 +++++++++++++------ subprojects/memcard/src/memorycard.cpp | 12 ++++++---- 6 files changed, 36 insertions(+), 16 deletions(-) diff --git a/src/cli/memcard.cpp b/src/cli/memcard.cpp index 06fd00b..939d702 100644 --- a/src/cli/memcard.cpp +++ b/src/cli/memcard.cpp @@ -19,7 +19,7 @@ void print_blocks (const std::string& mc_path) { for (const auto& blk : mc) { if (blk.has_magic()) { - std::cout << "Block " << std::setfill(' ') << std::setw(2) << 0 + 1 + std::cout << "Block " << std::setfill(' ') << std::setw(2) << blk.index() + 1 << ": \"" << blk.title() << '"'; if (blk.block_count() > 1) { std::cout << " [" << blk.block_count() << ']'; diff --git a/subprojects/memcard/include/memcard/block.hpp b/subprojects/memcard/include/memcard/block.hpp index 751bd9d..61e4256 100644 --- a/subprojects/memcard/include/memcard/block.hpp +++ b/subprojects/memcard/include/memcard/block.hpp @@ -24,8 +24,9 @@ public: using data_type = typename std::conditional::type; static const constexpr unsigned int FrameSize = 128; + static const constexpr std::size_t ToCBlockIndex = 0xff; - explicit BasicBlock (data_type* beg); + BasicBlock (data_type* beg, std::size_t index); ~BasicBlock(); data_type* begin() { return m_begin; } @@ -44,10 +45,12 @@ public: bool has_magic() const; IconDisplayFlag icon_display_flag() const; int block_count() const; + std::size_t index() const { return m_index; } std::string title() const; private: std::vector m_icon_palette; + std::size_t m_index; data_type* m_begin; }; diff --git a/subprojects/memcard/include/memcard/block_iterator.hpp b/subprojects/memcard/include/memcard/block_iterator.hpp index cf31cf8..f479837 100644 --- a/subprojects/memcard/include/memcard/block_iterator.hpp +++ b/subprojects/memcard/include/memcard/block_iterator.hpp @@ -15,6 +15,9 @@ public: typedef std::random_access_iterator_tag iterator_category; typedef std::size_t size_type; typedef std::ptrdiff_t difference_type; + typedef BasicBlock value_type; + typedef BasicBlock reference; + typedef BasicBlock pointer; BlockIterator (MemoryCardPtr mc, size_type index); BlockIterator (const BlockIterator&) = default; @@ -28,8 +31,7 @@ public: template bool operator< (const BlockIterator& other) const; - BasicBlock operator*(); - BasicBlock operator*() const; + reference operator*(); BlockIterator& operator++(); BlockIterator operator++(int); @@ -37,6 +39,8 @@ public: BlockIterator operator--(int); template difference_type operator- (const BlockIterator& other); + BlockIterator operator+ (std::ptrdiff_t other) const; + BlockIterator operator- (std::ptrdiff_t other) const; private: MemoryCardPtr m_mc; diff --git a/subprojects/memcard/src/block.cpp b/subprojects/memcard/src/block.cpp index 4d376d6..c908c68 100644 --- a/subprojects/memcard/src/block.cpp +++ b/subprojects/memcard/src/block.cpp @@ -66,8 +66,9 @@ namespace { } //unnamed namespace template -BasicBlock::BasicBlock (data_type* beg) : +BasicBlock::BasicBlock (data_type* beg, std::size_t index) : m_icon_palette(extract_palette(beg, beg + size())), + m_index(index), m_begin(beg) { assert(m_begin); diff --git a/subprojects/memcard/src/block_iterator.cpp b/subprojects/memcard/src/block_iterator.cpp index 726e43c..1a0fcfd 100644 --- a/subprojects/memcard/src/block_iterator.cpp +++ b/subprojects/memcard/src/block_iterator.cpp @@ -39,17 +39,11 @@ bool BlockIterator::operator< (const BlockIterator& other) const } template -BasicBlock BlockIterator::operator*() { +auto BlockIterator::operator*() -> reference { assert(m_mc); return (*m_mc)[m_index]; } -template -BasicBlock BlockIterator::operator*() const { - assert(m_mc); - return const_cast(*m_mc)[m_index]; -} - template BlockIterator& BlockIterator::operator++() { ++m_index; @@ -82,6 +76,20 @@ auto BlockIterator::operator- (const BlockIterator& other) -> dif return this->m_index - other.m_index; } +template +BlockIterator BlockIterator::operator+ (std::ptrdiff_t other) const { + auto retval = *this; + retval.m_index += other; + return retval; +} + +template +BlockIterator BlockIterator::operator- (std::ptrdiff_t other) const { + auto retval = *this; + retval.m_index -= other; + return retval; +} + template class BlockIterator; template class BlockIterator; template bool BlockIterator::operator==(const BlockIterator&) const; diff --git a/subprojects/memcard/src/memorycard.cpp b/subprojects/memcard/src/memorycard.cpp index 0059da4..54af80b 100644 --- a/subprojects/memcard/src/memorycard.cpp +++ b/subprojects/memcard/src/memorycard.cpp @@ -17,20 +17,24 @@ MemoryCard::~MemoryCard() = default; Block MemoryCard::operator[] (std::size_t index) { assert(index < 15); - return Block(m_data.data() + (index + 1) * Block::size()); + return Block(m_data.data() + (index + 1) * Block::size(), index); } ConstBlock MemoryCard::operator[] (std::size_t index) const { assert(index < 15); - return ConstBlock(m_data.data() + (index + 1) * Block::size()); + return ConstBlock(m_data.data() + (index + 1) * Block::size(), index); } ContentInfo MemoryCard::content_info() const { - return {ConstBlock(m_data.data())}; + return {ConstBlock(m_data.data(), ConstBlock::ToCBlockIndex)}; } std::size_t MemoryCard::size() const { - return 15; + return std::count_if( + const_iterator(this, 0), + const_iterator(this, 15), + [](const auto& blk) {return blk.has_magic();} + ); } auto MemoryCard::begin() -> iterator {