Skip to content
This repository was archived by the owner on Mar 22, 2023. It is now read-only.

Commit a3064bc

Browse files
authored
Merge pull request #1185 from igchor/simplify_integer_sequence
Make index_sequence helpers compatible with std versions
2 parents 8404149 + af832d4 commit a3064bc

File tree

4 files changed

+36
-33
lines changed

4 files changed

+36
-33
lines changed

include/libpmemobj++/detail/integer_sequence.hpp

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// SPDX-License-Identifier: BSD-3-Clause
2-
/* Copyright 2016-2020, Intel Corporation */
2+
/* Copyright 2016-2021, Intel Corporation */
33

44
/**
55
* @file
@@ -10,6 +10,7 @@
1010
#define LIBPMEMOBJ_CPP_INTEGER_SEQUENCE_HPP
1111

1212
#include <cstddef>
13+
#include <type_traits>
1314

1415
namespace pmem
1516
{
@@ -30,46 +31,49 @@ struct integer_sequence {
3031
template <size_t... Indices>
3132
using index_sequence = integer_sequence<size_t, Indices...>;
3233

33-
/*
34-
* Empty base class.
35-
*
36-
* Subject of empty base optimization.
37-
*/
38-
template <typename T, T I, typename... Types>
34+
template <typename T, T N, typename Enable, T... I>
3935
struct make_integer_seq_impl;
4036

4137
/*
42-
* Class ending recursive variadic template peeling.
38+
* Helper for make_integer_sequence, specialization for N == 0 (end of
39+
* recursion).
4340
*/
44-
template <typename T, T I, T... Indices>
45-
struct make_integer_seq_impl<T, I, integer_sequence<T, Indices...>> {
46-
typedef integer_sequence<T, Indices...> type;
41+
template <typename T, T N, T... I>
42+
struct make_integer_seq_impl<T, N, typename std::enable_if<N == 0>::type,
43+
I...> {
44+
using type = integer_sequence<T, I...>;
4745
};
4846

4947
/*
50-
* Recursively create index while peeling off the types.
48+
* Helper for make_integer_sequence, base case.
5149
*/
52-
template <typename N, N I, N... Indices, typename T, typename... Types>
53-
struct make_integer_seq_impl<N, I, integer_sequence<N, Indices...>, T,
54-
Types...> {
55-
typedef typename make_integer_seq_impl<
56-
N, I + 1, integer_sequence<N, Indices..., I>, Types...>::type
57-
type;
50+
template <typename T, T N, T... I>
51+
struct make_integer_seq_impl<T, N, typename std::enable_if<N != 0>::type,
52+
I...> {
53+
using type = typename make_integer_seq_impl<T, N - 1, void, N - 1,
54+
I...>::type;
5855
};
5956

6057
/*
61-
* Make index sequence entry point.
58+
* Implementation of std::make_integer_sequence which works with C++11.
6259
*/
63-
template <typename... Types>
64-
using make_index_sequence =
65-
make_integer_seq_impl<size_t, 0, integer_sequence<size_t>, Types...>;
60+
template <typename T, T N>
61+
using make_integer_sequence = typename make_integer_seq_impl<T, N, void>::type;
6662

6763
/*
64+
* Implementation of std::make_index_sequence which works with C++11.
65+
*/
66+
template <size_t N>
67+
using make_index_sequence = make_integer_sequence<size_t, N>;
68+
69+
/*
70+
* Implementation of std::index_sequence_for which works with C++11.
71+
*
6872
* A helper alias template to convert any type parameter pack into an index
69-
* sequence of the same length. Analog of std::index_sequence_for.
73+
* sequence of the same length.
7074
*/
7175
template <class... Types>
72-
using index_sequence_for = typename make_index_sequence<Types...>::type;
76+
using index_sequence_for = make_index_sequence<sizeof...(Types)>;
7377

7478
} /* namespace detail */
7579

include/libpmemobj++/detail/life.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,9 @@ c_style_construct(void *ptr, void *arg)
119119
{
120120
auto *arg_pack = static_cast<Tuple *>(arg);
121121

122-
typedef typename make_index_sequence<Args...>::type index;
123122
try {
124-
create_from_tuple<T>(ptr, index(), std::move(*arg_pack));
123+
create_from_tuple<T>(ptr, index_sequence_for<Args...>{},
124+
std::move(*arg_pack));
125125
} catch (...) {
126126
return -1;
127127
}

include/libpmemobj++/detail/pair.hpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,8 @@ struct pair {
2828
template <typename... Args1, typename... Args2>
2929
pair(std::piecewise_construct_t pc, std::tuple<Args1...> first_args,
3030
std::tuple<Args2...> second_args)
31-
: pair(pc, first_args, second_args,
32-
typename make_index_sequence<Args1...>::type{},
33-
typename make_index_sequence<Args2...>::type{})
31+
: pair(pc, first_args, second_args, index_sequence_for<Args1...>{},
32+
index_sequence_for<Args2...>{})
3433
{
3534
}
3635

include/libpmemobj++/experimental/radix_tree.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3459,8 +3459,8 @@ radix_tree<Key, Value, BytesView, MtMode>::leaf::make(pointer_type parent)
34593459
{
34603460
auto t = std::make_tuple();
34613461
return make(parent, std::piecewise_construct, t, t,
3462-
typename detail::make_index_sequence<>::type{},
3463-
typename detail::make_index_sequence<>::type{});
3462+
detail::index_sequence_for<>{},
3463+
detail::index_sequence_for<>{});
34643464
}
34653465

34663466
template <typename Key, typename Value, typename BytesView, bool MtMode>
@@ -3471,8 +3471,8 @@ radix_tree<Key, Value, BytesView, MtMode>::leaf::make(
34713471
std::tuple<Args1...> first_args, std::tuple<Args2...> second_args)
34723472
{
34733473
return make(parent, pc, first_args, second_args,
3474-
typename detail::make_index_sequence<Args1...>::type{},
3475-
typename detail::make_index_sequence<Args2...>::type{});
3474+
detail::index_sequence_for<Args1...>{},
3475+
detail::index_sequence_for<Args2...>{});
34763476
}
34773477

34783478
template <typename Key, typename Value, typename BytesView, bool MtMode>

0 commit comments

Comments
 (0)