Program Listing for File QuadPattern.hpp

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

#ifndef RDF4CPP_QUADPATTERN_HPP
#define RDF4CPP_QUADPATTERN_HPP

#include <rdf4cpp/Node.hpp>
#include <rdf4cpp/query/TriplePattern.hpp>

#include <array>
#include <ostream>

namespace rdf4cpp::query {
struct QuadPattern {
    using value_type = Node;
    using reference = value_type &;
    using const_reference = value_type const &;
    using pointer = value_type *;
    using const_pointer = value_type const *;
    using size_type = size_t;
    using difference_type = ptrdiff_t;

protected:
    using storage_type = std::array<Node, 4>;
    storage_type entries_{};

public:
    QuadPattern() noexcept = default;
    QuadPattern(Node graph, Node subject, Node predicate, Node object) noexcept;

    [[nodiscard]] reference graph() noexcept { return entries_[0]; }
    [[nodiscard]] const_reference graph() const noexcept { return entries_[0]; }

    [[nodiscard]] reference subject() noexcept { return entries_[1]; }
    [[nodiscard]] const_reference subject() const noexcept { return entries_[1]; }

    [[nodiscard]] reference predicate() noexcept { return entries_[2]; }
    [[nodiscard]] const_reference predicate() const noexcept { return entries_[2]; }

    [[nodiscard]] reference object() noexcept { return entries_[3]; }
    [[nodiscard]] const_reference object() const noexcept { return entries_[3]; }

    [[nodiscard]] reference operator[](size_type ix) noexcept { return entries_[ix]; }
    [[nodiscard]] const_reference operator[](size_type ix) const noexcept { return entries_[ix]; }

    [[nodiscard]] size_type size() const noexcept { return entries_.size(); }

    [[nodiscard]] bool valid() const noexcept;

    using iterator = typename storage_type::iterator;
    using const_iterator = typename storage_type::const_iterator;
    using reverse_iterator = typename storage_type::reverse_iterator;
    using const_reverse_iterator = typename storage_type::const_reverse_iterator;

    [[nodiscard]] iterator begin() noexcept { return entries_.begin(); }
    [[nodiscard]] const_iterator begin() const noexcept { return entries_.begin(); }
    [[nodiscard]] iterator end() noexcept { return entries_.end(); }
    [[nodiscard]] const_iterator end() const noexcept { return entries_.end(); }
    [[nodiscard]] reverse_iterator rbegin() noexcept { return entries_.rbegin(); }
    [[nodiscard]] const_reverse_iterator rbegin() const noexcept { return entries_.rbegin(); }
    [[nodiscard]] reverse_iterator rend() noexcept { return entries_.rend(); }
    [[nodiscard]] const_reverse_iterator rend() const noexcept { return entries_.rend(); }

    [[nodiscard]] TriplePattern const &without_graph() const noexcept;

    auto operator<=>(QuadPattern const &rhs) const = default;

    [[nodiscard]] explicit operator std::string() const;
    friend std::ostream &operator<<(std::ostream &os, QuadPattern const &pattern);

    [[nodiscard]] QuadPattern to_node_storage(storage::DynNodeStoragePtr node_storage) const;
    [[nodiscard]] QuadPattern try_get_in_node_storage(storage::DynNodeStoragePtr node_storage) const noexcept;
};
}  // namespace rdf4cpp::query

#endif  //RDF4CPP_QUADPATTERN_HPP