Support non-const to const conversions.

This commit is contained in:
King_DuckZ 2020-03-21 16:49:34 +01:00
parent 2be3823442
commit 05b34b4818
3 changed files with 35 additions and 1 deletions

View file

@ -39,6 +39,7 @@ enum class IconDisplayFlag {
template <bool Const>
class BasicBlock {
friend class BasicBlock<true>;
public:
using data_type = typename std::conditional<Const, const uint8_t, uint8_t>::type;
typedef FrameIterator<Const, Const> iterator;
@ -49,6 +50,8 @@ public:
BasicBlock (data_type* blk, std::size_t index);
BasicBlock (data_type* blk, BasicFrame<Const> toc_entry, std::size_t index);
template <bool Const2> BasicBlock (const BasicBlock<Const2>& other);
BasicBlock(BasicBlock&&) = default;
~BasicBlock();
iterator begin();
@ -107,6 +110,14 @@ inline int32_t calc_icon_count (IconDisplayFlag idf) {
}
}
template <bool Const>
template <bool Const2>
inline BasicBlock<Const>::BasicBlock (const BasicBlock<Const2>& other) {
m_index = other.m_index;
m_toc_entry = other.m_toc_entry;
m_begin = other.m_begin;
}
using Block = BasicBlock<false>;
using ConstBlock = BasicBlock<true>;
} //namespace mc::psx

View file

@ -25,13 +25,16 @@
namespace mc::psx {
template <bool Const>
class BasicFrame {
friend class BasicFrame<true>;
using data_type = typename std::conditional<Const, const uint8_t, uint8_t>::type;
public:
static const constexpr unsigned int Size = 128;
BasicFrame() = default;
BasicFrame (data_type* data, std::size_t index);
BasicFrame (const BasicFrame&) = default;
BasicFrame (const BasicFrame<Const>&) = default;
BasicFrame (BasicFrame&&) = default;
template <bool Const2> BasicFrame (const BasicFrame<Const2>& other);
data_type* begin() { return m_data; }
data_type* end() { return m_data + size(); }
@ -39,8 +42,12 @@ public:
const data_type* cend() const { return m_data + size(); }
const data_type* begin() const { return m_data; }
const data_type* end() const { return m_data + size(); }
data_type& operator[] (std::size_t index);
const data_type& operator[] (std::size_t index) const;
BasicFrame<Const>& operator= (BasicFrame<Const>&&) = default;
BasicFrame<Const>& operator= (const BasicFrame<Const>&) = default;
template <bool Const2> BasicFrame<Const>& operator= (const BasicFrame<Const2>& other);
static constexpr std::size_t size() { return Size; }
@ -68,6 +75,13 @@ inline T read_as (const BasicFrame<Const>& frame, std::size_t offset) {
return retval;
}
template <bool Const>
template <bool Const2>
inline BasicFrame<Const>::BasicFrame (const BasicFrame<Const2>& other) {
m_index = other.m_index;
m_data = other.m_data;
}
using Frame = BasicFrame<false>;
using ConstFrame = BasicFrame<true>;
} //namespace mc::psx

View file

@ -38,6 +38,15 @@ auto BasicFrame<Const>::operator[] (std::size_t index) const -> const data_type&
return m_data[index];
}
template <bool Const>
template <bool Const2>
BasicFrame<Const>& BasicFrame<Const>::operator= (const BasicFrame<Const2>& other) {
m_index = other.m_index;
m_data = other.m_data;
return *this;
}
template class BasicFrame<true>;
template class BasicFrame<false>;
template BasicFrame<true>& BasicFrame<true>::operator=(const BasicFrame<false>&);
} //namespace mc::psx