/
UCS
/
sqlite_orm
Обзор
Документация
Войти
/
UCS
/
sqlite_orm
Код
Запросы
0
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
dev/arg_values.h
145 строк
4 KB
klaus triendl
Applied new code formatting
16 янв 2023, 12:17
16 янв 2023, 12:17
5818dac
Код
Авторство
О чём код?
#pragma once #include <sqlite3.h> #include "row_extractor.h" namespace sqlite_orm { struct arg_value { arg_value() : arg_value(nullptr) {} arg_value(sqlite3_value* value_) : value(value_) {} template<class T> T get() const { return row_extractor<T>().extract(this->value); } bool is_null() const { auto type = sqlite3_value_type(this->value); return type == SQLITE_NULL; } bool is_text() const { auto type = sqlite3_value_type(this->value); return type == SQLITE_TEXT; } bool is_integer() const { auto type = sqlite3_value_type(this->value); return type == SQLITE_INTEGER; } bool is_float() const { auto type = sqlite3_value_type(this->value); return type == SQLITE_FLOAT; } bool is_blob() const { auto type = sqlite3_value_type(this->value); return type == SQLITE_BLOB; } bool empty() const { return this->value == nullptr; } private: sqlite3_value* value = nullptr; }; struct arg_values { struct iterator { iterator(const arg_values& container_, int index_) : container(container_), index(index_), currentValue(index_ < int(container_.size()) ? container_[index_] : arg_value()) {} iterator& operator++() { ++this->index; if(this->index < int(this->container.size())) { this->currentValue = this->container[this->index]; } else { this->currentValue = {}; } return *this; } iterator operator++(int) { auto res = *this; ++this->index; if(this->index < int(this->container.size())) { this->currentValue = this->container[this->index]; } else { this->currentValue = {}; } return res; } arg_value operator*() const { if(this->index < int(this->container.size()) && this->index >= 0) { return this->currentValue; } else { throw std::system_error{orm_error_code::index_is_out_of_bounds}; } } arg_value* operator->() const { return &this->currentValue; } bool operator==(const iterator& other) const { return &other.container == &this->container && other.index == this->index; } bool operator!=(const iterator& other) const { return !(*this == other); } private: const arg_values& container; int index = 0; mutable arg_value currentValue; }; arg_values() : arg_values(0, nullptr) {} arg_values(int argsCount_, sqlite3_value** values_) : argsCount(argsCount_), values(values_) {} size_t size() const { return this->argsCount; } bool empty() const { return 0 == this->argsCount; } arg_value operator[](int index) const { if(index < this->argsCount && index >= 0) { sqlite3_value* value = this->values[index]; return {value}; } else { throw std::system_error{orm_error_code::index_is_out_of_bounds}; } } arg_value at(int index) const { return this->operator[](index); } iterator begin() const { return {*this, 0}; } iterator end() const { return {*this, this->argsCount}; } private: int argsCount = 0; sqlite3_value** values = nullptr; }; }