diff options
Diffstat (limited to 'dev-cpp/cpprestsdk/files/cpprestsdk-2.10.19-llvm-char-traits-patch.patch')
| -rw-r--r-- | dev-cpp/cpprestsdk/files/cpprestsdk-2.10.19-llvm-char-traits-patch.patch | 436 |
1 files changed, 0 insertions, 436 deletions
diff --git a/dev-cpp/cpprestsdk/files/cpprestsdk-2.10.19-llvm-char-traits-patch.patch b/dev-cpp/cpprestsdk/files/cpprestsdk-2.10.19-llvm-char-traits-patch.patch deleted file mode 100644 index d2a3ef900944..000000000000 --- a/dev-cpp/cpprestsdk/files/cpprestsdk-2.10.19-llvm-char-traits-patch.patch +++ /dev/null @@ -1,436 +0,0 @@ -Also submitted upstream https://github.com/microsoft/cpprestsdk/pull/1829 -Cpprestsdk is using a lot of unsigned types like uint8_t with C++ streams, this -seems to be fine with msvc/win32 and at least for now with gcc. This patch will -provide a char_traits type to the streams types other than std::char_traits if -needed. This is detected via template specialisations. Google & AIs will probably -suggest adding a std::char_traits<unsingned char> implementation, but I think that -is very innappropriate in a library for use by applications. ---- a/Release/include/cpprest/streams.h (revision 0b1ce318a757bbfb89bdb0fffb61ca4e38dc3b33) -+++ b/Release/include/cpprest/streams.h (revision 32b322b564e5e540ff02393ffe3bd3bade8d299c) -@@ -16,6 +16,7 @@ - #define CASA_STREAMS_H - - #include "cpprest/astreambuf.h" -+#include "cpprest/details/char_traits.h" - #include <iosfwd> - #include <cstdio> - -@@ -60,30 +61,95 @@ - concurrency::streams::streambuf<CharType> m_buffer; - }; - --template<typename CharType> -+template<typename CharType, class Traits = typename utility::CanUseStdCharTraits<CharType>::TraitsType> - struct Value2StringFormatter - { -+ struct SanitizeInput -+ { -+ const std::basic_string<char> &operator () (const std::basic_string<char> &input) -+ { -+ return input; -+ } -+ template <class InputTraits> std::basic_string<char> operator () (const std::basic_string<unsigned char, InputTraits> &input) -+ { -+ return {reinterpret_cast<const char *>(input.c_str()), input.size()}; -+ } -+ const char *operator () (const char *input) { -+ return input; -+ } -+ const char *operator () (const unsigned char *input) -+ { -+ return reinterpret_cast<const char *>(input); -+ } -+ template <class T> T operator () (T input) -+ { -+ return input; -+ } -+ }; -+ struct GenerateFormatOutput -+ { -+ std::basic_string<CharType,Traits> &&operator() (std::basic_string<CharType,Traits> &&result) -+ { -+ return std::move(result); -+ } -+ std::basic_string<CharType,Traits> operator() (const std::basic_string<char> &intermediate) -+ { -+ return {reinterpret_cast<const CharType *>(intermediate.c_str()), intermediate.size()}; -+ } -+ }; - template<typename T> -- static std::basic_string<CharType> format(const T& val) -+ static std::basic_string<CharType, Traits> format(const T& val) - { -- std::basic_ostringstream<CharType> ss; -+ typename std::conditional< -+ sizeof(CharType) == 1, -+ std::basic_ostringstream<char>, -+ std::basic_ostringstream<typename std::make_signed<CharType>::type> -+ >::type ss; -+ SanitizeInput sanitizer; -+ ss << sanitizer(val); -+ typename std::conditional< -+ sizeof(CharType) == 1, -+ std::basic_string<char>, -+ std::basic_string<typename std::make_signed<CharType>::type> -+ >::type str = ss.str(); -+ GenerateFormatOutput generateFormatOutput; -+ return generateFormatOutput(std::move(str)); -+ } -+}; -+ -+template<class Traits, typename T> -+struct Value2StringFormatterUint8Format -+{ -+ std::basic_string<uint8_t, Traits> operator () (const T& val) -+ { -+ std::basic_ostringstream<char> ss; - ss << val; -- return ss.str(); -+ return reinterpret_cast<const uint8_t*>(ss.str().c_str()); -+ } -+}; -+ -+template <class Traits> -+struct Value2StringFormatterUint8Format<Traits, std::basic_string<uint8_t,Traits>> -+{ -+ std::basic_string<uint8_t, Traits> operator () ( -+ const std::basic_string<uint8_t, typename utility::CanUseStdCharTraits<uint8_t>::TraitsType>& val) -+ { -+ Value2StringFormatterUint8Format<Traits,std::basic_string<char>> format; -+ return format(reinterpret_cast<const std::basic_string<char>&>(val)); - } - }; - - template<> - struct Value2StringFormatter<uint8_t> - { -- template<typename T> -- static std::basic_string<uint8_t> format(const T& val) -+ template <typename T, class Traits = typename utility::CanUseStdCharTraits<uint8_t>::TraitsType> -+ static std::basic_string<uint8_t, Traits> format(const T& val) - { -- std::basic_ostringstream<char> ss; -- ss << val; -- return reinterpret_cast<const uint8_t*>(ss.str().c_str()); -+ Value2StringFormatterUint8Format<Traits, T> format; -+ return format(val); - } - -- static std::basic_string<uint8_t> format(const utf16string& val) -+ static std::basic_string<uint8_t, typename utility::CanUseStdCharTraits<uint8_t>::TraitsType> format(const utf16string& val) - { - return format(utility::conversions::utf16_to_utf8(val)); - } -@@ -262,7 +328,7 @@ - /// Write the specified string to the output stream. - /// </summary> - /// <param name="str">Input string.</param> -- pplx::task<size_t> print(const std::basic_string<CharType>& str) const -+ pplx::task<size_t> print(const std::basic_string<CharType,traits>& str) const - { - pplx::task<size_t> result; - if (!_verify_and_return_task(details::_out_stream_msg, result)) return result; -@@ -273,7 +339,7 @@ - } - else - { -- auto sharedStr = std::make_shared<std::basic_string<CharType>>(str); -+ auto sharedStr = std::make_shared<std::basic_string<CharType,traits>>(str); - return helper()->m_buffer.putn_nocopy(sharedStr->c_str(), sharedStr->size()).then([sharedStr](size_t size) { - return size; - }); -@@ -294,7 +360,7 @@ - if (!_verify_and_return_task(details::_out_stream_msg, result)) return result; - // TODO in the future this could be improved to have Value2StringFormatter avoid another unnecessary copy - // by putting the string on the heap before calling the print string overload. -- return print(details::Value2StringFormatter<CharType>::format(val)); -+ return print(details::Value2StringFormatter<CharType, traits>::format(val)); - } - - /// <summary> ---- a/Release/include/cpprest/astreambuf.h (revision d17f091b5a753b33fb455e92b590fc9f4e921119) -+++ b/Release/include/cpprest/astreambuf.h (revision 4188ad89b2cf2e8de3cc3513adcf400fbfdc5ce7) -@@ -15,6 +15,7 @@ - - #include "cpprest/asyncrt_utils.h" - #include "cpprest/details/basic_types.h" -+#include "cpprest/details/char_traits.h" - #include "pplx/pplxtasks.h" - #include <atomic> - #include <cstring> -@@ -56,55 +57,28 @@ - /// <typeparam name="_CharType"> - /// The data type of the basic element of the stream. - /// </typeparam> -+namespace detail -+{ - template<typename _CharType> --struct char_traits : std::char_traits<_CharType> -+struct char_traits : utility::CanUseStdCharTraits<_CharType>::TraitsType - { - /// <summary> - /// Some synchronous functions will return this value if the operation - /// requires an asynchronous call in a given situation. - /// </summary> - /// <returns>An <c>int_type</c> value which implies that an asynchronous call is required.</returns> -- static typename std::char_traits<_CharType>::int_type requires_async() -+ static typename utility::CanUseStdCharTraits<_CharType>::TraitsType::int_type requires_async() - { -- return std::char_traits<_CharType>::eof() - 1; -+ return utility::CanUseStdCharTraits<_CharType>::TraitsType::eof() - 1; - } -+}; -+} -+template<typename _CharType> struct char_traits : detail::char_traits<_CharType> { - }; - #if !defined(_WIN32) --template<> --struct char_traits<unsigned char> : private std::char_traits<char> --{ --public: -- typedef unsigned char char_type; -- -- using std::char_traits<char>::eof; -- using std::char_traits<char>::int_type; -- using std::char_traits<char>::off_type; -- using std::char_traits<char>::pos_type; -- -- static size_t length(const unsigned char* str) -- { -- return std::char_traits<char>::length(reinterpret_cast<const char*>(str)); -- } -- -- static void assign(unsigned char& left, const unsigned char& right) { left = right; } -- static unsigned char* assign(unsigned char* left, size_t n, unsigned char value) -- { -- return reinterpret_cast<unsigned char*>( -- std::char_traits<char>::assign(reinterpret_cast<char*>(left), n, static_cast<char>(value))); -- } -- -- static unsigned char* copy(unsigned char* left, const unsigned char* right, size_t n) -- { -- return reinterpret_cast<unsigned char*>( -- std::char_traits<char>::copy(reinterpret_cast<char*>(left), reinterpret_cast<const char*>(right), n)); -- } -- -- static unsigned char* move(unsigned char* left, const unsigned char* right, size_t n) -- { -- return reinterpret_cast<unsigned char*>( -- std::char_traits<char>::move(reinterpret_cast<char*>(left), reinterpret_cast<const char*>(right), n)); -- } -- -+template <> struct char_traits<unsigned char> : detail::char_traits<unsigned char> { -+ typedef typename std::char_traits<char>::int_type int_type; -+ static int_type eof() { return std::char_traits<char>::eof(); } - static int_type requires_async() { return eof() - 1; } - }; - #endif -new file mode 100644 ---- /dev/null (revision 4188ad89b2cf2e8de3cc3513adcf400fbfdc5ce7) -+++ b/Release/include/cpprest/details/char_traits.h (revision 4188ad89b2cf2e8de3cc3513adcf400fbfdc5ce7) -@@ -0,0 +1,102 @@ -+// -+// Created by sigsegv on 6/28/25. -+// -+ -+#ifndef CPPRESTSDK_ROOT_CHAR_TRAITS_H -+#define CPPRESTSDK_ROOT_CHAR_TRAITS_H -+ -+#include <type_traits> -+#include <string> -+ -+namespace utility { -+ -+namespace detail { -+ -+template <typename T> struct IntTypeFor { -+ typedef typename std::conditional<std::is_unsigned<T>::value, unsigned long long int, long long int>::type type; -+}; -+template <> struct IntTypeFor<char> { -+ typedef typename std::char_traits<char>::int_type type; -+}; -+template <> struct IntTypeFor<unsigned char> { -+ typedef typename std::make_unsigned<typename std::char_traits<char>::int_type>::type type; -+}; -+ -+template <typename T> class DetailCharTraits -+{ -+public: -+ using char_type = T; -+ using int_type = typename IntTypeFor<T>::type; -+ using off_type = std::streamoff; -+ using pos_type = std::streampos; -+ using state_type = mbstate_t; -+ -+ static void assign(char_type& r, const char_type& a) noexcept { r = a; } -+ static char_type to_char_type(int_type c) noexcept { return char_type(c); } -+ static int_type to_int_type(char_type c) noexcept { return c; } -+ static bool eq(char_type a, char_type b) noexcept { return a == b; } -+ static bool lt(char_type a, char_type b) noexcept { return a < b; } -+ static int compare(const char_type* s1,const char_type* s2,size_t n){ -+ for (; n--; ++s1, ++s2) { -+ if (!eq(*s1, *s2)) -+ return lt(*s1,*s2)?-1:1; -+ } -+ return 0; -+ } -+ static size_t length(const char_type* s){ -+ const char_type* p = s; -+ while (*p) -+ ++p; -+ return size_t(p - s); -+ } -+ static const char_type* find(const char_type* s,size_t n,const char_type& a){ -+ for (; n--; ++s) -+ { -+ if (eq(*s, a)) -+ return s; -+ return nullptr; -+ } -+ } -+ static char_type* move (char_type* r,const char_type* s,size_t n){ -+ return (char_type*)memmove(r, s, n * sizeof(char_type)); -+ } -+ static char_type* copy (char_type* r,const char_type* s,size_t n){ -+ return (char_type*)memcpy (r, s, n * sizeof(char_type)); -+ } -+ static char_type* assign(char_type* r,size_t n,char_type a){ -+ if (sizeof(char_type) == 1) -+ { -+ return (char_type*)memset(r, a, n); -+ } -+ else -+ { -+ for (char_type *s = r; n--; ++s) -+ { -+ *s = a; -+ } -+ } -+ } -+ static int_type eof() noexcept { return ~0u; } -+ static int_type not_eof(int_type c) noexcept { return c == eof() ? 0 : c; } -+}; -+ -+template <typename T, typename = bool> struct CanUseStdCharTraits : public std::false_type -+{ -+public: -+ typedef DetailCharTraits<T> TraitsType; -+}; -+ -+template <typename T> struct CanUseStdCharTraits<T, decltype(std::char_traits<T>::eq(std::declval<T>(), std::declval<T>()))> : public std::true_type -+{ -+public: -+ typedef std::char_traits<T> TraitsType; -+}; -+ -+} -+ -+template <typename T> struct CanUseStdCharTraits : detail::CanUseStdCharTraits<typename std::remove_const<typename std::remove_reference<T>::type>::type> { -+}; -+ -+} -+ -+#endif // CPPRESTSDK_ROOT_CHAR_TRAITS_H ---- a/Release/tests/functional/streams/memstream_tests.cpp (revision d17f091b5a753b33fb455e92b590fc9f4e921119) -+++ b/Release/tests/functional/streams/memstream_tests.cpp (revision 6df13a8c0417ef700c0f164bcd0686ad46f66fd9) -@@ -8,6 +8,7 @@ - * - * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - ****/ -+#include "cpprest/details/char_traits.h" - #include "stdafx.h" - #if defined(__cplusplus_winrt) - #include <wrl.h> -@@ -32,7 +33,7 @@ - { - VERIFY_IS_TRUE(wbuf.can_write()); - -- std::basic_string<typename StreamBufferType::char_type> s; -+ std::basic_string<typename StreamBufferType::char_type,typename utility::CanUseStdCharTraits<typename StreamBufferType::char_type>::TraitsType> s; - s.push_back((typename StreamBufferType::char_type)0); - s.push_back((typename StreamBufferType::char_type)1); - s.push_back((typename StreamBufferType::char_type)2); -@@ -137,7 +138,7 @@ - { - VERIFY_IS_TRUE(wbuf.can_write()); - -- std::basic_string<typename StreamBufferType::char_type> s; -+ std::basic_string<typename StreamBufferType::char_type,typename utility::CanUseStdCharTraits<typename StreamBufferType::char_type>::TraitsType> s; - s.push_back((typename StreamBufferType::char_type)0); - s.push_back((typename StreamBufferType::char_type)1); - s.push_back((typename StreamBufferType::char_type)2); -@@ -169,7 +170,7 @@ - - typedef concurrency::streams::rawptr_buffer<CharType> StreamBufferType; - -- std::basic_string<CharType> s; -+ std::basic_string<CharType,typename CanUseStdCharTraits<CharType>::TraitsType> s; - s.push_back((CharType)0); - s.push_back((CharType)1); - s.push_back((CharType)2); -@@ -198,7 +199,7 @@ - typedef concurrency::streams::container_buffer<CollectionType> StreamBufferType; - typedef typename concurrency::streams::container_buffer<CollectionType>::char_type CharType; - -- std::basic_string<CharType> s; -+ std::basic_string<CharType, typename utility::CanUseStdCharTraits<CharType>::TraitsType> s; - s.push_back((CharType)0); - s.push_back((CharType)1); - s.push_back((CharType)2); -@@ -553,7 +554,7 @@ - VERIFY_IS_TRUE(rwbuf.can_read()); - VERIFY_IS_TRUE(rwbuf.can_write()); - VERIFY_IS_FALSE(rwbuf.is_eof()); -- std::basic_string<typename StreamBufferType::char_type> s; -+ std::basic_string<typename StreamBufferType::char_type, typename utility::CanUseStdCharTraits<typename StreamBufferType::char_type>::TraitsType> s; - s.push_back((typename StreamBufferType::char_type)0); - s.push_back((typename StreamBufferType::char_type)1); - s.push_back((typename StreamBufferType::char_type)2); -@@ -684,7 +685,7 @@ - VERIFY_IS_TRUE(rwbuf.can_write()); - - // Write 4 characters -- std::basic_string<typename StreamBufferType::char_type> s; -+ std::basic_string<typename StreamBufferType::char_type, typename utility::CanUseStdCharTraits<typename StreamBufferType::char_type>::TraitsType> s; - s.push_back((typename StreamBufferType::char_type)0); - s.push_back((typename StreamBufferType::char_type)1); - s.push_back((typename StreamBufferType::char_type)2); -@@ -726,7 +727,7 @@ - VERIFY_IS_TRUE(rwbuf.can_write()); - - // Write 4 characters -- std::basic_string<typename StreamBufferType::char_type> s; -+ std::basic_string<typename StreamBufferType::char_type, typename utility::CanUseStdCharTraits<typename StreamBufferType::char_type>::TraitsType> s; - s.push_back((typename StreamBufferType::char_type)0); - s.push_back((typename StreamBufferType::char_type)1); - s.push_back((typename StreamBufferType::char_type)2); ---- a/Release/tests/functional/streams/stdstream_tests.cpp (revision d17f091b5a753b33fb455e92b590fc9f4e921119) -+++ b/Release/tests/functional/streams/stdstream_tests.cpp (revision 6df13a8c0417ef700c0f164bcd0686ad46f66fd9) -@@ -13,6 +13,7 @@ - #include "cpprest/filestream.h" - #include "cpprest/producerconsumerstream.h" - #include "cpprest/rawptrstream.h" -+#include "cpprest/details/char_traits.h" - - #if (!defined(_WIN32) || !defined(CPPREST_EXCLUDE_WEBSOCKETS)) && !defined(__cplusplus_winrt) - #include <boost/interprocess/streams/bufferstream.hpp> -@@ -303,7 +304,8 @@ - - const std::streamsize iterations = 100; - -- const std::string the_alphabet("abcdefghijklmnopqrstuvwxyz"); -+ const char *the_alphabet_characters = "abcdefghijklmnopqrstuvwxyz"; -+ const std::basic_string<uint8_t,typename utility::CanUseStdCharTraits<uint8_t>::TraitsType> the_alphabet(reinterpret_cast<const uint8_t *>(the_alphabet_characters)); - - auto writer = pplx::create_task([ostream, iterations, the_alphabet]() { - auto os = ostream; -@@ -341,7 +343,8 @@ - - const std::streamsize iterations = 100; - -- const std::string the_alphabet("abcdefghijklmnopqrstuvwxyz"); -+ const char *the_alphabet_chars = "abcdefghijklmnopqrstuvwxyz"; -+ const std::basic_string<uint8_t,typename CanUseStdCharTraits<uint8_t>::TraitsType> the_alphabet(reinterpret_cast<const uint8_t *>(the_alphabet_chars)); - - auto writer = pplx::create_task([ostream, iterations, the_alphabet]() { - auto os = ostream; |
