Skip to content

Commit cb9a10d

Browse files
committed
restructured Tuple bind a bit
* added some bind tests
1 parent 0c70c97 commit cb9a10d

3 files changed

Lines changed: 48 additions & 12 deletions

File tree

src/tuple19.lib/tuple19/Tuple.bind.h

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,35 +6,34 @@ namespace tuple19 {
66

77
using meta19::_index;
88

9-
template<size_t I, class... Ts> auto constexpr get(Tuple<Ts...>& tuple) -> decltype(auto) {
9+
template<size_t I, class... Ts> constexpr auto get(Tuple<Ts...>& tuple) -> decltype(auto) {
1010
return tuple.amendAt(_index<I>);
1111
}
12-
template<size_t I, class... Ts> auto constexpr get(Tuple<Ts...>&& tuple) -> decltype(auto) {
12+
template<size_t I, class... Ts> constexpr auto get(Tuple<Ts...>&& tuple) -> decltype(auto) {
1313
return std::move(tuple.amendAt(_index<I>));
1414
}
15-
template<size_t I, class... Ts> auto constexpr get(const Tuple<Ts...>& tuple) -> decltype(auto) {
15+
template<size_t I, class... Ts> constexpr auto get(const Tuple<Ts...>& tuple) -> decltype(auto) {
1616
return tuple.at(_index<I>);
1717
}
18-
template<class T, class... Ts> auto constexpr get(Tuple<Ts...>& tuple, Type<T>* = {}) -> decltype(auto) {
18+
template<class T, class... Ts> constexpr auto get(Tuple<Ts...>& tuple, Type<T>* = {}) -> decltype(auto) {
1919
return tuple.amendOf(type<T>);
2020
}
21-
template<class T, class... Ts> auto constexpr get(Tuple<Ts...>&& tuple, Type<T>* = {}) -> decltype(auto) {
21+
template<class T, class... Ts> constexpr auto get(Tuple<Ts...>&& tuple, Type<T>* = {}) -> decltype(auto) {
2222
return std::move(tuple.amendOf(type<T>));
2323
}
24-
template<class T, class... Ts> auto constexpr get(const Tuple<Ts...>& tuple, Type<T>* = {}) -> decltype(auto) {
24+
template<class T, class... Ts> constexpr auto get(const Tuple<Ts...>& tuple, Type<T>* = {}) -> decltype(auto) {
2525
return tuple.of(type<T>);
2626
}
2727

2828
} // namespace tuple19
2929

3030
/// for c++17 structured bindings support
31-
namespace std {
32-
33-
template<class... Ts> class tuple_size<tuple19::Tuple<Ts...>> : public std::integral_constant<size_t, sizeof...(Ts)> {};
31+
template<class... Ts> class std::tuple_size<tuple19::Tuple<Ts...>> {
32+
public:
33+
static constexpr auto value = sizeof...(Ts);
34+
};
3435

35-
template<size_t I, class... Ts> class tuple_element<I, tuple19::Tuple<Ts...>> {
36+
template<size_t I, class... Ts> class std::tuple_element<I, tuple19::Tuple<Ts...>> {
3637
public:
3738
using type = typename tuple19::Tuple<Ts...>::template At<I>;
3839
};
39-
40-
} // namespace std
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#include "Tuple.bind.h"
2+
#include "Tuple.h"
3+
#include "Tuple.ostream.h"
4+
5+
#include <gtest/gtest.h>
6+
7+
using namespace tuple19;
8+
9+
TEST(TupleBind, copy) {
10+
auto tpl = Tuple{12, 'a'};
11+
auto [num, chr] = tpl;
12+
13+
EXPECT_EQ(num, 12);
14+
EXPECT_EQ(chr, 'a');
15+
16+
num = 23;
17+
EXPECT_EQ(tpl, (Tuple{12, 'a'}));
18+
}
19+
20+
TEST(TupleBind, reference) {
21+
auto tpl = Tuple{12, 'a'};
22+
auto& [num, chr] = tpl;
23+
24+
EXPECT_EQ(num, 12);
25+
EXPECT_EQ(chr, 'a');
26+
27+
num = 23;
28+
EXPECT_EQ(tpl, (Tuple{23, 'a'}));
29+
}
30+
31+
TEST(TupleBind, moved) {
32+
auto&& [num, chr] = Tuple{12, 'a'};
33+
34+
EXPECT_EQ(num, 12);
35+
EXPECT_EQ(chr, 'a');
36+
}

src/tuple19.lib/tuple19/tuple19.tests.qbs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Application {
1010
Depends { name: "googletest" }
1111

1212
files: [
13+
"Tuple.bind.test.cpp",
1314
"Tuple.test.cpp",
1415
]
1516
}

0 commit comments

Comments
 (0)