summaryrefslogtreecommitdiff
path: root/src/core/resource/Resource.cpp
diff options
context:
space:
mode:
authorAndreas Stöckel <astoecke@techfak.uni-bielefeld.de>2015-01-25 18:55:19 +0100
committerAndreas Stöckel <astoecke@techfak.uni-bielefeld.de>2015-01-25 18:55:19 +0100
commit1a6236c184d7ffe3551d417b656aee31b15d1948 (patch)
tree30d7a3a8b6101b5060ecd7f704c70f0c72bd5e27 /src/core/resource/Resource.cpp
parentbfafa64765de7a6002c2e84daefc84811278a51a (diff)
Added functions for dealing with ResourceTypes
Diffstat (limited to 'src/core/resource/Resource.cpp')
-rw-r--r--src/core/resource/Resource.cpp54
1 files changed, 54 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{};