mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 03:27:39 +00:00
55 lines
1.7 KiB
C++
55 lines
1.7 KiB
C++
/*
|
|
* 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 <cstddef>
|
|
|
|
#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 <typename T, unsigned N = 8> 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<T *>(__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
|