diff --git a/libc/src/__support/CPP/CMakeLists.txt b/libc/src/__support/CPP/CMakeLists.txt --- a/libc/src/__support/CPP/CMakeLists.txt +++ b/libc/src/__support/CPP/CMakeLists.txt @@ -10,6 +10,7 @@ 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 --- /dev/null +++ b/libc/src/__support/CPP/Utility.h @@ -0,0 +1,39 @@ +//===-- Analogous to ----------------------------------*- 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 struct IntegerSequence { + static_assert(IsIntegral::Value); + template using append = IntegerSequence; +}; + +namespace internal { + +template struct MakeIntegerSequence { + using type = typename MakeIntegerSequence::type::template append; +}; + +template struct MakeIntegerSequence { + using type = IntegerSequence; +}; + +} // namespace internal + +template +using MakeIntegerSequence = + typename internal::MakeIntegerSequence::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 --- a/libc/test/src/__support/CPP/CMakeLists.txt +++ b/libc/test/src/__support/CPP/CMakeLists.txt @@ -49,3 +49,13 @@ 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 --- /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, MakeIntegerSequence>)); + using ISeq = IntegerSequence; + EXPECT_TRUE((IsSameV>)); + using LSeq = IntegerSequence; + EXPECT_TRUE((IsSameV>)); + using ULLSeq = IntegerSequence; + EXPECT_TRUE((IsSameV>)); +} + +template +bool checkArray(IntegerSequence seq) { + T arr[sizeof...(Ts)]{Ts...}; + + for (T i = 0; i < static_cast(sizeof...(Ts)); i++) + if (arr[i] != i) + return false; + + return true; +} + +TEST(LlvmLibcIntegerSequencetTest, Many) { + EXPECT_TRUE(checkArray(MakeIntegerSequence{})); +}