| //===-- flang/unittests/RuntimeGTest/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_ |