Please use GitHub pull requests for new patches. Phabricator shutdown timeline
Changeset View
Changeset View
Standalone View
Standalone View
libcxx/include/__locale
Show First 20 Lines • Show All 331 Lines • ▼ Show 20 Lines | collate<_CharT>::do_hash(const char_type* __lo, const char_type* __hi) const | ||||
{ | { | ||||
__h = (__h << 4) + static_cast<size_t>(*__p); | __h = (__h << 4) + static_cast<size_t>(*__p); | ||||
size_t __g = __h & __mask; | size_t __g = __h & __mask; | ||||
__h ^= __g | (__g >> __sr); | __h ^= __g | (__g >> __sr); | ||||
} | } | ||||
return static_cast<long>(__h); | return static_cast<long>(__h); | ||||
} | } | ||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS collate<char>) | extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS collate<char>; | ||||
#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS | #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS | ||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS collate<wchar_t>) | extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS collate<wchar_t>; | ||||
#endif | #endif | ||||
Quuxplusone: This PR basically LGTM. I do want to raise the question of greppability: The old macros let you… | |||||
Yes, I think that's fine (and in fact a lot more straightforward than before). ldionne: > do you agree?
Yes, I think that's fine (and in fact a lot more straightforward than before). | |||||
// template <class CharT> class collate_byname; | // template <class CharT> class collate_byname; | ||||
template <class _CharT> class _LIBCPP_TEMPLATE_VIS collate_byname; | template <class _CharT> class _LIBCPP_TEMPLATE_VIS collate_byname; | ||||
template <> | template <> | ||||
class _LIBCPP_TYPE_VIS collate_byname<char> | class _LIBCPP_TYPE_VIS collate_byname<char> | ||||
: public collate<char> | : public collate<char> | ||||
▲ Show 20 Lines • Show All 1,140 Lines • ▼ Show 20 Lines | |||||
_LIBCPP_SUPPRESS_DEPRECATED_PUSH | _LIBCPP_SUPPRESS_DEPRECATED_PUSH | ||||
template <class _InternT, class _ExternT, class _StateT> | template <class _InternT, class _ExternT, class _StateT> | ||||
codecvt_byname<_InternT, _ExternT, _StateT>::~codecvt_byname() | codecvt_byname<_InternT, _ExternT, _StateT>::~codecvt_byname() | ||||
{ | { | ||||
} | } | ||||
_LIBCPP_SUPPRESS_DEPRECATED_POP | _LIBCPP_SUPPRESS_DEPRECATED_POP | ||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char, char, mbstate_t>) | extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char, char, mbstate_t>; | ||||
#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS | #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS | ||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<wchar_t, char, mbstate_t>) | extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<wchar_t, char, mbstate_t>; | ||||
#endif | #endif | ||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_DEPRECATED_IN_CXX20 _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char16_t, char, mbstate_t>) // deprecated in C++20 | extern template class _LIBCPP_DEPRECATED_IN_CXX20 _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char16_t, char, mbstate_t>; // deprecated in C++20 | ||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_DEPRECATED_IN_CXX20 _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char32_t, char, mbstate_t>) // deprecated in C++20 | extern template class _LIBCPP_DEPRECATED_IN_CXX20 _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char32_t, char, mbstate_t>; // deprecated in C++20 | ||||
#ifndef _LIBCPP_HAS_NO_CHAR8_T | #ifndef _LIBCPP_HAS_NO_CHAR8_T | ||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char16_t, char8_t, mbstate_t>) // C++20 | extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char16_t, char8_t, mbstate_t>; // C++20 | ||||
_LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char32_t, char8_t, mbstate_t>) // C++20 | extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char32_t, char8_t, mbstate_t>; // C++20 | ||||
#endif | #endif | ||||
template <size_t _Np> | template <size_t _Np> | ||||
struct __narrow_to_utf8 | struct __narrow_to_utf8 | ||||
{ | { | ||||
template <class _OutputIterator, class _CharT> | template <class _OutputIterator, class _CharT> | ||||
_OutputIterator | _OutputIterator | ||||
operator()(_OutputIterator __s, const _CharT* __wb, const _CharT* __we) const; | operator()(_OutputIterator __s, const _CharT* __wb, const _CharT* __we) const; | ||||
▲ Show 20 Lines • Show All 295 Lines • Show Last 20 Lines |
This PR basically LGTM. I do want to raise the question of greppability: The old macros let you grep -l _LIBCPP_EXTERN_TEMPLATE to find these sneaky declarations. The new code makes you grep -l extern.template instead. This seems fine to me; do you agree?
FYI, some places already use extern template (for function templates only):