@@ -70,7 +70,7 @@ template <class... Args> static constexpr bool is_mdspan_v<stdex::mdspan<Args...
70
70
71
71
MATCHER_P3 (MdspanElementsAllClose, vals, rel_tol, abs_tol,
72
72
" Elements within " + PrintToString(abs_tol) + " (abs) and " + PrintToString(rel_tol) +
73
- " (rel)" ) {
73
+ " (rel) of \n" + PrintToString(vals) ) {
74
74
static_assert (is_mdspan_v<std::decay_t <decltype (vals)>> &&
75
75
is_mdspan_v<std::decay_t <decltype (arg)>>,
76
76
" ElementsAllClose only works with mdspan" );
@@ -113,4 +113,17 @@ MATCHER_P3(MdspanElementsAllClose, vals, rel_tol, abs_tol,
113
113
114
114
template <class V , class R > auto MdspanElementsAllClose (V &&vals, R &&rel_tol) {
115
115
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