// { dg-options "-std=gnu++23" } // { dg-do run { target c++23 } } #include #include using std::ispanstream; using std::ospanstream; using std::span; void test_move() { char c; { const char str[] = "chars"; std::ispanstream a(str); std::ispanstream b = std::move(a); VERIFY( b.span().data() == str && b.span().size() == 6 ); VERIFY( b >> c ); VERIFY( c == 'c' ); a = std::move(b); VERIFY( a.span().data() == str && a.span().size() == 6 ); VERIFY( a >> c >> c ); VERIFY( c == 'a' ); } { char buf[10] = {}; std::ospanstream a(buf); std::ospanstream b = std::move(a); VERIFY( b << 'c' ); VERIFY( buf[0] == 'c' ); VERIFY( !std::char_traits::compare(buf, "c", 2) ); a = std::move(b); VERIFY( a << 'h' << 'a' << "rs" ); VERIFY( !std::char_traits::compare(buf, "chars", 6) ); } { char buf[10] = {}; std::spanstream a(buf); std::spanstream b = std::move(a); VERIFY( b.span().empty() ); VERIFY( b << 'c' ); VERIFY( buf[0] == 'c' ); VERIFY( !std::char_traits::compare(buf, "c", 2) ); VERIFY( b.span().data() == buf && b.span().size() == 1 ); VERIFY( b >> c ); VERIFY( c == 'c' ); a = std::move(b); VERIFY( a.span().data() == buf && a.span().size() == 1 ); VERIFY( a << 'h' << 'a' << "rs" ); VERIFY( !std::char_traits::compare(buf, "chars", 6) ); VERIFY( a.span().data() == buf && a.span().size() == 5 ); } } void test_swap() { { const char str1[] = "chars"; const char str2[] = "STRING"; std::ispanstream a(str1); std::ispanstream b(str2); a.swap(b); VERIFY( a.span().data() == str2 && a.span().size() == 7 ); VERIFY( b.span().data() == str1 && b.span().size() == 6 ); char c; VERIFY( a >> c ); VERIFY( c == 'S' ); VERIFY( b >> c ); VERIFY( c == 'c' ); swap(a, b); VERIFY( a.span().data() == str1 && a.span().size() == 6 ); VERIFY( b.span().data() == str2 && b.span().size() == 7 ); VERIFY( a >> c >> c ); VERIFY( c == 'a' ); VERIFY( b >> c >> c ); VERIFY( c == 'R' ); } { char buf1[] = "xxxxxxxxxxxxxxx"; char buf2[] = "xxxxxxxxxxxxxxx"; std::ospanstream a(buf1); std::ospanstream b(buf2); a.swap(b); VERIFY( a << "STR" ); VERIFY( !std::char_traits::compare(buf2, "STRx", 4) ); VERIFY( b << 'c' << 'h' ); VERIFY( !std::char_traits::compare(buf1, "chx", 3) ); swap(a, b); VERIFY( a.span().size() == 2 ); VERIFY( b.span().size() == 3 ); VERIFY( a << 'a' << "rs" ); VERIFY( !std::char_traits::compare(buf1, "charsx", 6) ); VERIFY( b << "IN" << 'G' ); VERIFY( !std::char_traits::compare(buf2, "STRINGx", 7) ); } } int main() { test_move(); test_swap(); }