[libc-commits] [libc] 6291454 - [libc] Create cpp::IntegerSequence analogous to std::integer_sequence

Alex Brachet via libc-commits libc-commits at lists.llvm.org
Mon Feb 14 10:13:42 PST 2022


Author: Alex Brachet
Date: 2022-02-14T18:13:00Z
New Revision: 6291454658cab950ab0839d75c9e79f99e2603db

URL: https://github.com/llvm/llvm-project/commit/6291454658cab950ab0839d75c9e79f99e2603db
DIFF: https://github.com/llvm/llvm-project/commit/6291454658cab950ab0839d75c9e79f99e2603db.diff

LOG: [libc] Create cpp::IntegerSequence analogous to std::integer_sequence

Reviewed By: sivachandra, lntue

Differential Revision: https://reviews.llvm.org/D119511

Added: 
    libc/src/__support/CPP/Utility.h
    libc/test/src/__support/CPP/integer_sequence_test.cpp

Modified: 
    libc/src/__support/CPP/CMakeLists.txt
    libc/test/src/__support/CPP/CMakeLists.txt

Removed: 
    


################################################################################
diff  --git a/libc/src/__support/CPP/CMakeLists.txt b/libc/src/__support/CPP/CMakeLists.txt
index b591734a6b6f..67499d52fab9 100644
--- a/libc/src/__support/CPP/CMakeLists.txt
+++ b/libc/src/__support/CPP/CMakeLists.txt
@@ -10,6 +10,7 @@ add_header_library(
     Limits.h
     StringView.h
     TypeTraits.h
+    Utility.h
 )
 
 add_header_library(

diff  --git a/libc/src/__support/CPP/Utility.h b/libc/src/__support/CPP/Utility.h
new file mode 100644
index 000000000000..8a997611c8fc
--- /dev/null
+++ b/libc/src/__support/CPP/Utility.h
@@ -0,0 +1,39 @@
+//===-- Analogous to <utility> ----------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC_SUPPORT_CPP_UTILITY_H
+#define LLVM_LIBC_SRC_SUPPORT_CPP_UTILITY_H
+
+#include "src/__support/CPP/TypeTraits.h"
+
+namespace __llvm_libc::cpp {
+
+template <typename T, T... Seq> struct IntegerSequence {
+  static_assert(IsIntegral<T>::Value);
+  template <T Next> using append = IntegerSequence<T, Seq..., Next>;
+};
+
+namespace internal {
+
+template <typename T, int N> struct MakeIntegerSequence {
+  using type = typename MakeIntegerSequence<T, N - 1>::type::template append<N>;
+};
+
+template <typename T> struct MakeIntegerSequence<T, -1> {
+  using type = IntegerSequence<T>;
+};
+
+} // namespace internal
+
+template <typename T, int N>
+using MakeIntegerSequence =
+    typename internal::MakeIntegerSequence<T, N - 1>::type;
+
+} // namespace __llvm_libc::cpp
+
+#endif // LLVM_LIBC_SRC_SUPPORT_CPP_UTILITY_H

diff  --git a/libc/test/src/__support/CPP/CMakeLists.txt b/libc/test/src/__support/CPP/CMakeLists.txt
index 7d4f15b7af5c..d8a84d99c08b 100644
--- a/libc/test/src/__support/CPP/CMakeLists.txt
+++ b/libc/test/src/__support/CPP/CMakeLists.txt
@@ -49,3 +49,13 @@ add_libc_unittest(
   DEPENDS
     libc.src.__support.CPP.vector
 )
+
+add_libc_unittest(
+  int_seq_test
+  SUITE
+    libc_cpp_utils_unittests
+  SRCS
+    integer_sequence_test.cpp
+  DEPENDS
+    libc.src.__support.CPP.standalone_cpp
+)

diff  --git a/libc/test/src/__support/CPP/integer_sequence_test.cpp b/libc/test/src/__support/CPP/integer_sequence_test.cpp
new file mode 100644
index 000000000000..c2c0a9c00ef2
--- /dev/null
+++ b/libc/test/src/__support/CPP/integer_sequence_test.cpp
@@ -0,0 +1,37 @@
+//===-- Unittests for IntegerSequence -------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/__support/CPP/Utility.h"
+#include "utils/UnitTest/Test.h"
+
+using namespace __llvm_libc::cpp;
+
+TEST(LlvmLibcIntegerSequencetTest, Basic) {
+  EXPECT_TRUE((IsSameV<IntegerSequence<int>, MakeIntegerSequence<int, 0>>));
+  using ISeq = IntegerSequence<int, 0, 1, 2, 3>;
+  EXPECT_TRUE((IsSameV<ISeq, MakeIntegerSequence<int, 4>>));
+  using LSeq = IntegerSequence<long, 0, 1, 2, 3>;
+  EXPECT_TRUE((IsSameV<LSeq, MakeIntegerSequence<long, 4>>));
+  using ULLSeq = IntegerSequence<unsigned long long, 0ull, 1ull, 2ull, 3ull>;
+  EXPECT_TRUE((IsSameV<ULLSeq, MakeIntegerSequence<unsigned long long, 4>>));
+}
+
+template <typename T, T... Ts>
+bool checkArray(IntegerSequence<T, Ts...> seq) {
+  T arr[sizeof...(Ts)]{Ts...};
+
+  for (T i = 0; i < static_cast<T>(sizeof...(Ts)); i++)
+    if (arr[i] != i)
+      return false;
+
+  return true;
+}
+
+TEST(LlvmLibcIntegerSequencetTest, Many) {
+  EXPECT_TRUE(checkArray(MakeIntegerSequence<int, 100>{}));
+}


        


More information about the libc-commits mailing list