1//===-- integer_sequence utility --------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_UTILITY_INTEGER_SEQUENCE_H
10#define LLVM_LIBC_SRC___SUPPORT_CPP_UTILITY_INTEGER_SEQUENCE_H
11
12#include "src/__support/CPP/type_traits/is_integral.h"
13#include "src/__support/macros/config.h"
14
15#include <stddef.h>
16
17namespace LIBC_NAMESPACE_DECL {
18namespace cpp {
19
20// integer_sequence
21template <typename T, T... Ints> struct integer_sequence {
22 static_assert(cpp::is_integral_v<T>);
23 template <T Next> using append = integer_sequence<T, Ints..., Next>;
24};
25
26namespace detail {
27template <typename T, int N> struct make_integer_sequence {
28 using type =
29 typename make_integer_sequence<T, N - 1>::type::template append<N>;
30};
31template <typename T> struct make_integer_sequence<T, -1> {
32 using type = integer_sequence<T>;
33};
34} // namespace detail
35
36template <typename T, int N>
37using make_integer_sequence =
38 typename detail::make_integer_sequence<T, N - 1>::type;
39
40// index sequence
41template <size_t... Ints>
42using index_sequence = integer_sequence<size_t, Ints...>;
43template <int N>
44using make_index_sequence =
45 typename detail::make_integer_sequence<size_t, N - 1>::type;
46
47} // namespace cpp
48} // namespace LIBC_NAMESPACE_DECL
49
50#endif // LLVM_LIBC_SRC___SUPPORT_CPP_UTILITY_INTEGER_SEQUENCE_H
51