From 5590cc29c32807ea50839dc28e07abe11bf8f428 Mon Sep 17 00:00:00 2001 From: Alexis Placet <2400067+Alex-PLACET@users.noreply.github.com> Date: Wed, 29 Apr 2026 09:19:59 +0200 Subject: [PATCH 1/2] Enhance xmasked_view support for output streaming --- include/xtensor/io/xio.hpp | 14 ++++++++++++-- test/test_xmasked_view.cpp | 17 +++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/include/xtensor/io/xio.hpp b/include/xtensor/io/xio.hpp index fbc0cd3a0..2f31f9703 100644 --- a/include/xtensor/io/xio.hpp +++ b/include/xtensor/io/xio.hpp @@ -17,6 +17,8 @@ #include #include +#include "xtl/xmasked_value_meta.hpp" + #include "../core/xexpression.hpp" #include "../core/xmath.hpp" #include "../views/xstrided_view.hpp" @@ -615,7 +617,8 @@ namespace xt struct printer< T, std::enable_if_t< - !xtl::is_fundamental::value && !xtl::is_complex::value>> + !xtl::is_fundamental::value + && !xtl::is_complex::value>> { using const_reference = typename T::const_reference; using value_type = std::decay_t; @@ -646,7 +649,14 @@ namespace xt void update(const_reference val) { std::stringstream buf; - buf << val; + if constexpr (xtl::is_xmasked_value::value) + { + buf << +val; + } + else + { + buf << val; + } std::string s = buf.str(); if (int(s.size()) > m_width) { diff --git a/test/test_xmasked_view.cpp b/test/test_xmasked_view.cpp index 14613d169..1c7f9cb4d 100644 --- a/test/test_xmasked_view.cpp +++ b/test/test_xmasked_view.cpp @@ -7,6 +7,8 @@ * The full license is in the file LICENSE, distributed with this software. * ****************************************************************************/ +#include + #include "xtensor/io/xio.hpp" #include "xtensor/optional/xoptional_assembly.hpp" #include "xtensor/views/xmasked_view.hpp" @@ -210,6 +212,21 @@ namespace xt EXPECT_EQ(data, expected2); } + TEST(xmasked_view, non_optional_data_stream) + { + const xarray data = {{1., 5., 3.}, {4., 5., 6.}}; + const xarray mask = {{true, false, false}, {false, true, false}}; + + const auto masked_data = masked_view(data, mask); + + std::stringstream out; + out << masked_data; + + const std::string expected = "{{ 1, masked, masked},\n" + " {masked, 5, masked}}"; + EXPECT_EQ(out.str(), expected); + } + TEST(xmasked_view, assign) { xarray data = {{1., -2., 3.}, {4., 5., -6.}, {7., 8., -9.}}; From c823a3fa4300bf1c3f390be91c475e5c1cd8c995 Mon Sep 17 00:00:00 2001 From: Alexis Placet <2400067+Alex-PLACET@users.noreply.github.com> Date: Wed, 29 Apr 2026 09:23:51 +0200 Subject: [PATCH 2/2] formatting --- include/xtensor/io/xio.hpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/include/xtensor/io/xio.hpp b/include/xtensor/io/xio.hpp index 2f31f9703..09ee4da58 100644 --- a/include/xtensor/io/xio.hpp +++ b/include/xtensor/io/xio.hpp @@ -17,11 +17,10 @@ #include #include -#include "xtl/xmasked_value_meta.hpp" - #include "../core/xexpression.hpp" #include "../core/xmath.hpp" #include "../views/xstrided_view.hpp" +#include "xtl/xmasked_value_meta.hpp" namespace xt { @@ -617,8 +616,7 @@ namespace xt struct printer< T, std::enable_if_t< - !xtl::is_fundamental::value - && !xtl::is_complex::value>> + !xtl::is_fundamental::value && !xtl::is_complex::value>> { using const_reference = typename T::const_reference; using value_type = std::decay_t;