[libcxx] r185849 - Windows port for __codecvt_utf8<wchar_t>.

Matthew Dempsky matthew at dempsky.org
Mon Jul 8 12:34:10 PDT 2013


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 <hhinnant at apple.com> 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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list