#ifndef QUERY_FIELD_HPP #define QUERY_FIELD_HPP #include "matador/sql/any_type.hpp" #include "matador/sql/any_type_to_visitor.hpp" #include "matador/utils/types.hpp" #include #include namespace matador::sql { enum class field_type { Integer, FloatingPoint, String, Boolean, Blob, Null }; template < typename Type, typename Enable = void > struct field_traits; template struct field_traits::value && !std::is_same::value>::type> { static field_type type() { return field_type::Integer; } }; template struct field_traits::value>::type> { static field_type type() { return field_type::FloatingPoint; } }; template struct field_traits::value>::type> { static field_type type() { return field_type::String; } }; template struct field_traits::value>::type> { static field_type type() { return field_type::Boolean; } }; template struct field_traits::value>::type> { static field_type type() { return field_type::Null; } }; template struct field_traits::value>::type> { static field_type type() { return field_type::Blob; } }; class field { public: explicit field(std::string name); template field(std::string name, Type value) : name_(std::move(name)) , value_(value) , type_(field_traits::type()) {} field(const field &x) = default; field& operator=(const field &x) = default; field(field &&x) noexcept; field& operator=(field &&x) noexcept; template field& operator=(Type value) { value_ = std::move(value); type_ = field_traits::type(); return *this; } [[nodiscard]] const std::string& name() const; template std::optional as() const { any_type_to_visitor visitor; std::visit(visitor, const_cast(value_)); return visitor.result; } [[nodiscard]] std::string str() const; [[nodiscard]] bool is_integer() const; [[nodiscard]] bool is_floating_point() const; [[nodiscard]] bool is_bool() const; [[nodiscard]] bool is_string() const; [[nodiscard]] bool is_blob() const; [[nodiscard]] bool is_null() const; friend std::ostream& operator<<(std::ostream &out, const field &col); private: std::string name_; any_type value_; field_type type_; }; } #endif //QUERY_FIELD_HPP