DDC 0.11.0
Loading...
Searching...
No Matches
print.cpp
1// Copyright (C) The DDC development team, see COPYRIGHT.md file
2//
3// SPDX-License-Identifier: MIT
4
5#include <cstdlib>
6#include <memory>
7#include <ostream>
8
9#include <Kokkos_Macros.hpp>
10
12#include "print.hpp"
13
14#if defined(KOKKOS_COMPILER_GNU) || defined(KOKKOS_COMPILER_CLANG)
15# include <cxxabi.h>
16#endif
17
18namespace ddc::detail {
19
20void print_demangled_type_name(std::ostream& os, char const* const mangled_name)
21{
22#if defined(KOKKOS_COMPILER_GNU) || defined(KOKKOS_COMPILER_CLANG)
23 int status;
24
25 std::unique_ptr<char, decltype(std::free)*> const
26 demangled_name(abi::__cxa_demangle(mangled_name, nullptr, nullptr, &status), std::free);
27 if (status != 0) {
28 os << "Error demangling dimension name: " << status;
29 return;
30 }
31
32 os << demangled_name.get();
33#else
34 os << mangled_name;
35#endif
36}
37
38void print_single_dim_name(
39 std::ostream& os,
40 char const* const dim,
41 DiscreteVectorElement const size)
42{
43 print_demangled_type_name(os, dim);
44 os << '(' << size << ')';
45}
46
47void print_dim_name(
48 std::ostream& os,
49 char const* const* const dims,
50 DiscreteVectorElement const* const sizes,
51 std::size_t const n)
52{
53 if (n == 0) {
54 os << "Scalar";
55 } else {
56 print_single_dim_name(os, dims[0], sizes[0]);
57 for (std::size_t i = 1; i < n; ++i) {
58 os << "×";
59 print_single_dim_name(os, dims[i], sizes[i]);
60 }
61 }
62}
63
64} // namespace ddc::detail
The top-level namespace of DDC.