| // -*- 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 TEST_SUPPORT_ALGORITHMS_H | |
| #define TEST_SUPPORT_ALGORITHMS_H | |
| #include <cstddef> | |
| #include <memory> | |
| #include <type_traits> | |
| #include "test_macros.h" | |
| // This file intends to provide algorithms backported from newer standard revisions. | |
| namespace util { | |
| template <class T, typename std::enable_if<!std::is_array<T>::value, int>::type = 0> | |
| TEST_CONSTEXPR_CXX20 void destroy_at(T* p) { | |
| p->~T(); | |
| } | |
| template <class T, typename std::enable_if<std::is_array<T>::value, int>::type = 0> | |
| TEST_CONSTEXPR_CXX20 void destroy_at(T* p) { | |
| static_assert(std::extent<T>::value > 0, "must destroy a bounded array"); | |
| for (std::size_t i = 0; i != std::extent<T>::value; ++i) | |
| util::destroy_at(i + *p); | |
| } | |
| template <class Iterator> | |
| TEST_CONSTEXPR_CXX20 void destroy(Iterator first, Iterator last) { | |
| for (; first != last; ++first) | |
| util::destroy_at(std::addressof(*first)); | |
| } | |
| template <class Iterator, class Size> | |
| TEST_CONSTEXPR_CXX20 Iterator destroy_n(Iterator first, Size n) { | |
| for (; n > 0; ++first, (void)--n) | |
| util::destroy_at(std::addressof(*first)); | |
| return first; | |
| } | |
| } // namespace util | |
| #endif // TEST_SUPPORT_ALGORITHMS_H |