[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