diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/resource/Resource.cpp | 54 | ||||
-rw-r--r-- | src/core/resource/Resource.hpp | 28 |
2 files changed, 82 insertions, 0 deletions
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 <http://www.gnu.org/licenses/>. */ +#include <core/common/Utils.hpp> + #include "Resource.hpp" #include "ResourceLocator.hpp" namespace ousia { +/* Helper functions for the internal maps */ + +static std::unordered_map<ResourceType, std::string, Utils::EnumHash> reverseMap( + const std::unordered_map<std::string, ResourceType> &m) +{ + std::unordered_map<ResourceType, std::string, Utils::EnumHash> res; + for (auto e : m) { + res.emplace(e.second, e.first); + } + return res; +} + +/* Internal maps */ + +static const std::unordered_map<std::string, ResourceType> + 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<ResourceType, std::string, Utils::EnumHash> + RESOURCE_TYPE_NAME_MAP = reverseMap(NAME_RESOURCE_TYPE_MAP); + /* Class Resource */ Resource::Resource() @@ -39,6 +67,32 @@ std::unique_ptr<std::istream> 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 <map> #include <memory> +#include <ostream> #include <string> namespace ousia { @@ -169,9 +170,36 @@ 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. */ extern const Resource NullResource; |