Skip to content

Commit

Permalink
Implement << operator for std basic_ostream and etl string_view
Browse files Browse the repository at this point in the history
  • Loading branch information
mike919192 committed Mar 1, 2025
1 parent e1b263a commit 0c2b5ae
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 0 deletions.
17 changes: 17 additions & 0 deletions include/etl/string_view.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,10 @@ SOFTWARE.
#include <string_view>
#endif

#if ETL_USING_STL
#include <ostream>
#endif

#include <stdint.h>

namespace etl
Expand Down Expand Up @@ -972,6 +976,19 @@ void swap(etl::basic_string_view<T, etl::char_traits<T> >& lhs, etl::basic_strin
lhs.swap(rhs);
}

//*************************************************************************
/// Function overload to write to std ostream
//*************************************************************************
#ifdef ETL_USING_STL
template <typename T>
std::basic_ostream<T, std::char_traits<T> > &operator<<(std::basic_ostream<T, std::char_traits<T> > &os,
etl::basic_string_view<T, etl::char_traits<T> > text)
{
os.write(text.data(), text.size());
return os;
}
#endif

#include "private/minmax_pop.h"

#endif
Expand Down
35 changes: 35 additions & 0 deletions test/test_string_view.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<char16_t> u16sstream;
std::basic_stringstream<char32_t> 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
};
}

0 comments on commit 0c2b5ae

Please sign in to comment.