Skip to content

Commit fb465de

Browse files
committed
Add PrintTo utility for mdspan printing in GoogleTest, and print in match
1 parent 4e57bde commit fb465de

File tree

1 file changed

+15
-2
lines changed

1 file changed

+15
-2
lines changed

cpp/test/util.hpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ template <class... Args> static constexpr bool is_mdspan_v<stdex::mdspan<Args...
7070

7171
MATCHER_P3(MdspanElementsAllClose, vals, rel_tol, abs_tol,
7272
"Elements within " + PrintToString(abs_tol) + " (abs) and " + PrintToString(rel_tol) +
73-
" (rel)") {
73+
" (rel) of \n" + PrintToString(vals)) {
7474
static_assert(is_mdspan_v<std::decay_t<decltype(vals)>> &&
7575
is_mdspan_v<std::decay_t<decltype(arg)>>,
7676
"ElementsAllClose only works with mdspan");
@@ -113,4 +113,17 @@ MATCHER_P3(MdspanElementsAllClose, vals, rel_tol, abs_tol,
113113

114114
template <class V, class R> auto MdspanElementsAllClose(V &&vals, R &&rel_tol) {
115115
return MdspanElementsAllClose(std::forward<V>(vals), std::forward<R>(rel_tol), 0.0);
116-
}
116+
}
117+
118+
namespace std::experimental {
119+
/// This function provides an overload to GoogleTest for printing an mdspan.
120+
/// It will always print at the highest precision (16 for double).
121+
/// It must be in the same namespace as mdspan.
122+
/// This overload is only instantiated if an ostream operator<< for mdspan exists.
123+
template <typename T, typename Extents, typename Layout, typename Accessor>
124+
requires requires(mdspan<T, Extents, Layout, Accessor> const &m, std::ostream &o) { o << m; }
125+
void PrintTo(mdspan<T, Extents, Layout, Accessor> const &m, ::std::ostream *os) {
126+
*os << std::setprecision(16) << m;
127+
}
128+
129+
} // namespace std::experimental

0 commit comments

Comments
 (0)