mirror of
https://github.com/esp8266/Arduino.git
synced 2025-07-27 18:02:17 +03:00
WString: direct operator overloads instead of StringSumHelper (#7781)
* wip
* huh, turns out String = 'c' did some weird stuff
* style
* allow "blah" + String, 'c' + String and F("...") + String
also, simplify const char* vs. __FlashStringHelper, and just always use _P functions
* shuffle things into .cpp
* trying to fix arduinojson
based on the implementation, we only need to specify that this symbol is a class
* fix accidental realloc, add test for operator+
basic chaining should work just like with master
comparing std::move() buffers won't work though, because we never allow
anything but `const StringSumHelper&` references
* fixup! fix accidental realloc, add test for operator+
* don't need another branch
* template +=(String / char* / numbers) and +(String, numbers / char*)
* nul after moving (isnt mem always zeroed tho?)
* check if lhs cant keep before switching to rhs
* fix String used to store struct data
`cannot bind bit-field '...' to 'signed char&'
`cannot bind bit-field '...' to 'unssigned char&'
noticed in both tasmota and espeasy, where this generates a webpage
content from some status struct containing bitfields
* style once more
* typo
* recover 444002180b
This commit is contained in:
@ -555,3 +555,42 @@ TEST_CASE("Replace and string expansion", "[core][String]")
|
||||
REQUIRE(l.length() == strlen(buff));
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("String chaining", "[core][String]")
|
||||
{
|
||||
const char* chunks[] {
|
||||
"~12345",
|
||||
"67890",
|
||||
"qwertyuiopasdfghjkl",
|
||||
"zxcvbnm"
|
||||
};
|
||||
|
||||
String all;
|
||||
for (auto* chunk : chunks) {
|
||||
all += chunk;
|
||||
}
|
||||
|
||||
// make sure we can chain a combination of things to form a String
|
||||
REQUIRE((String(chunks[0]) + String(chunks[1]) + String(chunks[2]) + String(chunks[3])) == all);
|
||||
REQUIRE((chunks[0] + String(chunks[1]) + F(chunks[2]) + chunks[3]) == all);
|
||||
REQUIRE((String(chunks[0]) + F(chunks[1]) + F(chunks[2]) + String(chunks[3])) == all);
|
||||
REQUIRE(('~' + String(&chunks[0][0] + 1) + chunks[1] + String(chunks[2]) + F(chunks[3])) == all);
|
||||
REQUIRE((String(chunks[0]) + '6' + (&chunks[1][0] + 1) + String(chunks[2]) + F(chunks[3])) == all);
|
||||
|
||||
// these are still invalid (and also cannot compile at all):
|
||||
// - `F(...)` + `F(...)`
|
||||
// - `F(...)` + `const char*`
|
||||
// - `const char*` + `F(...)`
|
||||
// we need `String()` as either rhs or lhs
|
||||
|
||||
// ensure chaining reuses the buffer
|
||||
// (internal details...)
|
||||
{
|
||||
String tmp(chunks[3]);
|
||||
tmp.reserve(2 * all.length());
|
||||
auto* ptr = tmp.c_str();
|
||||
String result("~1" + String(&chunks[0][0] + 2) + F(chunks[1]) + chunks[2] + std::move(tmp));
|
||||
REQUIRE(result == all);
|
||||
REQUIRE(static_cast<const void*>(result.c_str()) == static_cast<const void*>(ptr));
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user