Allow iterating over a block's frames.
Yeah, the PartIterator thing seems to have worked.
This commit is contained in:
parent
db70dead33
commit
a190a76b5d
5 changed files with 55 additions and 3 deletions
|
@ -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; }
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
12
subprojects/memcard/include/memcard/frame_iterator.hpp
Normal file
12
subprojects/memcard/include/memcard/frame_iterator.hpp
Normal 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
|
|
@ -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:
|
||||
|
|
|
@ -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());
|
||||
|
|
Loading…
Add table
Reference in a new issue