Program Listing for File QuadPattern.cpp

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

#include "QuadPattern.hpp"

#include <rdf4cpp/writer/WriteQuad.hpp>

namespace rdf4cpp::query {

QuadPattern::QuadPattern(Node graph, Node subject, Node predicate, Node object) noexcept : entries_{graph, subject, predicate, object} {
}

bool QuadPattern::valid() const noexcept {
    return (graph().is_iri() || graph().is_variable())
            && !subject().is_literal()
            && (predicate().is_iri() || predicate().is_variable())
            && !object().null();
}

QuadPattern::operator std::string() const {
    auto s = writer::StringWriter::oneshot([this](auto &w) {
        return writer::write_quad<writer::OutputFormat::NQuads>(*this, w, nullptr);
    });

    s.pop_back(); // remove newline
    return s;
}

std::ostream &operator<<(std::ostream &os, const QuadPattern &pattern) {
    os << static_cast<std::string>(pattern);
    return os;
}

QuadPattern QuadPattern::to_node_storage(storage::DynNodeStoragePtr node_storage) const {
    QuadPattern qp;
    auto it = qp.begin();
    for (const auto &item : *this) {
        *(it++) = item.to_node_storage(node_storage);
    }
    return qp;
}

QuadPattern QuadPattern::try_get_in_node_storage(storage::DynNodeStoragePtr node_storage) const noexcept {
    QuadPattern qp;
    auto it = qp.begin();
    for (const auto &item : *this) {
        *(it++) = item.try_get_in_node_storage(node_storage);
    }
    return qp;
}

TriplePattern const &QuadPattern::without_graph() const noexcept {
    static_assert(sizeof(QuadPattern) == 4 * sizeof(Node));
    static_assert(sizeof(TriplePattern) == 3 * sizeof(Node));
    return *reinterpret_cast<TriplePattern const *>(entries_.data() + 1);
}

}  // namespace rdf4cpp::query