#ifndef QUERY_RECORD_HPP #define QUERY_RECORD_HPP #include "matador/utils/access.hpp" #include "matador/sql/column_definition.hpp" #include #include namespace matador::sql { struct column; class record { private: using column_by_index = std::vector; using column_index_pair = std::pair, size_t>; using column_by_name_map = std::unordered_map; public: using iterator = column_by_index::iterator; using const_iterator = column_by_index::const_iterator; record() = default; record(std::initializer_list columns); explicit record(const std::vector &columns); record(const record &x); record& operator=(const record &x); record(record&&) noexcept = default; record& operator=(record&&) noexcept = default; ~record() = default; template void process(Operator &op) { for(auto &col : columns_) { col.process(op); } } template < typename Type > void append(const std::string &name, long size = -1) { append(make_column(name, size)); } void append(column_definition col); [[nodiscard]] bool has_primary_key() const; [[nodiscard]] std::optional primary_key() const; [[nodiscard]] const std::vector& columns() const; [[nodiscard]] const column_definition& at(const column &col) const; [[nodiscard]] const column_definition& at(size_t index) const; iterator find(const std::string &column_name); [[nodiscard]] const_iterator find(const std::string &column_name) const; iterator begin(); [[nodiscard]] const_iterator begin() const; [[nodiscard]] const_iterator cbegin() const; iterator end(); [[nodiscard]] const_iterator end() const; [[nodiscard]] const_iterator cend() const; [[nodiscard]] size_t size() const; [[nodiscard]] bool empty() const; void clear(); [[nodiscard]] bool unknown() const; private: void init(); void add_to_map(column_definition &col, size_t index); private: column_by_index columns_; column_by_name_map columns_by_name_; int pk_index_{-1}; }; } #endif //QUERY_RECORD_HPP