#ifndef MEDUSA_BITS_OPERATORS_PRINTSHAPES_HPP_ #define MEDUSA_BITS_OPERATORS_PRINTSHAPES_HPP_ /** * @file * Suppport functions for shape printing. */ #include "shape_flags.hpp" #include #include namespace mm { namespace shapes_internal { /// @cond // recursive case template struct name_printer { static void print(std::ostream& os) { name_printer::print(os); os << ", " << std::tuple_element::type::name(); } }; // base case 1 element template struct name_printer { static void print(std::ostream& os) { os << std::tuple_element<0, OpFamilies>::type::name(); } }; // base case 0 element template struct name_printer { static void print(std::ostream& os) { os << "()"; } }; // recursive case template struct shape_printer { static void print(std::ostream& os, const shape_storage_t& storage) { shape_printer::print(os, storage); int N = std::min(storage.size(), 5); using el = typename std::tuple_element< op-1, typename shape_storage_t::op_families_tuple>::type; os << " " << el::type_name() << " (family #" << op-1 << ") shape sample:\n"; for (int c = 0; c < el::size(); ++c) { os << " Operator #" << c << ":\n"; for (int i = 0; i < N; ++i) { os << " node " << i << ":"; for (int j = 0; j < storage.supportSize(i); ++j) { os << " " << storage.template get(c, i, j); } os << '\n'; } } } }; // base case template struct shape_printer { static void print(std::ostream&, const shape_storage_t&) {} }; /// @endcond /// Output basic info about given shape storage to `os`. template std::ostream& printShapes(const shape_storage_t& storage, std::ostream& os) { os << " dimension: " << storage.dim << '\n' << " domain size: " << storage.size() << '\n' << " operator families = "; name_printer::print(os); os << "\n"; shape_printer::print(os, storage); std::size_t memory_used = storage.memoryUsed(); os << " mem used total: " << mem2str(memory_used); return os; } } // namespace shapes_internal } // namespace mm #endif // MEDUSA_BITS_OPERATORS_PRINTSHAPES_HPP_