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:
Marco Bubke
2023-08-27 16:28:24 +02:00
parent a55efac890
commit 2a301d41c4
3 changed files with 28 additions and 24 deletions

View File

@@ -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...};
} }

View File

@@ -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...); });
} }

View File

@@ -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();