/*
Ousía
Copyright (C) 2014, 2015 Benjamin Paaßen, Andreas Stöckel
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include
#include
#include
#include "ResourceUtils.hpp"
namespace ousia {
namespace RttiTypes {
extern const Rtti Document;
extern const Rtti Domain;
extern const Rtti Node;
extern const Rtti Typesystem;
}
/**
* Map mapping from relations (the "rel" attribute in includes) to the
* corresponding ResourceType.
*/
static const std::unordered_map RelResourceTypeMap{
{"document", ResourceType::DOCUMENT},
{"domain", ResourceType::DOMAIN_DESC},
{"typesystem", ResourceType::TYPESYSTEM}};
/**
* Map mapping from relations to the corresponding Rtti descriptor.
*/
static const std::unordered_map RelRttiTypeMap{
{"document", &RttiTypes::Document},
{"domain", &RttiTypes::Domain},
{"typesystem", &RttiTypes::Typesystem}};
/**
* Map mapping from Rtti pointers to the corresponding ResourceType.
*/
static const std::unordered_map RttiResourceTypeMap{
{&RttiTypes::Document, ResourceType::DOCUMENT},
{&RttiTypes::Domain, ResourceType::DOMAIN_DESC},
{&RttiTypes::Typesystem, ResourceType::TYPESYSTEM}};
ResourceType ResourceUtils::deduceResourceType(const std::string &rel,
const RttiSet &supportedTypes,
Logger &logger)
{
ResourceType res;
// Try to deduce the ResourceType from the "rel" attribute
res = deduceResourceType(rel, logger);
// If this did not work, try to deduce the ResourceType from the
// supportedTypes supplied by the Parser instance.
if (res == ResourceType::UNKNOWN) {
res = deduceResourceType(supportedTypes, logger);
}
if (res == ResourceType::UNKNOWN) {
logger.note(
"Ambigous resource type, consider specifying the \"rel\" "
"attribute");
}
return res;
}
ResourceType ResourceUtils::deduceResourceType(const std::string &rel,
Logger &logger)
{
std::string s = Utils::toLower(rel);
if (!s.empty()) {
auto it = RelResourceTypeMap.find(s);
if (it != RelResourceTypeMap.end()) {
return it->second;
} else {
logger.error(std::string("Unknown relation \"") + rel +
std::string("\""));
}
}
return ResourceType::UNKNOWN;
}
ResourceType ResourceUtils::deduceResourceType(const RttiSet &supportedTypes,
Logger &logger)
{
if (supportedTypes.size() == 1U) {
auto it = RttiResourceTypeMap.find(*supportedTypes.begin());
if (it != RttiResourceTypeMap.end()) {
return it->second;
}
}
return ResourceType::UNKNOWN;
}
const Rtti *ResourceUtils::deduceRttiType(const std::string &rel)
{
std::string s = Utils::toLower(rel);
if (!s.empty()) {
auto it = RelRttiTypeMap.find(s);
if (it != RelRttiTypeMap.end()) {
return it->second;
}
}
return &RttiTypes::Node;
}
RttiSet ResourceUtils::limitRttiTypes(const RttiSet &supportedTypes,
const std::string &rel)
{
return limitRttiTypes(supportedTypes, deduceRttiType(rel));
}
RttiSet ResourceUtils::limitRttiTypes(const RttiSet &supportedTypes,
const Rtti *type)
{
RttiSet res;
for (const Rtti *supportedType : supportedTypes) {
if (supportedType->isa(*type)) {
res.insert(supportedType);
}
}
return res;
}
}