Program Listing for File Solution.cpp

Return to documentation for file (src/rdf4cpp/query/Solution.cpp)

#include "Solution.hpp"

namespace rdf4cpp::query {

template<typename Pat>
std::vector<Variable> Solution::extract_variables(Pat const &quad) {
    std::vector<Variable> variables;
    for (const auto &entry : quad) {
        if (entry.is_variable())
            variables.push_back(entry.as_variable());
    }
    return variables;
}

std::vector<std::pair<Variable, Node>> init(std::vector<Variable> const &variables) {
    std::vector<std::pair<Variable, Node>> partial_mapping;
    for (const auto &var_name : variables)
        partial_mapping.emplace_back(var_name, Node());
    return partial_mapping;
}

Solution::Solution(std::vector<Variable> const &variables) : partial_mapping{init(variables)} {}
Solution::Solution(QuadPattern const &qp) : Solution{extract_variables(qp)} {}
Solution::Solution(TriplePattern const &tp) : Solution{extract_variables(tp)} {}

Node Solution::operator[](Variable const &variable) const noexcept {
    size_t pos = std::distance(partial_mapping.begin(), std::find_if(partial_mapping.begin(), partial_mapping.end(),
                                                                     [=](const auto &item) { return item.first == variable; }));
    if (pos < partial_mapping.size()) {
        return partial_mapping[pos].second;
    } else {
        return {};
    }
}

Node const &Solution::operator[](size_t pos) const noexcept {
    RDF4CPP_ASSERT(pos < partial_mapping.size());
    return partial_mapping[pos].second;
}

Node &Solution::operator[](size_t pos) noexcept {
    RDF4CPP_ASSERT(pos < partial_mapping.size());
    return partial_mapping[pos].second;
}

Variable const &Solution::variable(size_t pos) const noexcept {
    RDF4CPP_ASSERT(pos < partial_mapping.size());
    return partial_mapping[pos].first;
}

size_t Solution::variable_count() const noexcept {
    return partial_mapping.size();
}

size_t Solution::bound_count() const noexcept {
    return std::count_if(partial_mapping.begin(), partial_mapping.end(),
                         [](const auto &item) { return not item.second.null(); });
}

Solution::iterator Solution::begin() noexcept {
    return partial_mapping.begin();
}

Solution::iterator Solution::end() noexcept {
    return partial_mapping.end();
}

Solution::const_iterator Solution::begin() const noexcept {
    return partial_mapping.begin();
}

Solution::const_iterator Solution::end() const noexcept {
    return partial_mapping.end();
}

}  // namespace rdf4cpp::query