Not really.  This code was donated anonymously to me for Windows support.  I 
checked it over to make sure it did not impact any other platforms, did a few 
quick tests, and moved on.  I should have posted the patch here for review 
first.  I'll do that next time.  Any suggestions for bettering the Windows port 
(or anything else for that matter) are more than welcome.

Howard

On Jul 8, 2013, at 3:34 PM, Matthew Dempsky <[email protected]> wrote:

> Out of curiosity, is there any rationale for using preprocessor checks
> like this rather than (eg) templates that have separate
> specializations for sizeof(wchar_t) == sizeof(uint16_t) and
> sizeof(wchar_t) == sizeof(uint32_t)?
> 
> Something like:
> 
>    template <size_t = sizeof(wchar_t)> struct wcharcvt_traits;
> 
>    template <>
>    struct wcharcvt_traits<sizeof(uint16_t)> {
>        typedef uint16_t uinttype;
>        static constexpr auto to_utf8 = ucs2_to_utf8;
>        static constexpr auto from_utf8 = utf8_to_ucs2;
>    };
> 
> On Mon, Jul 8, 2013 at 12:03 PM, Howard Hinnant <[email protected]> wrote:
>> Author: hhinnant
>> Date: Mon Jul  8 14:03:07 2013
>> New Revision: 185849
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=185849&view=rev
>> Log:
>> Windows port for __codecvt_utf8<wchar_t>.
>> 
>> Modified:
>>    libcxx/trunk/src/locale.cpp
>>    
>> libcxx/trunk/test/localization/locales/locale.convenience/conversions/conversions.buffer/pbackfail.pass.cpp
>>    
>> libcxx/trunk/test/localization/locales/locale.convenience/conversions/conversions.buffer/underflow.pass.cpp
>> 
>> Modified: libcxx/trunk/src/locale.cpp
>> URL: 
>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/locale.cpp?rev=185849&r1=185848&r2=185849&view=diff
>> ==============================================================================
>> --- libcxx/trunk/src/locale.cpp (original)
>> +++ libcxx/trunk/src/locale.cpp Mon Jul  8 14:03:07 2013
>> @@ -3201,14 +3201,25 @@ __codecvt_utf8<wchar_t>::do_out(state_ty
>>     const intern_type* frm, const intern_type* frm_end, const intern_type*& 
>> frm_nxt,
>>     extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
>> {
>> +#if _WIN32
>> +    const uint16_t* _frm = reinterpret_cast<const uint16_t*>(frm);
>> +    const uint16_t* _frm_end = reinterpret_cast<const uint16_t*>(frm_end);
>> +    const uint16_t* _frm_nxt = _frm;
>> +#else
>>     const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm);
>>     const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end);
>>     const uint32_t* _frm_nxt = _frm;
>> +#endif
>>     uint8_t* _to = reinterpret_cast<uint8_t*>(to);
>>     uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
>>     uint8_t* _to_nxt = _to;
>> +#if _WIN32
>> +    result r = ucs2_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
>> +                            _Maxcode_, _Mode_);
>> +#else
>>     result r = ucs4_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
>>                             _Maxcode_, _Mode_);
>> +#endif
>>     frm_nxt = frm + (_frm_nxt - _frm);
>>     to_nxt = to + (_to_nxt - _to);
>>     return r;
>> @@ -3222,11 +3233,19 @@ __codecvt_utf8<wchar_t>::do_in(state_typ
>>     const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
>>     const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
>>     const uint8_t* _frm_nxt = _frm;
>> +#if _WIN32
>> +    uint16_t* _to = reinterpret_cast<uint16_t*>(to);
>> +    uint16_t* _to_end = reinterpret_cast<uint16_t*>(to_end);
>> +    uint16_t* _to_nxt = _to;
>> +    result r = utf8_to_ucs2(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
>> +                            _Maxcode_, _Mode_);
>> +#else
>>     uint32_t* _to = reinterpret_cast<uint32_t*>(to);
>>     uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end);
>>     uint32_t* _to_nxt = _to;
>>     result r = utf8_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
>>                             _Maxcode_, _Mode_);
>> +#endif
>>     frm_nxt = frm + (_frm_nxt - _frm);
>>     to_nxt = to + (_to_nxt - _to);
>>     return r;
>> 
>> Modified: 
>> libcxx/trunk/test/localization/locales/locale.convenience/conversions/conversions.buffer/pbackfail.pass.cpp
>> URL: 
>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/localization/locales/locale.convenience/conversions/conversions.buffer/pbackfail.pass.cpp?rev=185849&r1=185848&r2=185849&view=diff
>> ==============================================================================
>> --- 
>> libcxx/trunk/test/localization/locales/locale.convenience/conversions/conversions.buffer/pbackfail.pass.cpp
>>  (original)
>> +++ 
>> libcxx/trunk/test/localization/locales/locale.convenience/conversions/conversions.buffer/pbackfail.pass.cpp
>>  Mon Jul  8 14:03:07 2013
>> @@ -45,14 +45,14 @@ int main()
>>         test_buf f(bs.rdbuf());
>>         assert(f.sbumpc() == L'1');
>>         assert(f.sgetc() == L'2');
>> -        assert(f.pbackfail(L'a') == -1);
>> +        assert(f.pbackfail(L'a') == test_buf::traits_type::eof());
>>     }
>>     {
>>         std::fstream bs("underflow.dat");
>>         test_buf f(bs.rdbuf());
>>         assert(f.sbumpc() == L'1');
>>         assert(f.sgetc() == L'2');
>> -        assert(f.pbackfail(L'a') == -1);
>> +        assert(f.pbackfail(L'a') == test_buf::traits_type::eof());
>>         assert(f.sbumpc() == L'2');
>>         assert(f.sgetc() == L'3');
>>     }
>> 
>> Modified: 
>> libcxx/trunk/test/localization/locales/locale.convenience/conversions/conversions.buffer/underflow.pass.cpp
>> URL: 
>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/localization/locales/locale.convenience/conversions/conversions.buffer/underflow.pass.cpp?rev=185849&r1=185848&r2=185849&view=diff
>> ==============================================================================
>> --- 
>> libcxx/trunk/test/localization/locales/locale.convenience/conversions/conversions.buffer/underflow.pass.cpp
>>  (original)
>> +++ 
>> libcxx/trunk/test/localization/locales/locale.convenience/conversions/conversions.buffer/underflow.pass.cpp
>>  Mon Jul  8 14:03:07 2013
>> @@ -79,6 +79,6 @@ int main()
>>         assert(f.sbumpc() == 0x4E51);
>>         assert(f.sbumpc() == 0x4E52);
>>         assert(f.sbumpc() == 0x4E53);
>> -        assert(f.sbumpc() == -1);
>> +        assert(f.sbumpc() == test_buf::traits_type::eof());
>>     }
>> }
>> 
>> 
>> _______________________________________________
>> cfe-commits mailing list
>> [email protected]
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to