|  | //===-- flang/unittests/Runtime/tools.h -------------------------*- 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 FORTRAN_UNITTESTS_RUNTIME_TOOLS_H_ | 
|  | #define FORTRAN_UNITTESTS_RUNTIME_TOOLS_H_ | 
|  |  | 
|  | #include "gtest/gtest.h" | 
|  | #include "flang/Runtime/allocatable.h" | 
|  | #include "flang/Runtime/cpp-type.h" | 
|  | #include "flang/Runtime/descriptor.h" | 
|  | #include "flang/Runtime/type-code.h" | 
|  | #include <cstdint> | 
|  | #include <cstring> | 
|  | #include <vector> | 
|  |  | 
|  | namespace Fortran::runtime { | 
|  |  | 
|  | template <typename A> | 
|  | static void StoreElement(void *p, const A &x, std::size_t bytes) { | 
|  | std::memcpy(p, &x, bytes); | 
|  | } | 
|  |  | 
|  | template <typename CHAR> | 
|  | static void StoreElement( | 
|  | void *p, const std::basic_string<CHAR> &str, std::size_t bytes) { | 
|  | ASSERT_LE(bytes, sizeof(CHAR) * str.size()); | 
|  | std::memcpy(p, str.data(), bytes); | 
|  | } | 
|  |  | 
|  | template <TypeCategory CAT, int KIND, typename A> | 
|  | static OwningPtr<Descriptor> MakeArray(const std::vector<int> &shape, | 
|  | const std::vector<A> &data, | 
|  | std::size_t elemLen = CAT == TypeCategory::Complex ? 2 * KIND : KIND) { | 
|  | auto rank{static_cast<int>(shape.size())}; | 
|  | auto result{Descriptor::Create(TypeCode{CAT, KIND}, elemLen, nullptr, rank, | 
|  | nullptr, CFI_attribute_allocatable)}; | 
|  | for (int j{0}; j < rank; ++j) { | 
|  | result->GetDimension(j).SetBounds(1, shape[j]); | 
|  | } | 
|  | int stat{result->Allocate()}; | 
|  | EXPECT_EQ(stat, 0) << stat; | 
|  | EXPECT_LE(data.size(), result->Elements()); | 
|  | char *p{result->OffsetElement<char>()}; | 
|  | for (A x : data) { | 
|  | StoreElement(p, x, elemLen); | 
|  | p += elemLen; | 
|  | } | 
|  | return result; | 
|  | } | 
|  |  | 
|  | } // namespace Fortran::runtime | 
|  | #endif // FORTRAN_UNITTESTS_RUNTIME_TOOLS_H_ |