diff options
author | crupest <crupest@outlook.com> | 2022-01-19 23:14:21 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2022-01-19 23:14:21 +0800 |
commit | 31422f87f729bd35bcebfb277d08b230424e3618 (patch) | |
tree | f4479c6da9dcc64a9a39e165ed0459efff051eb3 | |
parent | 2028bc4914638360fb756079dbddbdbe52676821 (diff) | |
download | cru-31422f87f729bd35bcebfb277d08b230424e3618.tar.gz cru-31422f87f729bd35bcebfb277d08b230424e3618.tar.bz2 cru-31422f87f729bd35bcebfb277d08b230424e3618.zip |
...
-rw-r--r-- | include/cru/common/String.hpp | 2 | ||||
-rw-r--r-- | include/cru/ui/mapper/ThicknessMapper.hpp | 2 | ||||
-rw-r--r-- | include/cru/xml/XmlNode.hpp | 8 | ||||
-rw-r--r-- | src/common/String.cpp | 29 | ||||
-rw-r--r-- | src/ui/mapper/ThicknessMapper.cpp | 25 |
5 files changed, 62 insertions, 4 deletions
diff --git a/include/cru/common/String.hpp b/include/cru/common/String.hpp index e7688555..dac81e8d 100644 --- a/include/cru/common/String.hpp +++ b/include/cru/common/String.hpp @@ -233,6 +233,8 @@ class CRU_BASE_API String { float ParseToFloat(Index* processed_characters_count = nullptr) const; double ParseToDouble(Index* processed_characters_count = nullptr) const; + std::vector<float> ParseToFloatList(value_type separator = u' '); + std::vector<double> ParseToDoubleList(value_type separator = u' '); private: static char16_t kEmptyBuffer[1]; diff --git a/include/cru/ui/mapper/ThicknessMapper.hpp b/include/cru/ui/mapper/ThicknessMapper.hpp index 90d1ef46..68bbcf49 100644 --- a/include/cru/ui/mapper/ThicknessMapper.hpp +++ b/include/cru/ui/mapper/ThicknessMapper.hpp @@ -6,7 +6,7 @@ #include "cru/xml/XmlNode.hpp" namespace cru::ui::mapper { -class ThicknessMapper : public BasicMapper<Thickness> { +class CRU_UI_API ThicknessMapper : public BasicMapper<Thickness> { public: CRU_DEFAULT_CONSTRUCTOR_DESTRUCTOR(ThicknessMapper) diff --git a/include/cru/xml/XmlNode.hpp b/include/cru/xml/XmlNode.hpp index 38f09d14..0972037a 100644 --- a/include/cru/xml/XmlNode.hpp +++ b/include/cru/xml/XmlNode.hpp @@ -90,6 +90,14 @@ class CRU_XML_API XmlElementNode : public XmlNode { Index GetChildCount() const { return children_.size(); } String GetAttribute(const String& key) const { return attributes_.at(key); } + std::optional<String> GetOptionalAttribute(const String& key) const { + auto it = attributes_.find(key); + if (it == attributes_.end()) { + return std::nullopt; + } + + return it->second; + } XmlNode* GetChildAt(Index index) const { return children_[index]; } void AddAttribute(String key, String value); diff --git a/src/common/String.cpp b/src/common/String.cpp index 48705d3b..3721eed3 100644 --- a/src/common/String.cpp +++ b/src/common/String.cpp @@ -13,8 +13,7 @@ namespace cru { double_conversion::StringToDoubleConverter String::kDefaultStringToDoubleConverter( - double_conversion::StringToDoubleConverter::ALLOW_TRAILING_JUNK | - double_conversion::StringToDoubleConverter::ALLOW_LEADING_SPACES | + double_conversion::StringToDoubleConverter::ALLOW_LEADING_SPACES | double_conversion::StringToDoubleConverter::ALLOW_TRAILING_SPACES | double_conversion::StringToDoubleConverter:: ALLOW_CASE_INSENSIBILITY, @@ -454,6 +453,32 @@ double String::ParseToDouble(Index* processed_characters_count) const { return result; } +std::vector<float> String::ParseToFloatList(value_type separator) { + std::vector<float> result; + auto list = Split(separator); + for (auto& item : list) { + auto value = ParseToFloat(); + if (std::isnan(value)) { + throw Exception(u"Invalid double value."); + } + result.push_back(value); + } + return result; +} + +std::vector<double> String::ParseToDoubleList(value_type separator) { + std::vector<double> result; + auto list = Split(separator); + for (auto& item : list) { + auto value = ParseToDouble(); + if (std::isnan(value)) { + throw Exception(u"Invalid double value."); + } + result.push_back(value); + } + return result; +} + StringView StringView::substr(Index pos) { Expects(pos >= 0 && pos < size_); return StringView(ptr_ + pos, size_ - pos); diff --git a/src/ui/mapper/ThicknessMapper.cpp b/src/ui/mapper/ThicknessMapper.cpp index 684d0a4b..11f0be0d 100644 --- a/src/ui/mapper/ThicknessMapper.cpp +++ b/src/ui/mapper/ThicknessMapper.cpp @@ -2,10 +2,33 @@ #include "cru/xml/XmlNode.hpp" namespace cru::ui::mapper { -bool ThicknessMapper::XmlElementIsOfThisType(xml::XmlElementNode *node) { +bool ThicknessMapper::XmlElementIsOfThisType(xml::XmlElementNode* node) { if (node->GetTag() == u"Thickness") { return true; } return false; } + +std::unique_ptr<Thickness> ThicknessMapper::DoMapFromString(String str) { + std::vector<float> values = str.ParseToFloatList(); + if (values.size() == 4) { + return std::make_unique<Thickness>(values[0], values[1], values[2], + values[3]); + } else if (values.size() == 2) { + return std::make_unique<Thickness>(values[0], values[1], values[0], + values[1]); + } else if (values.size() == 1) { + return std::make_unique<Thickness>(values[0], values[0], values[0], + values[0]); + } else { + throw Exception(u"Invalid Thickness string."); + } +} + +std::unique_ptr<Thickness> ThicknessMapper::DoMapFromXml( + xml::XmlElementNode* node) { + auto value_attr = node->GetOptionalAttribute(u"value"); + if (!value_attr) return std::make_unique<Thickness>(); + return DoMapFromString(*value_attr); +} } // namespace cru::ui::mapper |