Program Listing for File ParsingFlags.hpp

Return to documentation for file (src/rdf4cpp/parser/ParsingFlags.hpp)

#ifndef RDF4CPP_PARSER_PARSINGFLAGS_HPP
#define RDF4CPP_PARSER_PARSINGFLAGS_HPP

#include <cstdint>
#include <type_traits>

namespace rdf4cpp::parser {

enum struct ParsingFlag : uint8_t {
    Lax              = 1 << 0,
    NoParsePrefix    = 1 << 1,
    KeepBlankNodeIds = 1 << 2,
    NoParseBlankNode = 1 << 3,

    Turtle   = 0b00 << 4, // default
    NTriples = 0b01 << 4,
    NQuads   = 0b10 << 4,
    TriG     = 0b11 << 4,
    RdfXml  = 0b100 << 4,
};
constexpr uint8_t ParsingFlag_SyntaxMask = 0b111 << 4;

struct ParsingFlags {
private:
    using flag_u_type = std::underlying_type_t<ParsingFlag>;
    flag_u_type flags;

    constexpr ParsingFlags(uint8_t const flags) noexcept : flags{flags} {}

public:
    constexpr ParsingFlags(ParsingFlag const flag) noexcept
        : flags{static_cast<flag_u_type>(flag)} {
    }

    static constexpr ParsingFlags none() noexcept {
        return ParsingFlags{0};
    }

    [[nodiscard]] constexpr bool contains(ParsingFlag const flag) const noexcept {
        return flags & static_cast<flag_u_type>(flag);
    }

    constexpr ParsingFlags &operator|=(ParsingFlags const other) noexcept {
        this->flags |= other.flags;
        return *this;
    }

    constexpr ParsingFlags operator|(ParsingFlags const other) const noexcept {
        auto cpy = *this;
        return (cpy |= other);
    }

    constexpr ParsingFlags &operator|=(ParsingFlag const flag) noexcept {
        this->flags |= static_cast<flag_u_type>(flag);
        return *this;
    }

    constexpr ParsingFlags operator|(ParsingFlag const flag) const noexcept {
        auto cpy = *this;
        return (cpy |= flag);
    }

    [[nodiscard]] constexpr ParsingFlag get_syntax() const noexcept {
        return static_cast<ParsingFlag>(flags & static_cast<flag_u_type>(ParsingFlag_SyntaxMask));
    }

    [[nodiscard]] constexpr bool syntax_allows_prefixes() const noexcept {
        auto const syn = get_syntax();
        return syn == ParsingFlag::Turtle || syn ==  ParsingFlag::TriG;
    }
};

constexpr ParsingFlags operator|(ParsingFlag const f1, ParsingFlag const f2) noexcept {
    return ParsingFlags::none() | f1 | f2;
}

} // namespace rdf4cpp::parser

#endif  //RDF4CPP_PARSER_PARSINGFLAGS_HPP