diff --git a/cppwinrt/code_writers.h b/cppwinrt/code_writers.h index 24d45bdf3..497af4c40 100644 --- a/cppwinrt/code_writers.h +++ b/cppwinrt/code_writers.h @@ -3256,6 +3256,7 @@ struct WINRT_IMPL_EMPTY_BASES produce_dispatch_to_overridable w.write(strings::base_deferral); w.write(strings::base_coroutine_foundation); w.write(strings::base_stringable_format); + w.write(strings::base_stringable_streams); } else if (namespace_name == "Windows.Foundation.Collections") { diff --git a/cppwinrt/cppwinrt.vcxproj b/cppwinrt/cppwinrt.vcxproj index aa876effa..75d8cee1e 100644 --- a/cppwinrt/cppwinrt.vcxproj +++ b/cppwinrt/cppwinrt.vcxproj @@ -80,6 +80,7 @@ + diff --git a/cppwinrt/cppwinrt.vcxproj.filters b/cppwinrt/cppwinrt.vcxproj.filters index 3176b206f..01aecb75e 100644 --- a/cppwinrt/cppwinrt.vcxproj.filters +++ b/cppwinrt/cppwinrt.vcxproj.filters @@ -168,6 +168,9 @@ strings + + + strings strings diff --git a/strings/base_includes.h b/strings/base_includes.h index d514b415e..ef2b9d8e2 100644 --- a/strings/base_includes.h +++ b/strings/base_includes.h @@ -25,6 +25,10 @@ #include #endif +#ifndef WINRT_LEAN_AND_MEAN +#include +#endif + #ifdef __cpp_lib_format #include #endif diff --git a/strings/base_string_operators.h b/strings/base_string_operators.h index 215186b04..f9701aa4b 100644 --- a/strings/base_string_operators.h +++ b/strings/base_string_operators.h @@ -160,4 +160,12 @@ WINRT_EXPORT namespace winrt { return impl::concat_hstring(left, right); } + +#ifndef WINRT_LEAN_AND_MEAN + inline std::wostream& operator<<(std::wostream& stream, hstring const& string) + { + stream << static_cast(string); + return stream; + } +#endif } diff --git a/strings/base_stringable_streams.h b/strings/base_stringable_streams.h new file mode 100644 index 000000000..52b481d6f --- /dev/null +++ b/strings/base_stringable_streams.h @@ -0,0 +1,8 @@ + +#ifndef WINRT_LEAN_AND_MEAN +inline std::wostream& operator<<(std::wostream& stream, winrt::Windows::Foundation::IStringable const& stringable) +{ + stream << stringable.ToString(); + return stream; +} +#endif diff --git a/test/old_tests/UnitTests/Tests.vcxproj b/test/old_tests/UnitTests/Tests.vcxproj index aedd02bfd..c0c178442 100644 --- a/test/old_tests/UnitTests/Tests.vcxproj +++ b/test/old_tests/UnitTests/Tests.vcxproj @@ -118,6 +118,7 @@ + diff --git a/test/old_tests/UnitTests/Tests.vcxproj.filters b/test/old_tests/UnitTests/Tests.vcxproj.filters index 3e95c4a98..e1a6813a5 100644 --- a/test/old_tests/UnitTests/Tests.vcxproj.filters +++ b/test/old_tests/UnitTests/Tests.vcxproj.filters @@ -88,6 +88,7 @@ + diff --git a/test/old_tests/UnitTests/streams.cpp b/test/old_tests/UnitTests/streams.cpp new file mode 100644 index 000000000..b6bc0f089 --- /dev/null +++ b/test/old_tests/UnitTests/streams.cpp @@ -0,0 +1,36 @@ + #include "pch.h" +#include "catch.hpp" +#include + +struct stringable : winrt::implements +{ + winrt::hstring ToString() + { + return L"a stringable object"; + } +}; + +TEST_CASE("streams") +{ + { + std::wstringstream ss; + winrt::hstring str = L"Hello World"; + ss << str; + REQUIRE(ss.str() == str); + } + + { + // Support embedded nulls. + std::wstringstream ss; + winrt::hstring str = L"Hello\0World"; + ss << str; + REQUIRE(ss.str() == str); + } + + { + std::wstringstream ss; + winrt::Windows::Foundation::IStringable obj = winrt::make(); + ss << obj; + REQUIRE(ss.str() == obj.ToString()); + } +}