[libcxx-commits] [libcxx] [libc++] Eliminate extra allocations from `std::move(oss).str()` (PR #67294)
via libcxx-commits
libcxx-commits at lists.llvm.org
Mon Sep 25 01:41:31 PDT 2023
github-actions[bot] wrote:
<!--LLVM CODE FORMAT COMMENT: {clang-format}-->
:warning: C/C++ code formatter, clang-format found issues in your code. :warning:
<details>
<summary>
You can test this locally with the following command:
</summary>
``````````bash
git-clang-format --diff 8545093715c4efcfe7069aa29e9372d32f9c7b36 1318cf5c07ce9edb9031314badd06d5414cc1355 -- libcxx/test/std/input.output/string.streams/istringstream/istringstream.members/str.allocator_propagation.pass.cpp libcxx/test/std/input.output/string.streams/ostringstream/ostringstream.members/str.allocator_propagation.pass.cpp libcxx/test/std/input.output/string.streams/stringstream/stringstream.members/str.allocator_propagation.pass.cpp libcxx/test/std/input.output/string.streams/istringstream/istringstream.members/str.move.pass.cpp libcxx/test/std/input.output/string.streams/ostringstream/ostringstream.members/str.move.pass.cpp libcxx/test/std/input.output/string.streams/stringbuf/stringbuf.members/str.move.pass.cpp libcxx/test/std/input.output/string.streams/stringbuf/stringbuf.members/str.pass.cpp libcxx/test/std/input.output/string.streams/stringbuf/stringbuf.members/view.pass.cpp libcxx/test/std/input.output/string.streams/stringstream/stringstream.members/str.move.pass.cpp
``````````
</details>
<details>
<summary>
View the diff from clang-format here.
</summary>
``````````diff
diff --git a/libcxx/test/std/input.output/string.streams/istringstream/istringstream.members/str.allocator_propagation.pass.cpp b/libcxx/test/std/input.output/string.streams/istringstream/istringstream.members/str.allocator_propagation.pass.cpp
index 28cc2216bc23..26043215d19a 100644
--- a/libcxx/test/std/input.output/string.streams/istringstream/istringstream.members/str.allocator_propagation.pass.cpp
+++ b/libcxx/test/std/input.output/string.streams/istringstream/istringstream.members/str.allocator_propagation.pass.cpp
@@ -33,29 +33,26 @@ struct SocccAllocator {
int count_ = 0;
explicit SocccAllocator(int i) : count_(i) {}
- template<class U>
+ template <class U>
SocccAllocator(const SocccAllocator<U>& a) : count_(a.count_) {}
T* allocate(std::size_t n) { return std::allocator<T>().allocate(n); }
void deallocate(T* p, std::size_t n) { std::allocator<T>().deallocate(p, n); }
- SocccAllocator select_on_container_copy_construction() const {
- return SocccAllocator(count_ + 1);
- }
+ SocccAllocator select_on_container_copy_construction() const { return SocccAllocator(count_ + 1); }
bool operator==(const SocccAllocator&) const { return true; }
using propagate_on_container_copy_assignment = std::false_type;
using propagate_on_container_move_assignment = std::false_type;
- using propagate_on_container_swap = std::false_type;
+ using propagate_on_container_swap = std::false_type;
};
template <class CharT>
-void test_soccc_behavior()
-{
+void test_soccc_behavior() {
using Alloc = SocccAllocator<CharT>;
- using SS = std::basic_istringstream<CharT, std::char_traits<CharT>, Alloc>;
- using S = std::basic_string<CharT, std::char_traits<CharT>, Alloc>;
+ using SS = std::basic_istringstream<CharT, std::char_traits<CharT>, Alloc>;
+ using S = std::basic_string<CharT, std::char_traits<CharT>, Alloc>;
{
SS ss = SS(std::ios_base::in, Alloc(10));
@@ -68,7 +65,7 @@ void test_soccc_behavior()
assert(copied.empty());
assert(S(copied).get_allocator().count_ == 11);
- // sanity-check that SOCCC does in fact work
+ // sanity-check that SOCCC does in fact work
// [stringbuf.members]/10 doesn't specify the allocator to use,
// but copying the allocator as-if-by moving the string makes sense.
@@ -80,11 +77,12 @@ void test_soccc_behavior()
}
}
-template<class CharT, class Base = std::basic_stringbuf<CharT, std::char_traits<CharT>, std::pmr::polymorphic_allocator<CharT>>>
+template <class CharT,
+ class Base = std::basic_stringbuf<CharT, std::char_traits<CharT>, std::pmr::polymorphic_allocator<CharT>>>
struct StringBuf : Base {
- explicit StringBuf(std::pmr::memory_resource *mr) : Base(std::ios_base::in, mr) {}
+ explicit StringBuf(std::pmr::memory_resource* mr) : Base(std::ios_base::in, mr) {}
void public_setg(int a, int b, int c) {
- CharT *p = this->eback();
+ CharT* p = this->eback();
assert(this->view().data() == p);
this->setg(p + a, p + b, p + c);
assert(this->eback() == p + a);
@@ -95,14 +93,15 @@ struct StringBuf : Base {
template <class CharT>
void test_allocation_is_pilfered() {
using SS = std::basic_istringstream<CharT, std::char_traits<CharT>, std::pmr::polymorphic_allocator<CharT>>;
- using S = std::pmr::basic_string<CharT>;
+ using S = std::pmr::basic_string<CharT>;
alignas(void*) char buf[80 * sizeof(CharT)];
- const CharT *initial = MAKE_CSTRING(CharT, "a very long string that exceeds the small string optimization buffer length");
+ const CharT* initial =
+ MAKE_CSTRING(CharT, "a very long string that exceeds the small string optimization buffer length");
{
std::pmr::set_default_resource(std::pmr::null_memory_resource());
auto mr1 = std::pmr::monotonic_buffer_resource(buf, sizeof(buf), std::pmr::null_memory_resource());
- SS ss = SS(S(initial, &mr1));
- S s = std::move(ss).str();
+ SS ss = SS(S(initial, &mr1));
+ S s = std::move(ss).str();
assert(s == initial);
}
{
@@ -125,12 +124,13 @@ void test_allocation_is_pilfered() {
template <class CharT>
void test_no_foreign_allocations() {
using SS = std::basic_istringstream<CharT, std::char_traits<CharT>, std::pmr::polymorphic_allocator<CharT>>;
- using S = std::pmr::basic_string<CharT>;
- const CharT *initial = MAKE_CSTRING(CharT, "a very long string that exceeds the small string optimization buffer length");
+ using S = std::pmr::basic_string<CharT>;
+ const CharT* initial =
+ MAKE_CSTRING(CharT, "a very long string that exceeds the small string optimization buffer length");
{
std::pmr::set_default_resource(std::pmr::null_memory_resource());
auto mr1 = std::pmr::monotonic_buffer_resource(std::pmr::new_delete_resource());
- auto ss = SS(S(initial, &mr1));
+ auto ss = SS(S(initial, &mr1));
assert(ss.rdbuf()->get_allocator().resource() == &mr1);
// [stringbuf.members]/6 specifies that the result of `str() const &`
diff --git a/libcxx/test/std/input.output/string.streams/istringstream/istringstream.members/str.move.pass.cpp b/libcxx/test/std/input.output/string.streams/istringstream/istringstream.members/str.move.pass.cpp
index fb26fcff2655..0bd076af5e9c 100644
--- a/libcxx/test/std/input.output/string.streams/istringstream/istringstream.members/str.move.pass.cpp
+++ b/libcxx/test/std/input.output/string.streams/istringstream/istringstream.members/str.move.pass.cpp
@@ -38,8 +38,9 @@ static void test() {
assert(ss.view().empty());
}
{
- std::basic_istringstream<CharT> ss(STR("a very long string that exceeds the small string optimization buffer length"));
- const CharT *p = ss.view().data();
+ std::basic_istringstream<CharT> ss(
+ STR("a very long string that exceeds the small string optimization buffer length"));
+ const CharT* p = ss.view().data();
std::basic_string<CharT> s = std::move(ss).str();
assert(s.data() == p); // the allocation was pilfered
assert(ss.view().empty());
diff --git a/libcxx/test/std/input.output/string.streams/ostringstream/ostringstream.members/str.allocator_propagation.pass.cpp b/libcxx/test/std/input.output/string.streams/ostringstream/ostringstream.members/str.allocator_propagation.pass.cpp
index 2bc1abe57175..4f0308cdd63e 100644
--- a/libcxx/test/std/input.output/string.streams/ostringstream/ostringstream.members/str.allocator_propagation.pass.cpp
+++ b/libcxx/test/std/input.output/string.streams/ostringstream/ostringstream.members/str.allocator_propagation.pass.cpp
@@ -32,29 +32,26 @@ struct SocccAllocator {
int count_ = 0;
explicit SocccAllocator(int i) : count_(i) {}
- template<class U>
+ template <class U>
SocccAllocator(const SocccAllocator<U>& a) : count_(a.count_) {}
T* allocate(std::size_t n) { return std::allocator<T>().allocate(n); }
void deallocate(T* p, std::size_t n) { std::allocator<T>().deallocate(p, n); }
- SocccAllocator select_on_container_copy_construction() const {
- return SocccAllocator(count_ + 1);
- }
+ SocccAllocator select_on_container_copy_construction() const { return SocccAllocator(count_ + 1); }
bool operator==(const SocccAllocator&) const { return true; }
using propagate_on_container_copy_assignment = std::false_type;
using propagate_on_container_move_assignment = std::false_type;
- using propagate_on_container_swap = std::false_type;
+ using propagate_on_container_swap = std::false_type;
};
template <class CharT>
-void test_soccc_behavior()
-{
+void test_soccc_behavior() {
using Alloc = SocccAllocator<CharT>;
- using SS = std::basic_ostringstream<CharT, std::char_traits<CharT>, Alloc>;
- using S = std::basic_string<CharT, std::char_traits<CharT>, Alloc>;
+ using SS = std::basic_ostringstream<CharT, std::char_traits<CharT>, Alloc>;
+ using S = std::basic_string<CharT, std::char_traits<CharT>, Alloc>;
{
SS ss = SS(std::ios_base::out, Alloc(10));
@@ -67,7 +64,7 @@ void test_soccc_behavior()
assert(copied.empty());
assert(S(copied).get_allocator().count_ == 11);
- // sanity-check that SOCCC does in fact work
+ // sanity-check that SOCCC does in fact work
// [stringbuf.members]/10 doesn't specify the allocator to use,
// but copying the allocator as-if-by moving the string makes sense.
@@ -82,14 +79,15 @@ void test_soccc_behavior()
template <class CharT>
void test_allocation_is_pilfered() {
using SS = std::basic_ostringstream<CharT, std::char_traits<CharT>, std::pmr::polymorphic_allocator<CharT>>;
- using S = std::pmr::basic_string<CharT>;
+ using S = std::pmr::basic_string<CharT>;
alignas(void*) char buf[80 * sizeof(CharT)];
- const CharT *initial = MAKE_CSTRING(CharT, "a very long string that exceeds the small string optimization buffer length");
+ const CharT* initial =
+ MAKE_CSTRING(CharT, "a very long string that exceeds the small string optimization buffer length");
{
std::pmr::set_default_resource(std::pmr::null_memory_resource());
auto mr1 = std::pmr::monotonic_buffer_resource(buf, sizeof(buf), std::pmr::null_memory_resource());
- SS ss = SS(S(initial, &mr1));
- S s = std::move(ss).str();
+ SS ss = SS(S(initial, &mr1));
+ S s = std::move(ss).str();
assert(s == initial);
}
}
@@ -97,12 +95,13 @@ void test_allocation_is_pilfered() {
template <class CharT>
void test_no_foreign_allocations() {
using SS = std::basic_ostringstream<CharT, std::char_traits<CharT>, std::pmr::polymorphic_allocator<CharT>>;
- using S = std::pmr::basic_string<CharT>;
- const CharT *initial = MAKE_CSTRING(CharT, "a very long string that exceeds the small string optimization buffer length");
+ using S = std::pmr::basic_string<CharT>;
+ const CharT* initial =
+ MAKE_CSTRING(CharT, "a very long string that exceeds the small string optimization buffer length");
{
std::pmr::set_default_resource(std::pmr::null_memory_resource());
auto mr1 = std::pmr::monotonic_buffer_resource(std::pmr::new_delete_resource());
- auto ss = SS(S(initial, &mr1));
+ auto ss = SS(S(initial, &mr1));
assert(ss.rdbuf()->get_allocator().resource() == &mr1);
// [stringbuf.members]/6 specifies that the result of `str() const &`
diff --git a/libcxx/test/std/input.output/string.streams/ostringstream/ostringstream.members/str.move.pass.cpp b/libcxx/test/std/input.output/string.streams/ostringstream/ostringstream.members/str.move.pass.cpp
index c51aeef4eae1..0e1c06f19193 100644
--- a/libcxx/test/std/input.output/string.streams/ostringstream/ostringstream.members/str.move.pass.cpp
+++ b/libcxx/test/std/input.output/string.streams/ostringstream/ostringstream.members/str.move.pass.cpp
@@ -38,8 +38,9 @@ static void test() {
assert(ss.view().empty());
}
{
- std::basic_ostringstream<CharT> ss(STR("a very long string that exceeds the small string optimization buffer length"));
- const CharT *p = ss.view().data();
+ std::basic_ostringstream<CharT> ss(
+ STR("a very long string that exceeds the small string optimization buffer length"));
+ const CharT* p = ss.view().data();
std::basic_string<CharT> s = std::move(ss).str();
assert(s.data() == p); // the allocation was pilfered
assert(ss.view().empty());
diff --git a/libcxx/test/std/input.output/string.streams/stringbuf/stringbuf.members/str.move.pass.cpp b/libcxx/test/std/input.output/string.streams/stringbuf/stringbuf.members/str.move.pass.cpp
index 26c97045bdfe..9d75bf938ad7 100644
--- a/libcxx/test/std/input.output/string.streams/stringbuf/stringbuf.members/str.move.pass.cpp
+++ b/libcxx/test/std/input.output/string.streams/stringbuf/stringbuf.members/str.move.pass.cpp
@@ -39,7 +39,7 @@ static void test() {
}
{
std::basic_stringbuf<CharT> buf(STR("a very long string that exceeds the small string optimization buffer length"));
- const CharT *p = buf.view().data();
+ const CharT* p = buf.view().data();
std::basic_string<CharT> s = std::move(buf).str();
assert(s.data() == p); // the allocation was pilfered
assert(buf.view().empty());
@@ -49,7 +49,7 @@ static void test() {
struct StringBuf : std::stringbuf {
using basic_stringbuf::basic_stringbuf;
void public_setg(int a, int b, int c) {
- char *p = eback();
+ char* p = eback();
this->setg(p + a, p + b, p + c);
}
};
@@ -59,9 +59,9 @@ static void test_altered_sequence_pointers() {
auto src = StringBuf("hello world", std::ios_base::in);
src.public_setg(4, 6, 9);
std::stringbuf dest;
- dest = std::move(src);
+ dest = std::move(src);
std::string view = std::string(dest.view());
- std::string str = std::move(dest).str();
+ std::string str = std::move(dest).str();
assert(view == str);
LIBCPP_ASSERT(str == "o wor");
assert(dest.str().empty());
@@ -73,7 +73,7 @@ static void test_altered_sequence_pointers() {
std::stringbuf dest;
dest.swap(src);
std::string view = std::string(dest.view());
- std::string str = std::move(dest).str();
+ std::string str = std::move(dest).str();
assert(view == str);
LIBCPP_ASSERT(str == "o wor");
assert(dest.str().empty());
diff --git a/libcxx/test/std/input.output/string.streams/stringbuf/stringbuf.members/str.pass.cpp b/libcxx/test/std/input.output/string.streams/stringbuf/stringbuf.members/str.pass.cpp
index 43f7894f0d79..16382457b1d2 100644
--- a/libcxx/test/std/input.output/string.streams/stringbuf/stringbuf.members/str.pass.cpp
+++ b/libcxx/test/std/input.output/string.streams/stringbuf/stringbuf.members/str.pass.cpp
@@ -20,10 +20,9 @@
#include "test_macros.h"
struct StringBuf : std::stringbuf {
- explicit StringBuf(const char *s, std::ios_base::openmode mode) :
- basic_stringbuf(s, mode) { }
+ explicit StringBuf(const char* s, std::ios_base::openmode mode) : basic_stringbuf(s, mode) {}
void public_setg(int a, int b, int c) {
- char *p = eback();
+ char* p = eback();
this->setg(p + a, p + b, p + c);
}
};
@@ -33,7 +32,7 @@ static void test_altered_sequence_pointers() {
StringBuf src("hello world", std::ios_base::in);
src.public_setg(4, 6, 9);
std::stringbuf dest;
- dest = std::move(src);
+ dest = std::move(src);
std::string str = dest.str();
assert(5 <= str.size() && str.size() <= 11);
LIBCPP_ASSERT(str == "o wor");
@@ -53,12 +52,12 @@ static void test_altered_sequence_pointers() {
int main(int, char**)
{
- test_altered_sequence_pointers();
- {
- std::stringbuf buf("testing");
- assert(buf.str() == "testing");
- buf.str("another test");
- assert(buf.str() == "another test");
+ test_altered_sequence_pointers();
+ {
+ std::stringbuf buf("testing");
+ assert(buf.str() == "testing");
+ buf.str("another test");
+ assert(buf.str() == "another test");
}
#ifndef TEST_HAS_NO_WIDE_CHARACTERS
{
diff --git a/libcxx/test/std/input.output/string.streams/stringbuf/stringbuf.members/view.pass.cpp b/libcxx/test/std/input.output/string.streams/stringbuf/stringbuf.members/view.pass.cpp
index d4b3e045ecbf..67ff506bb9dc 100644
--- a/libcxx/test/std/input.output/string.streams/stringbuf/stringbuf.members/view.pass.cpp
+++ b/libcxx/test/std/input.output/string.streams/stringbuf/stringbuf.members/view.pass.cpp
@@ -53,7 +53,7 @@ static void test() {
struct StringBuf : std::stringbuf {
using basic_stringbuf::basic_stringbuf;
void public_setg(int a, int b, int c) {
- char *p = eback();
+ char* p = eback();
this->setg(p + a, p + b, p + c);
}
};
diff --git a/libcxx/test/std/input.output/string.streams/stringstream/stringstream.members/str.allocator_propagation.pass.cpp b/libcxx/test/std/input.output/string.streams/stringstream/stringstream.members/str.allocator_propagation.pass.cpp
index e2e4f8028ec5..f63014d111bb 100644
--- a/libcxx/test/std/input.output/string.streams/stringstream/stringstream.members/str.allocator_propagation.pass.cpp
+++ b/libcxx/test/std/input.output/string.streams/stringstream/stringstream.members/str.allocator_propagation.pass.cpp
@@ -33,29 +33,26 @@ struct SocccAllocator {
int count_ = 0;
explicit SocccAllocator(int i) : count_(i) {}
- template<class U>
+ template <class U>
SocccAllocator(const SocccAllocator<U>& a) : count_(a.count_) {}
T* allocate(std::size_t n) { return std::allocator<T>().allocate(n); }
void deallocate(T* p, std::size_t n) { std::allocator<T>().deallocate(p, n); }
- SocccAllocator select_on_container_copy_construction() const {
- return SocccAllocator(count_ + 1);
- }
+ SocccAllocator select_on_container_copy_construction() const { return SocccAllocator(count_ + 1); }
bool operator==(const SocccAllocator&) const { return true; }
using propagate_on_container_copy_assignment = std::false_type;
using propagate_on_container_move_assignment = std::false_type;
- using propagate_on_container_swap = std::false_type;
+ using propagate_on_container_swap = std::false_type;
};
template <class CharT>
-void test_soccc_behavior()
-{
+void test_soccc_behavior() {
using Alloc = SocccAllocator<CharT>;
- using SS = std::basic_stringstream<CharT, std::char_traits<CharT>, Alloc>;
- using S = std::basic_string<CharT, std::char_traits<CharT>, Alloc>;
+ using SS = std::basic_stringstream<CharT, std::char_traits<CharT>, Alloc>;
+ using S = std::basic_string<CharT, std::char_traits<CharT>, Alloc>;
{
SS ss = SS(std::ios_base::out, Alloc(10));
@@ -68,7 +65,7 @@ void test_soccc_behavior()
assert(copied.empty());
assert(S(copied).get_allocator().count_ == 11);
- // sanity-check that SOCCC does in fact work
+ // sanity-check that SOCCC does in fact work
// [stringbuf.members]/10 doesn't specify the allocator to use,
// but copying the allocator as-if-by moving the string makes sense.
@@ -80,11 +77,12 @@ void test_soccc_behavior()
}
}
-template<class CharT, class Base = std::basic_stringbuf<CharT, std::char_traits<CharT>, std::pmr::polymorphic_allocator<CharT>>>
+template <class CharT,
+ class Base = std::basic_stringbuf<CharT, std::char_traits<CharT>, std::pmr::polymorphic_allocator<CharT>>>
struct StringBuf : Base {
- explicit StringBuf(std::pmr::memory_resource *mr) : Base(std::ios_base::in, mr) {}
+ explicit StringBuf(std::pmr::memory_resource* mr) : Base(std::ios_base::in, mr) {}
void public_setg(int a, int b, int c) {
- CharT *p = this->eback();
+ CharT* p = this->eback();
assert(this->view().data() == p);
this->setg(p + a, p + b, p + c);
assert(this->eback() == p + a);
@@ -95,14 +93,15 @@ struct StringBuf : Base {
template <class CharT>
void test_allocation_is_pilfered() {
using SS = std::basic_stringstream<CharT, std::char_traits<CharT>, std::pmr::polymorphic_allocator<CharT>>;
- using S = std::pmr::basic_string<CharT>;
+ using S = std::pmr::basic_string<CharT>;
alignas(void*) char buf[80 * sizeof(CharT)];
- const CharT *initial = MAKE_CSTRING(CharT, "a very long string that exceeds the small string optimization buffer length");
+ const CharT* initial =
+ MAKE_CSTRING(CharT, "a very long string that exceeds the small string optimization buffer length");
{
std::pmr::set_default_resource(std::pmr::null_memory_resource());
auto mr1 = std::pmr::monotonic_buffer_resource(buf, sizeof(buf), std::pmr::null_memory_resource());
- SS ss = SS(S(initial, &mr1));
- S s = std::move(ss).str();
+ SS ss = SS(S(initial, &mr1));
+ S s = std::move(ss).str();
assert(s == initial);
}
{
@@ -125,12 +124,13 @@ void test_allocation_is_pilfered() {
template <class CharT>
void test_no_foreign_allocations() {
using SS = std::basic_stringstream<CharT, std::char_traits<CharT>, std::pmr::polymorphic_allocator<CharT>>;
- using S = std::pmr::basic_string<CharT>;
- const CharT *initial = MAKE_CSTRING(CharT, "a very long string that exceeds the small string optimization buffer length");
+ using S = std::pmr::basic_string<CharT>;
+ const CharT* initial =
+ MAKE_CSTRING(CharT, "a very long string that exceeds the small string optimization buffer length");
{
std::pmr::set_default_resource(std::pmr::null_memory_resource());
auto mr1 = std::pmr::monotonic_buffer_resource(std::pmr::new_delete_resource());
- auto ss = SS(S(initial, &mr1));
+ auto ss = SS(S(initial, &mr1));
assert(ss.rdbuf()->get_allocator().resource() == &mr1);
// [stringbuf.members]/6 specifies that the result of `str() const &`
diff --git a/libcxx/test/std/input.output/string.streams/stringstream/stringstream.members/str.move.pass.cpp b/libcxx/test/std/input.output/string.streams/stringstream/stringstream.members/str.move.pass.cpp
index 3ce3587c001e..56a0d84fb68e 100644
--- a/libcxx/test/std/input.output/string.streams/stringstream/stringstream.members/str.move.pass.cpp
+++ b/libcxx/test/std/input.output/string.streams/stringstream/stringstream.members/str.move.pass.cpp
@@ -38,8 +38,9 @@ static void test() {
assert(ss.view().empty());
}
{
- std::basic_stringstream<CharT> ss(STR("a very long string that exceeds the small string optimization buffer length"));
- const CharT *p = ss.view().data();
+ std::basic_stringstream<CharT> ss(
+ STR("a very long string that exceeds the small string optimization buffer length"));
+ const CharT* p = ss.view().data();
std::basic_string<CharT> s = std::move(ss).str();
assert(s.data() == p); // the allocation was pilfered
assert(ss.view().empty());
``````````
</details>
https://github.com/llvm/llvm-project/pull/67294
More information about the libcxx-commits
mailing list