From 1a6236c184d7ffe3551d417b656aee31b15d1948 Mon Sep 17 00:00:00 2001 From: Andreas Stöckel Date: Sun, 25 Jan 2015 18:55:19 +0100 Subject: Added functions for dealing with ResourceTypes --- src/core/resource/Resource.cpp | 54 ++++++++++++++++++++++++++++++++++++++++++ src/core/resource/Resource.hpp | 28 ++++++++++++++++++++++ 2 files changed, 82 insertions(+) (limited to 'src') diff --git a/src/core/resource/Resource.cpp b/src/core/resource/Resource.cpp index 349c82a..ff3c77f 100644 --- a/src/core/resource/Resource.cpp +++ b/src/core/resource/Resource.cpp @@ -16,11 +16,39 @@ along with this program. If not, see . */ +#include + #include "Resource.hpp" #include "ResourceLocator.hpp" namespace ousia { +/* Helper functions for the internal maps */ + +static std::unordered_map reverseMap( + const std::unordered_map &m) +{ + std::unordered_map res; + for (auto e : m) { + res.emplace(e.second, e.first); + } + return res; +} + +/* Internal maps */ + +static const std::unordered_map + NAME_RESOURCE_TYPE_MAP{{"document", ResourceType::DOCUMENT}, + {"domain", ResourceType::DOMAIN_DESC}, + {"typesystem", ResourceType::TYPESYSTEM}, + {"attributes", ResourceType::ATTRIBUTES}, + {"stylesheet", ResourceType::STYLESHEET}, + {"script", ResourceType::SCRIPT}, + {"data", ResourceType::DATA}}; + +static const std::unordered_map + RESOURCE_TYPE_NAME_MAP = reverseMap(NAME_RESOURCE_TYPE_MAP); + /* Class Resource */ Resource::Resource() @@ -39,6 +67,32 @@ std::unique_ptr Resource::stream() const return locator->stream(location); } +std::string Resource::getResourceTypeName(ResourceType resourceType) +{ + auto it = RESOURCE_TYPE_NAME_MAP.find(resourceType); + if (it != RESOURCE_TYPE_NAME_MAP.end()) { + return it->second; + } + return "unknown"; +} + +ResourceType Resource::getResourceTypeByName(const std::string &name) +{ + std::string normName = Utils::toLower(name); + auto it = NAME_RESOURCE_TYPE_MAP.find(normName); + if (it != NAME_RESOURCE_TYPE_MAP.end()) { + return it->second; + } + return ResourceType::UNKNOWN; +} + +/* Operators */ + +std::ostream &operator<<(std::ostream &os, ResourceType resourceType) +{ + return os << Resource::getResourceTypeName(resourceType); +} + /* NullResource instance */ const Resource NullResource{}; diff --git a/src/core/resource/Resource.hpp b/src/core/resource/Resource.hpp index 1934029..63ed591 100644 --- a/src/core/resource/Resource.hpp +++ b/src/core/resource/Resource.hpp @@ -30,6 +30,7 @@ #include #include +#include #include namespace ousia { @@ -169,8 +170,35 @@ public: * a resource. */ const std::string &getLocation() const { return location; } + + /** + * Returns the name of the given resource type. + * + * @param resourceType is the ResourceType of which the human readable name + * should be returned. + * @return the human readable name of the ResourceType. + */ + static std::string getResourceTypeName(ResourceType resourceType); + + /** + * Returns a resourceType by its name or ResourceType::UNKNOWN if the name + * is invalid. + * + * @param name is the name of the resource type. The name is converted to + * lowercase. + */ + static ResourceType getResourceTypeByName(const std::string &name); }; +/** + * Operator used for streaming the name of ResourceType instances. + * + * @param os is the output stream. + * @param resourceType is the type that should be serialized. + * @return the output stream. + */ +std::ostream& operator<<(std::ostream &os, ResourceType resourceType); + /** * Invalid resource instance. */ -- cgit v1.2.3