#ifndef QUERY_RECORD_HPP #define QUERY_RECORD_HPP #include "matador/sql/field.hpp" #include #include namespace matador::sql { class column; class record final { private: using field_ref = std::reference_wrapper; using field_by_index = std::vector; using field_index_pair = std::pair; using field_by_name_map = std::unordered_map; public: using iterator = field_by_index::iterator; using const_iterator = field_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 &f : fields_) { f.get().process(op); } } void append(const field &col); [[nodiscard]] const std::vector& columns() const; [[nodiscard]] const field& at(const sql::column &col) const; [[nodiscard]] const field& at(size_t index) const; template std::optional at(const column &col) const { return at(col).as(); } template std::optional at(const size_t index) const { return at(index).as(); } 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(); private: void init(); void add_to_map(field &col, size_t index); private: field_by_index fields_; field_by_name_map fields_by_name_; }; } #endif //QUERY_RECORD_HPP