Allow iterating over a block's frames.

Yeah, the PartIterator thing seems to have worked.
This commit is contained in:
King_DuckZ 2020-03-20 16:44:48 +01:00
parent db70dead33
commit a190a76b5d
5 changed files with 55 additions and 3 deletions

View file

@ -1,13 +1,12 @@
#pragma once
#include "memcard/frame.hpp"
#include "memcard/frame_iterator.hpp"
#include <cstdint>
#include <type_traits>
#include <vector>
#include <string>
//see: https://www.psdevwiki.com/ps3/PS1_Savedata#Memory_Card_Formats_PS1
namespace mc::psx {
enum class IconDisplayFlag {
NoIcon = 0x00,
@ -23,6 +22,8 @@ template <bool Const>
class BasicBlock {
using data_type = typename std::conditional<Const, const uint8_t, uint8_t>::type;
public:
typedef FrameIterator<Const, Const> iterator;
typedef FrameIterator<true, Const> const_iterator;
static const constexpr std::size_t FrameCount = 64;
static const constexpr std::size_t TOCBlockIndex = 0;
@ -30,6 +31,13 @@ public:
BasicBlock (data_type* beg, std::size_t index);
~BasicBlock();
iterator begin();
iterator end();
const_iterator cbegin() const;
const_iterator begin() const;
const_iterator cend() const;
const_iterator end() const;
data_type* data() { return m_begin; }
const data_type* data() const { return m_begin; }

View file

@ -15,7 +15,7 @@ enum class BlockContent : uint8_t {
};
struct ContentInfo {
ContentInfo (const ConstFrame& block);
ContentInfo (const ConstFrame& frame);
uint32_t use_byte;
uint16_t magic;

View file

@ -0,0 +1,12 @@
#pragma once
#include "memcard/part_iterator.hpp"
#include "memcard/frame.hpp"
namespace mc::psx {
template <bool Const>
class BasicBlock;
template <bool Const, bool ConstProvider>
using FrameIterator = PartIterator<Const, BasicBlock<ConstProvider>, BasicFrame>;
} //namespace mc::psx

View file

@ -9,6 +9,8 @@
#include <cstddef>
#include <algorithm>
//see: https://www.psdevwiki.com/ps3/PS1_Savedata#Memory_Card_Formats_PS1
namespace mc::psx {
class MemoryCard {
public:

View file

@ -87,6 +87,36 @@ BasicBlock<Const>::BasicBlock (data_type* beg, std::size_t index) :
template <bool Const>
BasicBlock<Const>::~BasicBlock() = default;
template <bool Const>
auto BasicBlock<Const>::begin() -> iterator {
return iterator{this, 0};
}
template <bool Const>
auto BasicBlock<Const>::end() -> iterator {
return iterator{this, size()};
}
template <bool Const>
auto BasicBlock<Const>::cbegin() const -> const_iterator {
return const_iterator{this, size()};
}
template <bool Const>
auto BasicBlock<Const>::begin() const -> const_iterator {
return const_iterator{this, size()};
}
template <bool Const>
auto BasicBlock<Const>::cend() const -> const_iterator {
return const_iterator{this, size()};
}
template <bool Const>
auto BasicBlock<Const>::end() const -> const_iterator {
return const_iterator{this, size()};
}
template <bool Const>
BasicFrame<Const> BasicBlock<Const>::frame(unsigned int idx) {
assert(idx < size());