From 2b27c28861a9e08261dfc3660e7ea5933f7c7a5e Mon Sep 17 00:00:00 2001 From: mike919192 <91038685+mike919192@users.noreply.github.com> Date: Tue, 4 Mar 2025 04:44:13 -0500 Subject: [PATCH] Implement << operator for std basic_ostream and etl string_view (#1040) * Implement << operator for std basic_ostream and etl string_view * Implement << operator for std basic_ostream and etl ibasic_string. Still working through tests * Should be all tests * Fix comment --- include/etl/basic_string.h | 21 ++++++++++++ include/etl/string_view.h | 17 ++++++++++ test/test_string_char.cpp | 18 ++++++++++ test/test_string_char_external_buffer.cpp | 19 +++++++++++ test/test_string_u16.cpp | 18 ++++++++++ test/test_string_u16_external_buffer.cpp | 19 +++++++++++ test/test_string_u32.cpp | 18 ++++++++++ test/test_string_u32_external_buffer.cpp | 19 +++++++++++ test/test_string_u8.cpp | 18 ++++++++++ test/test_string_u8_external_buffer.cpp | 19 +++++++++++ test/test_string_view.cpp | 35 ++++++++++++++++++++ test/test_string_wchar_t.cpp | 18 ++++++++++ test/test_string_wchar_t_external_buffer.cpp | 19 +++++++++++ 13 files changed, 258 insertions(+) diff --git a/include/etl/basic_string.h b/include/etl/basic_string.h index 1a9f0c9b..b9cf24f7 100644 --- a/include/etl/basic_string.h +++ b/include/etl/basic_string.h @@ -56,6 +56,10 @@ SOFTWARE. #include #endif +#if ETL_USING_STL + #include +#endif + #include "private/minmax_push.h" //***************************************************************************** @@ -2964,6 +2968,23 @@ namespace etl { return !(lhs < rhs); } + + //*************************************************************************** + /// Operator overload to write to std basic_ostream + ///\param os Reference to the output stream. + ///\param str Reference to the string to write. + ///\return Reference to the output stream, for chaining write operations. + ///\ingroup string + //*************************************************************************** +#if ETL_USING_STL + template + std::basic_ostream > &operator<<(std::basic_ostream > &os, + const etl::ibasic_string& str) + { + os.write(str.data(), str.size()); + return os; + } +#endif } #include "private/minmax_pop.h" diff --git a/include/etl/string_view.h b/include/etl/string_view.h index 82bd4502..69cbe836 100644 --- a/include/etl/string_view.h +++ b/include/etl/string_view.h @@ -47,6 +47,10 @@ SOFTWARE. #include #endif +#if ETL_USING_STL + #include +#endif + #include namespace etl @@ -972,6 +976,19 @@ void swap(etl::basic_string_view >& lhs, etl::basic_strin lhs.swap(rhs); } +//************************************************************************* +/// Operator overload to write to std basic_ostream +//************************************************************************* +#if ETL_USING_STL +template +std::basic_ostream > &operator<<(std::basic_ostream > &os, + etl::basic_string_view > text) +{ + os.write(text.data(), text.size()); + return os; +} +#endif + #include "private/minmax_pop.h" #endif diff --git a/test/test_string_char.cpp b/test/test_string_char.cpp index 9a4f463c..55e1bdb3 100644 --- a/test/test_string_char.cpp +++ b/test/test_string_char.cpp @@ -5310,5 +5310,23 @@ namespace #endif CHECK_EQUAL(text.max_size(), text.size()); } + + //************************************************************************* +#if ETL_USING_STL + TEST_FIXTURE(SetupFixture, test_write_string_to_std_basic_ostream) + { + Text text1 = STR("Hello World"); + + std::stringstream sstream; + + sstream << text1; + + TextSTD sstream_string = sstream.str(); + + View sstream_view(sstream_string.data(), sstream_string.size()); + + CHECK(text1 == sstream_view); + } +#endif }; } diff --git a/test/test_string_char_external_buffer.cpp b/test/test_string_char_external_buffer.cpp index 1234e170..a2593660 100644 --- a/test/test_string_char_external_buffer.cpp +++ b/test/test_string_char_external_buffer.cpp @@ -5689,5 +5689,24 @@ namespace #endif CHECK_EQUAL(text.max_size(), text.size()); } + + //************************************************************************* +#if ETL_USING_STL + TEST_FIXTURE(SetupFixture, test_write_string_to_std_basic_ostream) + { + TextBuffer buffer1{0}; + Text text1(STR("Hello World"), buffer1.data(), buffer1.size()); + + std::stringstream sstream; + + sstream << text1; + + TextSTD sstream_string = sstream.str(); + + View sstream_view(sstream_string.data(), sstream_string.size()); + + CHECK(text1 == sstream_view); + } +#endif }; } diff --git a/test/test_string_u16.cpp b/test/test_string_u16.cpp index d2cb002b..01ee5cf8 100644 --- a/test/test_string_u16.cpp +++ b/test/test_string_u16.cpp @@ -5324,5 +5324,23 @@ namespace #endif CHECK_EQUAL(text.max_size(), text.size()); } + + //************************************************************************* +#if ETL_USING_STL + TEST_FIXTURE(SetupFixture, test_write_string_to_std_basic_ostream) + { + Text text1 = STR("Hello World"); + + std::basic_stringstream sstream; + + sstream << text1; + + TextSTD sstream_string = sstream.str(); + + View sstream_view(sstream_string.data(), sstream_string.size()); + + CHECK(text1 == sstream_view); + } +#endif }; } diff --git a/test/test_string_u16_external_buffer.cpp b/test/test_string_u16_external_buffer.cpp index b7a2bfec..ab7223e7 100644 --- a/test/test_string_u16_external_buffer.cpp +++ b/test/test_string_u16_external_buffer.cpp @@ -5677,5 +5677,24 @@ namespace #endif CHECK_EQUAL(text.max_size(), text.size()); } + + //************************************************************************* +#if ETL_USING_STL + TEST_FIXTURE(SetupFixture, test_write_string_to_std_basic_ostream) + { + TextBuffer buffer1{0}; + Text text1(STR("Hello World"), buffer1.data(), buffer1.size()); + + std::basic_stringstream sstream; + + sstream << text1; + + TextSTD sstream_string = sstream.str(); + + View sstream_view(sstream_string.data(), sstream_string.size()); + + CHECK(text1 == sstream_view); + } +#endif }; } diff --git a/test/test_string_u32.cpp b/test/test_string_u32.cpp index 4c19a57d..4f4c6cb0 100644 --- a/test/test_string_u32.cpp +++ b/test/test_string_u32.cpp @@ -5324,5 +5324,23 @@ namespace #endif CHECK_EQUAL(text.max_size(), text.size()); } + + //************************************************************************* +#if ETL_USING_STL + TEST_FIXTURE(SetupFixture, test_write_string_to_std_basic_ostream) + { + Text text1 = STR("Hello World"); + + std::basic_stringstream sstream; + + sstream << text1; + + TextSTD sstream_string = sstream.str(); + + View sstream_view(sstream_string.data(), sstream_string.size()); + + CHECK(text1 == sstream_view); + } +#endif }; } diff --git a/test/test_string_u32_external_buffer.cpp b/test/test_string_u32_external_buffer.cpp index 5e808726..1187091f 100644 --- a/test/test_string_u32_external_buffer.cpp +++ b/test/test_string_u32_external_buffer.cpp @@ -5677,5 +5677,24 @@ namespace #endif CHECK_EQUAL(text.max_size(), text.size()); } + + //************************************************************************* +#if ETL_USING_STL + TEST_FIXTURE(SetupFixture, test_write_string_to_std_basic_ostream) + { + TextBuffer buffer1{0}; + Text text1(STR("Hello World"), buffer1.data(), buffer1.size()); + + std::basic_stringstream sstream; + + sstream << text1; + + TextSTD sstream_string = sstream.str(); + + View sstream_view(sstream_string.data(), sstream_string.size()); + + CHECK(text1 == sstream_view); + } +#endif }; } diff --git a/test/test_string_u8.cpp b/test/test_string_u8.cpp index 4f792225..e105ed19 100644 --- a/test/test_string_u8.cpp +++ b/test/test_string_u8.cpp @@ -5327,6 +5327,24 @@ namespace #endif CHECK_EQUAL(text.max_size(), text.size()); } + + //************************************************************************* +#if ETL_USING_STL + TEST_FIXTURE(SetupFixture, test_write_string_to_std_basic_ostream) + { + Text text1 = STR("Hello World"); + + std::basic_stringstream sstream; + + sstream << text1; + + TextSTD sstream_string = sstream.str(); + + View sstream_view(sstream_string.data(), sstream_string.size()); + + CHECK(text1 == sstream_view); + } +#endif }; } diff --git a/test/test_string_u8_external_buffer.cpp b/test/test_string_u8_external_buffer.cpp index df2724e5..1494e708 100644 --- a/test/test_string_u8_external_buffer.cpp +++ b/test/test_string_u8_external_buffer.cpp @@ -5706,6 +5706,25 @@ namespace #endif CHECK_EQUAL(text.max_size(), text.size()); } + + //************************************************************************* +#if ETL_USING_STL + TEST_FIXTURE(SetupFixture, test_write_string_to_std_basic_ostream) + { + TextBuffer buffer1{0}; + Text text1(STR("Hello World"), buffer1.data(), buffer1.size()); + + std::basic_stringstream sstream; + + sstream << text1; + + TextSTD sstream_string = sstream.str(); + + View sstream_view(sstream_string.data(), sstream_string.size()); + + CHECK(text1 == sstream_view); + } +#endif }; } diff --git a/test/test_string_view.cpp b/test/test_string_view.cpp index afa1e6d3..598f6332 100644 --- a/test/test_string_view.cpp +++ b/test/test_string_view.cpp @@ -1120,5 +1120,40 @@ namespace CHECK_TRUE((u16view == U16View{ u"Hello World", etl::strlen(u"Hello World") })); CHECK_TRUE((u32view == U32View{ U"Hello World", etl::strlen(U"Hello World") })); } + + //************************************************************************* +#if ETL_USING_STL + TEST(write_to_std_stream) + { + View view{ "Hello World" }; + WView wview{ L"Hello World" }; + U16View u16view{ u"Hello World" }; + U32View u32view{ U"Hello World" }; + + std::stringstream sstream; + std::wstringstream wsstream; + std::basic_stringstream u16sstream; + std::basic_stringstream u32sstream; + + sstream << view; + std::string sstream_string = sstream.str(); + wsstream << wview; + std::wstring wsstream_string = wsstream.str(); + u16sstream << u16view; + std::u16string u16sstream_string = u16sstream.str(); + u32sstream << u32view; + std::u32string u32sstream_string = u32sstream.str(); + + View sstream_view(sstream_string.data(), sstream_string.size()); + WView wsstream_view(wsstream_string.data(), wsstream_string.size()); + U16View u16sstream_view(u16sstream_string.data(), u16sstream_string.size()); + U32View u32sstream_view(u32sstream_string.data(), u32sstream_string.size()); + + CHECK_TRUE(view == sstream_view); + CHECK_TRUE(wview == wsstream_view); + CHECK_TRUE(u16view == u16sstream_view); + CHECK_TRUE(u32view == u32sstream_view); + } +#endif }; } diff --git a/test/test_string_wchar_t.cpp b/test/test_string_wchar_t.cpp index 4eb16f41..d28ba6d6 100644 --- a/test/test_string_wchar_t.cpp +++ b/test/test_string_wchar_t.cpp @@ -5325,5 +5325,23 @@ namespace #endif CHECK_EQUAL(text.max_size(), text.size()); } + + //************************************************************************* +#if ETL_USING_STL + TEST_FIXTURE(SetupFixture, test_write_string_to_std_basic_ostream) + { + Text text1 = STR("Hello World"); + + std::wstringstream sstream; + + sstream << text1; + + TextSTD sstream_string = sstream.str(); + + View sstream_view(sstream_string.data(), sstream_string.size()); + + CHECK(text1 == sstream_view); + } +#endif }; } diff --git a/test/test_string_wchar_t_external_buffer.cpp b/test/test_string_wchar_t_external_buffer.cpp index 8bbbe496..16cc52a8 100644 --- a/test/test_string_wchar_t_external_buffer.cpp +++ b/test/test_string_wchar_t_external_buffer.cpp @@ -5680,5 +5680,24 @@ namespace #endif CHECK_EQUAL(text.max_size(), text.size()); } + + //************************************************************************* +#if ETL_USING_STL + TEST_FIXTURE(SetupFixture, test_write_string_to_std_basic_ostream) + { + TextBuffer buffer1{0}; + Text text1(STR("Hello World"), buffer1.data(), buffer1.size()); + + std::wstringstream sstream; + + sstream << text1; + + TextSTD sstream_string = sstream.str(); + + View sstream_view(sstream_string.data(), sstream_string.size()); + + CHECK(text1 == sstream_view); + } +#endif }; }