diff --git a/cpp/Platform.Memory/ArrayMemory.h b/cpp/Platform.Memory/ArrayMemory.h index cb0e670..63a7dec 100644 --- a/cpp/Platform.Memory/ArrayMemory.h +++ b/cpp/Platform.Memory/ArrayMemory.h @@ -1,7 +1,7 @@ namespace Platform::Memory { template class ArrayMemory; - template class ArrayMemory : public IArrayMemory + template class ArrayMemory : public Polymorph, IArrayMemory> { private: std::vector _array{}; diff --git a/cpp/Platform.Memory/DirectMemoryAsArrayMemoryAdapter.h b/cpp/Platform.Memory/DirectMemoryAsArrayMemoryAdapter.h index 0c0a944..2255676 100644 --- a/cpp/Platform.Memory/DirectMemoryAsArrayMemoryAdapter.h +++ b/cpp/Platform.Memory/DirectMemoryAsArrayMemoryAdapter.h @@ -2,7 +2,7 @@ { template class DirectMemoryAsArrayMemoryAdapter; template class DirectMemoryAsArrayMemoryAdapter : - public IArrayMemory, public IDirectMemory + public Polymorph, IArrayMemory, IDirectMemory> { using Self = DirectMemoryAsArrayMemoryAdapter; using IDirectMemory::pointer_t; @@ -14,12 +14,12 @@ return _memory.Size(); } - public: pointer_t& Pointer() + public: IDirectMemory::pointer_t& Pointer() { return _memory.Pointer(); } - public: const pointer_t& Pointer() const + public: const IDirectMemory::pointer_t& Pointer() const { return _memory.Pointer(); } diff --git a/cpp/Platform.Memory/FileArrayMemory.h b/cpp/Platform.Memory/FileArrayMemory.h index 3661616..c7bb299 100644 --- a/cpp/Platform.Memory/FileArrayMemory.h +++ b/cpp/Platform.Memory/FileArrayMemory.h @@ -10,7 +10,7 @@ }; template class FileArrayMemory; - template class FileArrayMemory final : public IArrayMemory + template class FileArrayMemory final : public Polymorph, IArrayMemory> //where TElement : struct { using Self = FileArrayMemory; diff --git a/cpp/Platform.Memory/FileMappedResizableDirectMemory.h b/cpp/Platform.Memory/FileMappedResizableDirectMemory.h index efcd89c..99150dc 100644 --- a/cpp/Platform.Memory/FileMappedResizableDirectMemory.h +++ b/cpp/Platform.Memory/FileMappedResizableDirectMemory.h @@ -1,6 +1,6 @@ namespace Platform::Memory { - class FileMappedResizableDirectMemory final : public ResizableDirectMemoryBase + class FileMappedResizableDirectMemory final : public Polymorph { using base = ResizableDirectMemoryBase; protected: using base::capacity_t; diff --git a/cpp/Platform.Memory/HeapResizableDirectMemory.h b/cpp/Platform.Memory/HeapResizableDirectMemory.h index f94ce24..b17f9bc 100644 --- a/cpp/Platform.Memory/HeapResizableDirectMemory.h +++ b/cpp/Platform.Memory/HeapResizableDirectMemory.h @@ -20,7 +20,7 @@ } } - class HeapResizableDirectMemory final : public ResizableDirectMemoryBase + class HeapResizableDirectMemory final : public Polymorph { using ResizableDirectMemoryBase::capacity_t; //protected: override std::string ObjectName diff --git a/cpp/Platform.Memory/Platform.Memory.h b/cpp/Platform.Memory/Platform.Memory.h index f91f188..15b1ef4 100644 --- a/cpp/Platform.Memory/Platform.Memory.h +++ b/cpp/Platform.Memory/Platform.Memory.h @@ -15,6 +15,7 @@ #include "memory_mapped_file.hpp" #include "memory_mapped_file.cpp" +#include "Polymorph.h" #include "IMemory.h" #include "IDirectMemory.h" #include "IArrayMemory.h" diff --git a/cpp/Platform.Memory/Polymorph.h b/cpp/Platform.Memory/Polymorph.h new file mode 100644 index 0000000..346755d --- /dev/null +++ b/cpp/Platform.Memory/Polymorph.h @@ -0,0 +1,18 @@ +namespace Platform::Memory +{ + template + class Polymorph : public TBase... + { + public: + // Optional static polymorphism - allows getting the derived type + TSelf& self() { return static_cast(*this); } + const TSelf& self() const { return static_cast(*this); } + + // Enable perfect forwarding to derived class methods + template + T& as() { return static_cast(*this); } + + template + const T& as() const { return static_cast(*this); } + }; +} \ No newline at end of file diff --git a/cpp/Platform.Memory/ResizableDirectMemoryBase.h b/cpp/Platform.Memory/ResizableDirectMemoryBase.h index 1e24ea2..c755f57 100644 --- a/cpp/Platform.Memory/ResizableDirectMemoryBase.h +++ b/cpp/Platform.Memory/ResizableDirectMemoryBase.h @@ -1,4 +1,6 @@ -namespace Platform::Memory +#include + +namespace Platform::Memory { namespace Internal { diff --git a/cpp/Platform.Memory/TemporaryFileMappedResizableDirectMemory.h b/cpp/Platform.Memory/TemporaryFileMappedResizableDirectMemory.h index 0587385..02739ab 100644 --- a/cpp/Platform.Memory/TemporaryFileMappedResizableDirectMemory.h +++ b/cpp/Platform.Memory/TemporaryFileMappedResizableDirectMemory.h @@ -1,6 +1,6 @@ namespace Platform::Memory { - class TemporaryFileMappedResizableDirectMemory final : public ResizableDirectMemoryBase + class TemporaryFileMappedResizableDirectMemory final : public Polymorph { using base_t = FileMappedResizableDirectMemory; base_t base;