Skip to content

Commit 1ce5510

Browse files
authored
Merge pull request #1161 from vittorioromeo/improve_reverse_tuple_iterate
Simplify reverse tuple iteration
2 parents d51e3cf + e64e23b commit 1ce5510

File tree

3 files changed

+6
-71
lines changed

3 files changed

+6
-71
lines changed

dev/functional/index_sequence_util.h

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@
33
#include <utility> // std::index_sequence, std::make_index_sequence
44

55
#include "../functional/cxx_universal.h"
6-
#ifdef SQLITE_ORM_RELAXED_CONSTEXPR_SUPPORTED
7-
#include <array>
8-
#endif
96

107
namespace sqlite_orm {
118
namespace internal {
@@ -17,37 +14,6 @@ namespace sqlite_orm {
1714
return I;
1815
}
1916

20-
#ifdef SQLITE_ORM_RELAXED_CONSTEXPR_SUPPORTED
21-
/**
22-
* Reorder the values of an index_sequence according to the positions from a second sequence.
23-
*/
24-
template<size_t... Value, size_t... IdxOfValue>
25-
SQLITE_ORM_CONSTEVAL auto reorder_index_sequence(std::index_sequence<Value...>,
26-
std::index_sequence<IdxOfValue...>) {
27-
constexpr std::array<size_t, sizeof...(Value)> values{Value...};
28-
return std::index_sequence<values[sizeof...(Value) - 1u - IdxOfValue]...>{};
29-
}
30-
31-
template<size_t Value, size_t IdxOfValue>
32-
SQLITE_ORM_CONSTEVAL std::index_sequence<Value> reorder_index_sequence(std::index_sequence<Value>,
33-
std::index_sequence<IdxOfValue>) {
34-
return {};
35-
}
36-
37-
inline SQLITE_ORM_CONSTEVAL std::index_sequence<> reorder_index_sequence(std::index_sequence<>,
38-
std::index_sequence<>) {
39-
return {};
40-
}
41-
42-
/**
43-
* Reverse the values of an index_sequence.
44-
*/
45-
template<size_t... Idx>
46-
SQLITE_ORM_CONSTEVAL auto reverse_index_sequence(std::index_sequence<Idx...>) {
47-
return reorder_index_sequence(std::index_sequence<Idx...>{}, std::make_index_sequence<sizeof...(Idx)>{});
48-
}
49-
#endif
50-
5117
template<class... Seq>
5218
struct flatten_idxseq {
5319
using type = std::index_sequence<>;

dev/tuple_helper/tuple_iteration.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ namespace sqlite_orm {
3333
template<bool reversed = false, class Tpl, size_t... Idx, class L>
3434
void iterate_tuple(const Tpl& tpl, std::index_sequence<Idx...>, L&& lambda) {
3535
if constexpr(reversed) {
36-
iterate_tuple(tpl, reverse_index_sequence(std::index_sequence<Idx...>{}), std::forward<L>(lambda));
36+
// nifty fold expression trick: make use of guaranteed right-to-left evaluation order when folding over operator=
37+
int sink;
38+
((lambda(std::get<Idx>(tpl)), sink) = ... = 0);
3739
} else {
3840
(lambda(std::get<Idx>(tpl)), ...);
3941
}

include/sqlite_orm/sqlite_orm.h

Lines changed: 3 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1114,10 +1114,6 @@ namespace sqlite_orm {
11141114

11151115
// #include "../functional/cxx_universal.h"
11161116

1117-
#ifdef SQLITE_ORM_RELAXED_CONSTEXPR_SUPPORTED
1118-
#include <array>
1119-
#endif
1120-
11211117
namespace sqlite_orm {
11221118
namespace internal {
11231119
/**
@@ -1128,37 +1124,6 @@ namespace sqlite_orm {
11281124
return I;
11291125
}
11301126

1131-
#ifdef SQLITE_ORM_RELAXED_CONSTEXPR_SUPPORTED
1132-
/**
1133-
* Reorder the values of an index_sequence according to the positions from a second sequence.
1134-
*/
1135-
template<size_t... Value, size_t... IdxOfValue>
1136-
SQLITE_ORM_CONSTEVAL auto reorder_index_sequence(std::index_sequence<Value...>,
1137-
std::index_sequence<IdxOfValue...>) {
1138-
constexpr std::array<size_t, sizeof...(Value)> values{Value...};
1139-
return std::index_sequence<values[sizeof...(Value) - 1u - IdxOfValue]...>{};
1140-
}
1141-
1142-
template<size_t Value, size_t IdxOfValue>
1143-
SQLITE_ORM_CONSTEVAL std::index_sequence<Value> reorder_index_sequence(std::index_sequence<Value>,
1144-
std::index_sequence<IdxOfValue>) {
1145-
return {};
1146-
}
1147-
1148-
inline SQLITE_ORM_CONSTEVAL std::index_sequence<> reorder_index_sequence(std::index_sequence<>,
1149-
std::index_sequence<>) {
1150-
return {};
1151-
}
1152-
1153-
/**
1154-
* Reverse the values of an index_sequence.
1155-
*/
1156-
template<size_t... Idx>
1157-
SQLITE_ORM_CONSTEVAL auto reverse_index_sequence(std::index_sequence<Idx...>) {
1158-
return reorder_index_sequence(std::index_sequence<Idx...>{}, std::make_index_sequence<sizeof...(Idx)>{});
1159-
}
1160-
#endif
1161-
11621127
template<class... Seq>
11631128
struct flatten_idxseq {
11641129
using type = std::index_sequence<>;
@@ -9578,7 +9543,9 @@ namespace sqlite_orm {
95789543
template<bool reversed = false, class Tpl, size_t... Idx, class L>
95799544
void iterate_tuple(const Tpl& tpl, std::index_sequence<Idx...>, L&& lambda) {
95809545
if constexpr(reversed) {
9581-
iterate_tuple(tpl, reverse_index_sequence(std::index_sequence<Idx...>{}), std::forward<L>(lambda));
9546+
// nifty fold expression trick: make use of guaranteed right-to-left evaluation order when folding over operator=
9547+
int sink;
9548+
((lambda(std::get<Idx>(tpl)), sink) = ... = 0);
95829549
} else {
95839550
(lambda(std::get<Idx>(tpl)), ...);
95849551
}

0 commit comments

Comments
 (0)