From ab7fcbee645a90cd99f774cac726ceb13a469b49 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Tue, 25 May 2021 23:06:15 +0100 Subject: [PATCH] Added experimental uni_type --- .../experimental/{uni_type.h => mem_type.h} | 62 +++++++++++++++---- test/vs2019/etl.vcxproj | 2 +- test/vs2019/etl.vcxproj.filters | 2 +- 3 files changed, 52 insertions(+), 14 deletions(-) rename include/etl/experimental/{uni_type.h => mem_type.h} (52%) diff --git a/include/etl/experimental/uni_type.h b/include/etl/experimental/mem_type.h similarity index 52% rename from include/etl/experimental/uni_type.h rename to include/etl/experimental/mem_type.h index 1aec8899..0b9532de 100644 --- a/include/etl/experimental/uni_type.h +++ b/include/etl/experimental/mem_type.h @@ -1,15 +1,17 @@ #pragma once template -class uni_type +class mem_type { public: static constexpr size_t Size = Size_; - //*********************************** - template - uni_type(const uni_type& other) + //*********************************** + template + mem_type(const mem_type= Other_Size, "Other size is too large"); + memcpy(buffer, other.buffer, Size_); } @@ -29,15 +31,17 @@ public: //*********************************** template - operator T() + operator T() const { return *reinterpret_cast(buffer); } //*********************************** - template - uni_type& operator =(const uni_type& rhs) + template + mem_type& operator =(const mem_type& rhs) { + ETL_STATIC_ASSERT(Size >= Other_Size, "RHS size is too large"); + memcpy(buffer, rhs.buffer, Size_); return *this; @@ -49,30 +53,46 @@ public: return Size; } + //*********************************** + constexpr char* data() const + { + return buffer; + } + private: char buffer[Size] }; template -class uni_type_ptr +class mem_type_ptr { public: static constexpr size_t Size = Size_; //*********************************** - uni_type_ptr() + mem_type_ptr() : pbuffer(ETL_NULLPTR) { } //*********************************** - uni_type_ptr(void* pbuffer_) - : pbuffer(reinterpret_cast(pbuffer)) + mem_type_ptr(char* pbuffer_) + : pbuffer(pbuffer_) { } + //*********************************** + template + mem_type_ptr(const mem_type_ptr= Other_Size, "Other size is too large"); + + memcpy(buffer, other.buffer, Size_); + } + //*********************************** template T& get() @@ -87,18 +107,36 @@ public: return *reinterpret_cast(pbuffer); } + //*********************************** template - operator T() + operator T() const { return *reinterpret_cast(pbuffer); } + //*********************************** + template + mem_type_ptr& operator =(const mem_type_ptr& rhs) + { + ETL_STATIC_ASSERT(Size >= Other_Size, "RHS size is too large"); + + memcpy(pbuffer, rhs.pbuffer, Size_); + + return *this; + } + //*********************************** constexpr size_t size() const { return Size; } + //*********************************** + constexpr char* data() const + { + return pbuffer; + } + private: char* pbuffer; diff --git a/test/vs2019/etl.vcxproj b/test/vs2019/etl.vcxproj index d6802bf2..592ece07 100644 --- a/test/vs2019/etl.vcxproj +++ b/test/vs2019/etl.vcxproj @@ -1309,7 +1309,7 @@ - + diff --git a/test/vs2019/etl.vcxproj.filters b/test/vs2019/etl.vcxproj.filters index 1efda090..6d6ac599 100644 --- a/test/vs2019/etl.vcxproj.filters +++ b/test/vs2019/etl.vcxproj.filters @@ -1110,7 +1110,7 @@ ETL\Private - + ETL\Experimental