From 05b34b4818533ea8be3840f56bdd52cabfec42fa Mon Sep 17 00:00:00 2001 From: King_DuckZ Date: Sat, 21 Mar 2020 16:49:34 +0100 Subject: [PATCH] Support non-const to const conversions. --- subprojects/memcard/include/memcard/block.hpp | 11 +++++++++++ subprojects/memcard/include/memcard/frame.hpp | 16 +++++++++++++++- subprojects/memcard/src/frame.cpp | 9 +++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/subprojects/memcard/include/memcard/block.hpp b/subprojects/memcard/include/memcard/block.hpp index 36c9329..aa9f205 100644 --- a/subprojects/memcard/include/memcard/block.hpp +++ b/subprojects/memcard/include/memcard/block.hpp @@ -39,6 +39,7 @@ enum class IconDisplayFlag { template class BasicBlock { + friend class BasicBlock; public: using data_type = typename std::conditional::type; typedef FrameIterator iterator; @@ -49,6 +50,8 @@ public: BasicBlock (data_type* blk, std::size_t index); BasicBlock (data_type* blk, BasicFrame toc_entry, std::size_t index); + template BasicBlock (const BasicBlock& other); + BasicBlock(BasicBlock&&) = default; ~BasicBlock(); iterator begin(); @@ -107,6 +110,14 @@ inline int32_t calc_icon_count (IconDisplayFlag idf) { } } +template +template +inline BasicBlock::BasicBlock (const BasicBlock& other) { + m_index = other.m_index; + m_toc_entry = other.m_toc_entry; + m_begin = other.m_begin; +} + using Block = BasicBlock; using ConstBlock = BasicBlock; } //namespace mc::psx diff --git a/subprojects/memcard/include/memcard/frame.hpp b/subprojects/memcard/include/memcard/frame.hpp index b3d1f26..4244a26 100644 --- a/subprojects/memcard/include/memcard/frame.hpp +++ b/subprojects/memcard/include/memcard/frame.hpp @@ -25,13 +25,16 @@ namespace mc::psx { template class BasicFrame { + friend class BasicFrame; using data_type = typename std::conditional::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&) = default; BasicFrame (BasicFrame&&) = default; + template BasicFrame (const BasicFrame& 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& operator= (BasicFrame&&) = default; + BasicFrame& operator= (const BasicFrame&) = default; + template BasicFrame& operator= (const BasicFrame& other); static constexpr std::size_t size() { return Size; } @@ -68,6 +75,13 @@ inline T read_as (const BasicFrame& frame, std::size_t offset) { return retval; } +template +template +inline BasicFrame::BasicFrame (const BasicFrame& other) { + m_index = other.m_index; + m_data = other.m_data; +} + using Frame = BasicFrame; using ConstFrame = BasicFrame; } //namespace mc::psx diff --git a/subprojects/memcard/src/frame.cpp b/subprojects/memcard/src/frame.cpp index 6d80a10..1323c4d 100644 --- a/subprojects/memcard/src/frame.cpp +++ b/subprojects/memcard/src/frame.cpp @@ -38,6 +38,15 @@ auto BasicFrame::operator[] (std::size_t index) const -> const data_type& return m_data[index]; } +template +template +BasicFrame& BasicFrame::operator= (const BasicFrame& other) { + m_index = other.m_index; + m_data = other.m_data; + return *this; +} + template class BasicFrame; template class BasicFrame; +template BasicFrame& BasicFrame::operator=(const BasicFrame&); } //namespace mc::psx