From 74bb9cd27242b9320f99ff4d2b50c3051576cc14 Mon Sep 17 00:00:00 2001 From: crupest Date: Tue, 8 Feb 2022 16:53:51 +0800 Subject: ... --- include/cru/ui/mapper/Mapper.h | 92 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 include/cru/ui/mapper/Mapper.h (limited to 'include/cru/ui/mapper/Mapper.h') diff --git a/include/cru/ui/mapper/Mapper.h b/include/cru/ui/mapper/Mapper.h new file mode 100644 index 00000000..fa7f8cef --- /dev/null +++ b/include/cru/ui/mapper/Mapper.h @@ -0,0 +1,92 @@ +#pragma once +#include "../Base.h" + +#include "cru/common/ClonablePtr.h" +#include "cru/common/Exception.h" +#include "cru/xml/XmlNode.h" + +#include +#include +#include +#include + +namespace cru::ui::mapper { +template +class BasicMapper; + +class CRU_UI_API MapperBase : public Object { + public: + explicit MapperBase(std::type_index type_index); + + CRU_DELETE_COPY(MapperBase) + CRU_DELETE_MOVE(MapperBase) + + ~MapperBase() override = default; + + public: + std::type_index GetTypeIndex() const { return type_index_; } + + template + BasicMapper* StaticCast() { + return static_cast*>(this); + } + + template + BasicMapper* DynamicCast() { + return dynamic_cast*>(this); + } + + virtual bool SupportMapFromString() { return false; } + virtual bool SupportMapFromXml() { return false; } + virtual bool XmlElementIsOfThisType(xml::XmlElementNode* node) { + return false; + } + + private: + std::type_index type_index_; +}; + +template +class CRU_UI_API BasicMapper : public MapperBase { + public: + static_assert(std::is_default_constructible_v, + "T must be default constructible."); + + BasicMapper() : MapperBase(typeid(T)) {} + + CRU_DELETE_COPY(BasicMapper) + CRU_DELETE_MOVE(BasicMapper) + + ~BasicMapper() override = default; + + virtual T MapFromString(String str) { + if (!SupportMapFromString()) { + throw Exception(u"This mapper does not support map from string."); + } + + return DoMapFromString(str); + } + + T MapFromXml(xml::XmlElementNode* node) { + if (!SupportMapFromXml()) { + throw Exception(u"This mapper does not support map from xml."); + } + + if (!XmlElementIsOfThisType(node)) { + throw Exception(u"This xml element is not of mapping type."); + } + + return DoMapFromXml(node); + } + + protected: + virtual T DoMapFromString(String str) { return {}; } + virtual T DoMapFromXml(xml::XmlElementNode* node) { return {}; } +}; + +template +using BasicRefMapper = BasicMapper>; + +template +using BasicPtrMapper = BasicMapper>; +} // namespace cru::ui::mapper -- cgit v1.2.3