forked from qt-creator/qt-creator
Sqlite: Flatten calls inside functions
The code is doing quite some template magic. This helps the compiler to be persistent in removing intermediate function calls. So it would look like handwritten code. Change-Id: Idbe152b9256f5ea23d5a4c42ea2cfd117346d3a7 Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
@@ -27,6 +27,12 @@
|
|||||||
|
|
||||||
using std::int64_t;
|
using std::int64_t;
|
||||||
|
|
||||||
|
#ifdef Q_CC_MSVC
|
||||||
|
#define FLATTEN [[msvc::flatten]]
|
||||||
|
#else
|
||||||
|
#define FLATTEN [[gnu::flatten]]
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace Sqlite {
|
namespace Sqlite {
|
||||||
|
|
||||||
class Database;
|
class Database;
|
||||||
@@ -150,7 +156,7 @@ public:
|
|||||||
using BaseStatement::BaseStatement;
|
using BaseStatement::BaseStatement;
|
||||||
StatementImplementation(StatementImplementation &&) = default;
|
StatementImplementation(StatementImplementation &&) = default;
|
||||||
|
|
||||||
void execute()
|
FLATTEN void execute()
|
||||||
{
|
{
|
||||||
Resetter resetter{this};
|
Resetter resetter{this};
|
||||||
BaseStatement::next();
|
BaseStatement::next();
|
||||||
@@ -166,7 +172,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename... ValueType>
|
template<typename... ValueType>
|
||||||
void write(const ValueType&... values)
|
FLATTEN void write(const ValueType &...values)
|
||||||
{
|
{
|
||||||
Resetter resetter{this};
|
Resetter resetter{this};
|
||||||
bindValues(values...);
|
bindValues(values...);
|
||||||
@@ -190,7 +196,7 @@ public:
|
|||||||
std::size_t capacity = 32,
|
std::size_t capacity = 32,
|
||||||
typename = std::enable_if_t<is_container<Container>::value>,
|
typename = std::enable_if_t<is_container<Container>::value>,
|
||||||
typename... QueryTypes>
|
typename... QueryTypes>
|
||||||
auto values(const QueryTypes &...queryValues)
|
FLATTEN auto values(const QueryTypes &...queryValues)
|
||||||
{
|
{
|
||||||
Resetter resetter{this};
|
Resetter resetter{this};
|
||||||
Container resultValues;
|
Container resultValues;
|
||||||
@@ -211,7 +217,7 @@ public:
|
|||||||
template<typename...> typename Container = std::vector,
|
template<typename...> typename Container = std::vector,
|
||||||
typename = std::enable_if_t<!is_container<ResultType>::value>,
|
typename = std::enable_if_t<!is_container<ResultType>::value>,
|
||||||
typename... QueryTypes>
|
typename... QueryTypes>
|
||||||
auto values(const QueryTypes &...queryValues)
|
FLATTEN auto values(const QueryTypes &...queryValues)
|
||||||
{
|
{
|
||||||
return values<Container<ResultType>, capacity>(queryValues...);
|
return values<Container<ResultType>, capacity>(queryValues...);
|
||||||
}
|
}
|
||||||
@@ -231,7 +237,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename ResultType, typename... QueryTypes>
|
template<typename ResultType, typename... QueryTypes>
|
||||||
auto optionalValue(const QueryTypes &...queryValues)
|
FLATTEN auto optionalValue(const QueryTypes &...queryValues)
|
||||||
{
|
{
|
||||||
Resetter resetter{this};
|
Resetter resetter{this};
|
||||||
std::optional<ResultType> resultValue;
|
std::optional<ResultType> resultValue;
|
||||||
@@ -245,7 +251,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename Type>
|
template<typename Type>
|
||||||
static auto toValue(Utils::SmallStringView sqlStatement, Database &database)
|
FLATTEN static auto toValue(Utils::SmallStringView sqlStatement, Database &database)
|
||||||
{
|
{
|
||||||
StatementImplementation statement(sqlStatement, database);
|
StatementImplementation statement(sqlStatement, database);
|
||||||
|
|
||||||
@@ -257,7 +263,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename Callable, typename... QueryTypes>
|
template<typename Callable, typename... QueryTypes>
|
||||||
void readCallback(Callable &&callable, const QueryTypes &...queryValues)
|
FLATTEN void readCallback(Callable &&callable, const QueryTypes &...queryValues)
|
||||||
{
|
{
|
||||||
Resetter resetter{this};
|
Resetter resetter{this};
|
||||||
|
|
||||||
@@ -272,7 +278,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename Container, typename... QueryTypes>
|
template<typename Container, typename... QueryTypes>
|
||||||
void readTo(Container &container, const QueryTypes &...queryValues)
|
FLATTEN void readTo(Container &container, const QueryTypes &...queryValues)
|
||||||
{
|
{
|
||||||
Resetter resetter{this};
|
Resetter resetter{this};
|
||||||
|
|
||||||
@@ -283,13 +289,13 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename ResultType, typename... QueryTypes>
|
template<typename ResultType, typename... QueryTypes>
|
||||||
auto range(const QueryTypes &...queryValues)
|
FLATTEN auto range(const QueryTypes &...queryValues)
|
||||||
{
|
{
|
||||||
return SqliteResultRange<ResultType>{*this, queryValues...};
|
return SqliteResultRange<ResultType>{*this, queryValues...};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ResultType, typename... QueryTypes>
|
template<typename ResultType, typename... QueryTypes>
|
||||||
auto rangeWithTransaction(const QueryTypes &...queryValues)
|
FLATTEN auto rangeWithTransaction(const QueryTypes &...queryValues)
|
||||||
{
|
{
|
||||||
return SqliteResultRangeWithTransaction<ResultType>{*this, queryValues...};
|
return SqliteResultRangeWithTransaction<ResultType>{*this, queryValues...};
|
||||||
}
|
}
|
||||||
|
@@ -32,7 +32,7 @@ public:
|
|||||||
using Base::values;
|
using Base::values;
|
||||||
|
|
||||||
template<typename ResultType, typename... QueryTypes>
|
template<typename ResultType, typename... QueryTypes>
|
||||||
auto valueWithTransaction(const QueryTypes &...queryValues)
|
FLATTEN auto valueWithTransaction(const QueryTypes &...queryValues)
|
||||||
{
|
{
|
||||||
return withDeferredTransaction(Base::database(), [&] {
|
return withDeferredTransaction(Base::database(), [&] {
|
||||||
return Base::template value<ResultType>(queryValues...);
|
return Base::template value<ResultType>(queryValues...);
|
||||||
@@ -40,7 +40,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename ResultType, typename... QueryTypes>
|
template<typename ResultType, typename... QueryTypes>
|
||||||
auto optionalValueWithTransaction(const QueryTypes &...queryValues)
|
FLATTEN auto optionalValueWithTransaction(const QueryTypes &...queryValues)
|
||||||
{
|
{
|
||||||
return withDeferredTransaction(Base::database(), [&] {
|
return withDeferredTransaction(Base::database(), [&] {
|
||||||
return Base::template optionalValue<ResultType>(queryValues...);
|
return Base::template optionalValue<ResultType>(queryValues...);
|
||||||
@@ -48,7 +48,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename ResultType, std::size_t capacity = 32, typename... QueryTypes>
|
template<typename ResultType, std::size_t capacity = 32, typename... QueryTypes>
|
||||||
auto valuesWithTransaction(const QueryTypes &...queryValues)
|
FLATTEN auto valuesWithTransaction(const QueryTypes &...queryValues)
|
||||||
{
|
{
|
||||||
return withDeferredTransaction(Base::database(), [&] {
|
return withDeferredTransaction(Base::database(), [&] {
|
||||||
return Base::template values<ResultType, capacity>(queryValues...);
|
return Base::template values<ResultType, capacity>(queryValues...);
|
||||||
@@ -56,7 +56,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename Callable, typename... QueryTypes>
|
template<typename Callable, typename... QueryTypes>
|
||||||
void readCallbackWithTransaction(Callable &&callable, const QueryTypes &...queryValues)
|
FLATTEN void readCallbackWithTransaction(Callable &&callable, const QueryTypes &...queryValues)
|
||||||
{
|
{
|
||||||
withDeferredTransaction(Base::database(), [&] {
|
withDeferredTransaction(Base::database(), [&] {
|
||||||
Base::readCallback(std::forward<Callable>(callable), queryValues...);
|
Base::readCallback(std::forward<Callable>(callable), queryValues...);
|
||||||
@@ -64,7 +64,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename Container, typename... QueryTypes>
|
template<typename Container, typename... QueryTypes>
|
||||||
void readToWithTransaction(Container &container, const QueryTypes &...queryValues)
|
FLATTEN void readToWithTransaction(Container &container, const QueryTypes &...queryValues)
|
||||||
{
|
{
|
||||||
withDeferredTransaction(Base::database(), [&] { Base::readTo(container, queryValues...); });
|
withDeferredTransaction(Base::database(), [&] { Base::readTo(container, queryValues...); });
|
||||||
}
|
}
|
||||||
|
@@ -32,7 +32,7 @@ public:
|
|||||||
using Base::write;
|
using Base::write;
|
||||||
|
|
||||||
template<typename ResultType, typename... QueryTypes>
|
template<typename ResultType, typename... QueryTypes>
|
||||||
auto valueWithTransaction(const QueryTypes &...queryValues)
|
FLATTEN auto valueWithTransaction(const QueryTypes &...queryValues)
|
||||||
{
|
{
|
||||||
return withImmediateTransaction(Base::database(), [&] {
|
return withImmediateTransaction(Base::database(), [&] {
|
||||||
return Base::template value<ResultType>(queryValues...);
|
return Base::template value<ResultType>(queryValues...);
|
||||||
@@ -40,17 +40,15 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename ResultType, typename... QueryTypes>
|
template<typename ResultType, typename... QueryTypes>
|
||||||
auto optionalValueWithTransaction(const QueryTypes &...queryValues)
|
FLATTEN auto optionalValueWithTransaction(const QueryTypes &...queryValues)
|
||||||
{
|
{
|
||||||
return withImmediateTransaction(Base::database(), [&] {
|
return withImmediateTransaction(Base::database(), [&] {
|
||||||
return Base::template optionalValue<ResultType>(queryValues...);
|
return Base::template optionalValue<ResultType>(queryValues...);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ResultType,
|
template<typename ResultType, std::size_t capacity = 32, typename... QueryTypes>
|
||||||
std::size_t capacity = 32,
|
FLATTEN auto valuesWithTransaction(const QueryTypes &...queryValues)
|
||||||
typename... QueryTypes>
|
|
||||||
auto valuesWithTransaction(const QueryTypes &...queryValues)
|
|
||||||
{
|
{
|
||||||
return withImmediateTransaction(Base::database(), [&] {
|
return withImmediateTransaction(Base::database(), [&] {
|
||||||
return Base::template values<ResultType, capacity>(queryValues...);
|
return Base::template values<ResultType, capacity>(queryValues...);
|
||||||
@@ -58,7 +56,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename Callable, typename... QueryTypes>
|
template<typename Callable, typename... QueryTypes>
|
||||||
void readCallbackWithTransaction(Callable &&callable, const QueryTypes &...queryValues)
|
FLATTEN void readCallbackWithTransaction(Callable &&callable, const QueryTypes &...queryValues)
|
||||||
{
|
{
|
||||||
withImmediateTransaction(Base::database(), [&] {
|
withImmediateTransaction(Base::database(), [&] {
|
||||||
Base::readCallback(std::forward<Callable>(callable), queryValues...);
|
Base::readCallback(std::forward<Callable>(callable), queryValues...);
|
||||||
@@ -66,14 +64,14 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename Container, typename... QueryTypes>
|
template<typename Container, typename... QueryTypes>
|
||||||
void readToWithTransaction(Container &container, const QueryTypes &...queryValues)
|
FLATTEN void readToWithTransaction(Container &container, const QueryTypes &...queryValues)
|
||||||
{
|
{
|
||||||
withImmediateTransaction(Base::database(), [&] {
|
withImmediateTransaction(Base::database(), [&] {
|
||||||
Base::readTo(container, queryValues...);
|
Base::readTo(container, queryValues...);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void executeWithTransaction()
|
FLATTEN void executeWithTransaction()
|
||||||
{
|
{
|
||||||
withImmediateTransaction(Base::database(), [&] {
|
withImmediateTransaction(Base::database(), [&] {
|
||||||
Base::execute();
|
Base::execute();
|
||||||
|
Reference in New Issue
Block a user