//===-- 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 #include #include namespace Fortran::runtime { template static void StoreElement(void *p, const A &x, std::size_t bytes) { std::memcpy(p, &x, bytes); } template static void StoreElement( void *p, const std::basic_string &str, std::size_t bytes) { ASSERT_LE(bytes, sizeof(CHAR) * str.size()); std::memcpy(p, str.data(), bytes); } template static OwningPtr MakeArray(const std::vector &shape, const std::vector &data, std::size_t elemLen = CAT == TypeCategory::Complex ? 2 * KIND : KIND) { auto rank{static_cast(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()}; for (A x : data) { StoreElement(p, x, elemLen); p += elemLen; } return result; } } // namespace Fortran::runtime #endif // FORTRAN_UNITTESTS_RUNTIME_TOOLS_H_