/* * kmp_utils.h -- Utilities that used internally */ //===----------------------------------------------------------------------===// // // 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 __KMP_UTILS_H__ #define __KMP_UTILS_H__ #include #include "kmp.h" /// A simple pure header implementation of VLA that aims to replace uses of /// actual VLA, which can cause compile warning. This class by default creates a /// stack buffer that can accomodate \p N elements. If the number of elements is /// greater than \p N, then a heap buffer will be allocated and used to /// accomodate the elements. Similar to the actual VLA, we don't check boundary /// (for now), so we will not store the number of elements. We can always revise /// it later. template class SimpleVLA final { T StackBuffer[N]; T *HeapBuffer = nullptr; T *Ptr = StackBuffer; public: SimpleVLA() = delete; SimpleVLA(const SimpleVLA &) = delete; SimpleVLA(SimpleVLA &&) = delete; SimpleVLA &operator=(const SimpleVLA &) = delete; SimpleVLA &operator=(SimpleVLA &&) = delete; explicit SimpleVLA(unsigned NumOfElements) noexcept { if (NumOfElements > N) { HeapBuffer = reinterpret_cast(__kmp_allocate(NumOfElements * sizeof(T))); Ptr = HeapBuffer; } } ~SimpleVLA() { if (HeapBuffer) __kmp_free(HeapBuffer); } operator T *() noexcept { return Ptr; } operator const T *() const noexcept { return Ptr; } }; #endif