Skip to content

Commit

Permalink
Added std::make_integer_sequence.
Browse files Browse the repository at this point in the history
  • Loading branch information
sleepy-monax committed Jul 4, 2024
1 parent b600649 commit 78db9ea
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 18 deletions.
8 changes: 4 additions & 4 deletions src/ce-stdcpp/type_traits
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ namespace std {

template <typename T> inline constexpr bool is_array_v = __is_array(T);

/* --- Remove Reference --- */
// MARK: Remove Reference ------------------------------------------------------

template <typename T> struct remove_reference {
using type = T;
Expand All @@ -21,7 +21,7 @@ template <typename T> struct remove_reference<T &&> {
template <typename T>
using remove_reference_t = typename remove_reference<T>::type;

/* --- Remove Const --- */
// MARK: Remove Reference ------------------------------------------------------

template <typename T> struct remove_const {
using type = T;
Expand All @@ -33,7 +33,7 @@ template <typename T> struct remove_const<T const> {

template <typename T> using remove_const_t = typename remove_const<T>::type;

/* --- Remove Volatile --- */
// MARK: Remove Volatile -------------------------------------------------------

template <typename T> struct remove_volatile {
using type = T;
Expand All @@ -46,7 +46,7 @@ template <typename T> struct remove_volatile<T volatile> {
template <typename T>
using remove_volatile_t = typename remove_volatile<T>::type;

/* --- Remove CVR --- */
// MARK: Remove CVR ------------------------------------------------------------

template <typename T> struct remove_cv {
using type = remove_volatile_t<remove_const_t<T>>;
Expand Down
31 changes: 17 additions & 14 deletions src/ce-stdcpp/utility
Original file line number Diff line number Diff line change
Expand Up @@ -33,24 +33,27 @@ template <typename T> constexpr void swap(T &lhs, T &rhs) {
rhs = std::move(tmp);
}

template <size_t... Ints> struct index_sequence {
using type = index_sequence;
using value_type = size_t;
static constexpr size_t size() noexcept { return sizeof...(Ints); }
// MARK: Integer Sequence ------------------------------------------------------

template <typename I, I... Seq> class integer_sequence {};

template <typename I, I X, I N, I... Seq> struct _make_seq_helper {
using type = typename _make_seq_helper<I, X + 1, N, Seq..., X>::type;
};

template <typename I, I N, I... Seq> struct _make_seq_helper<I, N, N, Seq...> {
using type = integer_sequence<I, Seq...>;
};

template <class Sequence1, class Sequence2> struct _merge_and_renumber;
template <typename I, I N>
using make_integer_sequence = typename _make_seq_helper<I, 0, N>::type;

template <size_t... I1, size_t... I2>
struct _merge_and_renumber<index_sequence<I1...>, index_sequence<I2...>>
: index_sequence<I1..., (sizeof...(I1) + I2)...> {};
// MARK: Index Sequence --------------------------------------------------------

template <size_t N>
struct make_index_sequence
: _merge_and_renumber<typename make_index_sequence<N / 2>::type,
typename make_index_sequence<N - N / 2>::type> {};
template <size_t... Seq>
using index_sequence = integer_sequence<size_t, Seq...>;

template <> struct make_index_sequence<0> : index_sequence<> {};
template <> struct make_index_sequence<1> : index_sequence<0> {};
template <size_t N>
using make_index_sequence = make_integer_sequence<size_t, N>;

} // namespace std

0 comments on commit 78db9ea

Please sign in to comment.