Add basic_format_arg constructor for ibasic_string (#1288)

* Allow string as format arg

* Remove AppVeyor build status badge

Removed AppVeyor build status badge from README.

* Update README.md

* Update CONTRIBUTING.md

Updated the instructions for contributing.

* Fix for issue 1276 "Data corruption in the etl::bip_buffer_spsc_atomic" (#1277)

* Reproduce data corruption bug in the `etl::bip_buffer_spsc_atomic`.

* Fix data corruption bug in the `etl::bip_buffer_spsc_atomic`.

* Added test string escaped

* Add temporary string test

---------

Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
Co-authored-by: Sergei <sergej.shirokov@gmail.com>
This commit is contained in:
Mike Bloom 2026-02-02 13:35:25 -05:00 committed by John Wellbelove
parent 75eb6680d6
commit e80623bc1a
2 changed files with 67 additions and 0 deletions

View File

@ -284,6 +284,11 @@ namespace etl
{
}
basic_format_arg(const etl::ibasic_string<char>& v)
: data(etl::string_view(v.data(), v.size()))
{
}
basic_format_arg(const basic_format_arg& other): data(other.data)
{
}

View File

@ -282,6 +282,68 @@ namespace
CHECK_EQUAL("\"data1\\n\"", test_format(s, "{:?}", sv));
}
//*************************************************************************
TEST(test_format_string)
{
etl::string<100> s;
etl::string<10> s_arg = "data1";
CHECK_EQUAL("data1", test_format(s, "{}", s_arg));
CHECK_EQUAL("data1", test_format(s, "{:s}", s_arg));
CHECK_THROW(test_format(s, "{:d}", s_arg), etl::bad_format_string_exception);
CHECK_EQUAL("data1 ", test_format(s, "{:10s}", s_arg));
CHECK_EQUAL("data1 ", test_format(s, "{:<10s}", s_arg));
CHECK_EQUAL(" data1", test_format(s, "{:>10s}", s_arg));
CHECK_EQUAL(" data1 ", test_format(s, "{:^10s}", s_arg));
CHECK_EQUAL("data1", test_format(s, "{:3}", s_arg));
CHECK_EQUAL("dat", test_format(s, "{:.3s}", s_arg));
CHECK_EQUAL("dat", test_format(s, "{:^.3s}", s_arg));
CHECK_EQUAL(". dat !", test_format(s, ".{:^8.3s}!", s_arg));
CHECK_EQUAL("^dat $", test_format(s, "^{:8.3s}$", s_arg));
}
//*************************************************************************
//this minimal derived class of etl::string is used to prove that the
//temporary lifetime is long enough for the format operation
template<size_t N>
class clearing_string : public etl::string<N>
{
public:
using etl::string<N>::string;
~clearing_string()
{
this->clear();
}
};
TEST(test_format_string_temporary)
{
etl::string<100> s;
const char* data = "data1";
using string_t = clearing_string<10>;
CHECK_EQUAL("data1", test_format(s, "{}", string_t(data)));
CHECK_EQUAL("data1", test_format(s, "{:s}", string_t(data)));
CHECK_THROW(test_format(s, "{:d}", string_t(data)), etl::bad_format_string_exception);
CHECK_EQUAL("data1 ", test_format(s, "{:10s}", string_t(data)));
CHECK_EQUAL("data1 ", test_format(s, "{:<10s}", string_t(data)));
CHECK_EQUAL(" data1", test_format(s, "{:>10s}", string_t(data)));
CHECK_EQUAL(" data1 ", test_format(s, "{:^10s}", string_t(data)));
CHECK_EQUAL("data1", test_format(s, "{:3}", string_t(data)));
CHECK_EQUAL("dat", test_format(s, "{:.3s}", string_t(data)));
CHECK_EQUAL("dat", test_format(s, "{:^.3s}", string_t(data)));
CHECK_EQUAL(". dat !", test_format(s, ".{:^8.3s}!", string_t(data)));
CHECK_EQUAL("^dat $", test_format(s, "^{:8.3s}$", string_t(data)));
}
//*************************************************************************
TEST(test_format_string_escaped)
{
etl::string<100> s;
etl::string<10> s_arg("data1\n");
CHECK_EQUAL("\"data1\\n\"", test_format(s, "{:?}", s_arg));
}
//*************************************************************************
TEST(test_format_chars)
{