[libcxx-commits] [libcxx] [libc++][sstream] P2495R3: Interfacing `stringstream`s with `string_view` (PR #80552)

Mark de Wever via libcxx-commits libcxx-commits at lists.llvm.org
Sun Feb 18 03:38:52 PST 2024


================
@@ -0,0 +1,174 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23
+
+// <sstream>
+
+// template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT>>
+// class basic_stringstream
+
+// template<class T>
+//   basic_istringstream(const T& t, const Allocator& a);
+
+#include <cassert>
+#include <concepts>
+#include <sstream>
+#include <string>
+#include <string_view>
+
+#include "constexpr_char_traits.h"
+#include "make_string.h"
+#include "nasty_string.h"
+#include "test_allocator.h"
+#include "test_convertible.h"
+#include "test_macros.h"
+
+#include "../../types.h"
+
+template <typename CharT>
+void test_sfinae() {
+  using SSTREAM  = std::basic_istringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>>;
+  using CSSTREAM = std::basic_istringstream<CharT, constexpr_char_traits<CharT>, test_allocator<CharT>>;
+
+  // `CharT*`
+  static_assert(std::constructible_from<SSTREAM, CharT*, const test_allocator<CharT>>);
+  static_assert(test_convertible<SSTREAM, CharT*, const test_allocator<CharT>>());
+
+  static_assert(std::constructible_from<CSSTREAM, CharT*, const test_allocator<CharT>>);
+  static_assert(test_convertible<CSSTREAM, CharT*, const test_allocator<CharT>>());
+
+  // `const CharT*`
+  static_assert(std::constructible_from<SSTREAM, const CharT*, const test_allocator<CharT>>);
+  static_assert(test_convertible<SSTREAM, const CharT*, const test_allocator<CharT>>());
+
+  static_assert(std::constructible_from<CSSTREAM, const CharT*, const test_allocator<CharT>>);
+  static_assert(test_convertible<CSSTREAM, const CharT*, const test_allocator<CharT>>());
+
+  // `std::basic_string_view<CharT>`
+  static_assert(std::constructible_from<SSTREAM, const std::basic_string_view<CharT>, const test_allocator<CharT>>);
+  static_assert(test_convertible<SSTREAM, std::basic_string_view<CharT>, const test_allocator<CharT>>());
+
+  static_assert(std::constructible_from<CSSTREAM,
+                                        const std::basic_string_view<CharT, constexpr_char_traits<CharT>>,
+                                        const test_allocator<CharT>>);
+  static_assert(test_convertible<CSSTREAM,
+                                 std::basic_string_view<CharT, constexpr_char_traits<CharT>>,
+                                 const test_allocator<CharT>>());
+
+  // `std::basic_string<CharT>`
+  static_assert(std::constructible_from<SSTREAM, const std::basic_string<CharT>, const test_allocator<CharT>>);
+  static_assert(test_convertible<SSTREAM, const std::basic_string<CharT>, const test_allocator<CharT>>());
+
+  static_assert(std::constructible_from<CSSTREAM,
+                                        const std::basic_string<CharT, constexpr_char_traits<CharT>>,
+                                        const test_allocator<CharT>>);
+  static_assert(test_convertible<CSSTREAM,
+                                 const std::basic_string<CharT, constexpr_char_traits<CharT>>,
+                                 const test_allocator<CharT>>());
+
+  // ConstConvertibleStringView<CharT>
+  static_assert(std::constructible_from<SSTREAM, const ConstConvertibleStringView<CharT>, const test_allocator<CharT>>);
+  static_assert(test_convertible<SSTREAM, const ConstConvertibleStringView<CharT>, const test_allocator<CharT>>());
+
+  static_assert(std::constructible_from<CSSTREAM,
+                                        const ConstConvertibleStringView<CharT, constexpr_char_traits<CharT>>,
+                                        const test_allocator<CharT>>);
+  static_assert(test_convertible<CSSTREAM,
+                                 const ConstConvertibleStringView<CharT, constexpr_char_traits<CharT>>,
+                                 const test_allocator<CharT>>());
+
+  // NonConstConvertibleStringView<CharT>
+  static_assert(!std::constructible_from<SSTREAM, NonConstConvertibleStringView<CharT>, const test_allocator<CharT>>);
+  static_assert(!test_convertible<SSTREAM, NonConstConvertibleStringView<CharT>, const test_allocator<CharT>>());
+
+  static_assert(
+      !std::constructible_from<SSTREAM, const NonConstConvertibleStringView<CharT>, const test_allocator<CharT>>);
+  static_assert(!test_convertible<SSTREAM, const NonConstConvertibleStringView<CharT>, const test_allocator<CharT>>());
+
+  static_assert(!std::constructible_from<CSSTREAM,
+                                         const NonConstConvertibleStringView<CharT, constexpr_char_traits<CharT>>,
+                                         const test_allocator<CharT>>);
+  static_assert(!test_convertible<CSSTREAM,
+                                  const NonConstConvertibleStringView<CharT, constexpr_char_traits<CharT>>,
+                                  const test_allocator<CharT>>());
+
+  static_assert(!std::constructible_from<CSSTREAM,
+                                         const NonConstConvertibleStringView<CharT, constexpr_char_traits<CharT>>,
+                                         const test_allocator<CharT>>);
+  static_assert(!test_convertible<CSSTREAM,
+                                  const NonConstConvertibleStringView<CharT, constexpr_char_traits<CharT>>,
+                                  const test_allocator<CharT>>());
+
+  // nasty_char*
+  using NSSTREAM = std::basic_istringstream<nasty_char, nasty_char_traits, test_allocator<nasty_char>>;
+
+  static_assert(std::constructible_from<NSSTREAM, nasty_char*, test_allocator<nasty_char>>);
+  static_assert(test_convertible<NSSTREAM, nasty_char*, const test_allocator<nasty_char>>());
+
+  // const nasty_char*
+  static_assert(std::constructible_from<NSSTREAM, const nasty_char*, test_allocator<nasty_char>>);
+  static_assert(test_convertible<NSSTREAM, const nasty_char*, const test_allocator<nasty_char>>());
+
+  // Non-`string-view-like`
+  static_assert(!std::constructible_from<SSTREAM, const SomeObject, const test_allocator<CharT>>);
+  static_assert(!test_convertible<SSTREAM, const SomeObject, const test_allocator<CharT>>());
+
+  // Non-allocator
+  static_assert(!std::constructible_from<SSTREAM, const std::basic_string_view<CharT>, const NonAllocator>);
+  static_assert(!test_convertible<SSTREAM, const std::basic_string_view<CharT>, const NonAllocator>());
+}
+
+#define CS(S) MAKE_CSTRING(CharT, S)
+#define ST(S) MAKE_STRING(CharT, S)
+#define SV(S) MAKE_STRING_VIEW(CharT, S)
+
+template <class CharT>
+static void test() {
+  using SSTREAM = std::basic_istringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>>;
+
+  const test_allocator<CharT> ca;
+
+  // const CharT*
+  {
+    SSTREAM ss(CS("zmt"), ca);
+    assert(ss.str() == CS("zmt"));
+    assert(ss.rdbuf()->get_allocator() == ca);
+  }
+  // std::basic_string_view<CharT>
+  {
+    const std::basic_string_view<CharT> csv = SV("zmt");
+    SSTREAM ss(csv, ca);
+    assert(ss.str() == CS("zmt"));
+    assert(ss.rdbuf()->get_allocator() == ca);
+  }
----------------
mordante wrote:

Can you add a similar test, but with different `char_traits`?

https://github.com/llvm/llvm-project/pull/80552


More information about the libcxx-commits mailing list