Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ICU-22954 USet C++ iterator return std::u16string; header-only LocalPointer #3295

Merged
merged 5 commits into from
Dec 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions icu4c/source/common/characterproperties.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
#include "umutex.h"
#include "uprops.h"

using icu::LocalPointer;
using U_ICU_NAMESPACE_OR_INTERNAL::LocalPointer;
#if !UCONFIG_NO_NORMALIZATION
using icu::Normalizer2Factory;
using icu::Normalizer2Impl;
Expand Down Expand Up @@ -340,7 +340,7 @@ UnicodeSet *makeSet(UProperty property, UErrorCode &errorCode) {
UCPMap *makeMap(UProperty property, UErrorCode &errorCode) {
if (U_FAILURE(errorCode)) { return nullptr; }
uint32_t nullValue = property == UCHAR_SCRIPT ? USCRIPT_UNKNOWN : 0;
icu::LocalUMutableCPTriePointer mutableTrie(
U_ICU_NAMESPACE_OR_INTERNAL::LocalUMutableCPTriePointer mutableTrie(
umutablecptrie_open(nullValue, nullValue, &errorCode));
const UnicodeSet *inclusions =
icu::CharacterProperties::getInclusionsForProperty(property, errorCode);
Expand Down
3 changes: 2 additions & 1 deletion icu4c/source/common/locavailable.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,8 @@ UBool U_CALLCONV uloc_cleanup() {
void U_CALLCONV loadInstalledLocales(UErrorCode& status) {
ucln_common_registerCleanup(UCLN_COMMON_ULOC, uloc_cleanup);

icu::LocalUResourceBundlePointer rb(ures_openDirect(nullptr, "res_index", &status));
U_ICU_NAMESPACE_OR_INTERNAL::LocalUResourceBundlePointer rb(
ures_openDirect(nullptr, "res_index", &status));
AvailableLocalesSink sink;
ures_getAllItemsWithFallback(rb.getAlias(), "", sink, status);
}
Expand Down
17 changes: 10 additions & 7 deletions icu4c/source/common/locdispnames.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@
#include "ureslocs.h"
#include "ustr_imp.h"

using U_ICU_NAMESPACE_OR_INTERNAL::LocalUEnumerationPointer;
using U_ICU_NAMESPACE_OR_INTERNAL::LocalUResourceBundlePointer;

// C++ API ----------------------------------------------------------------- ***

U_NAMESPACE_BEGIN
Expand Down Expand Up @@ -313,7 +316,7 @@ _getStringOrCopyKey(const char *path, const char *locale,

if(itemKey==nullptr) {
/* top-level item: normal resource bundle access */
icu::LocalUResourceBundlePointer rb(ures_open(path, locale, &errorCode));
LocalUResourceBundlePointer rb(ures_open(path, locale, &errorCode));

if(U_SUCCESS(errorCode)) {
s=ures_getStringByKey(rb.getAlias(), tableKey, &length, &errorCode);
Expand Down Expand Up @@ -539,9 +542,9 @@ uloc_getDisplayName(const char *locale,
{
UErrorCode status = U_ZERO_ERROR;

icu::LocalUResourceBundlePointer locbundle(
LocalUResourceBundlePointer locbundle(
ures_open(U_ICUDATA_LANG, displayLocale, &status));
icu::LocalUResourceBundlePointer dspbundle(
LocalUResourceBundlePointer dspbundle(
ures_getByKeyWithFallback(locbundle.getAlias(), _kLocaleDisplayPattern, nullptr, &status));

separator=ures_getStringByKeyWithFallback(dspbundle.getAlias(), _kSeparator, &sepLen, &status);
Expand Down Expand Up @@ -613,7 +616,7 @@ uloc_getDisplayName(const char *locale,
int32_t langPos=0; /* position in output of language substitution */
int32_t restLen=0; /* length of 'everything else' substitution */
int32_t restPos=0; /* position in output of 'everything else' substitution */
icu::LocalUEnumerationPointer kenum; /* keyword enumeration */
LocalUEnumerationPointer kenum; /* keyword enumeration */

/* prefix of pattern, extremely likely to be empty */
if(sub0Pos) {
Expand Down Expand Up @@ -855,11 +858,11 @@ uloc_getDisplayKeywordValue( const char* locale,
int32_t dispNameLen = 0;
const char16_t *dispName = nullptr;

icu::LocalUResourceBundlePointer bundle(
LocalUResourceBundlePointer bundle(
ures_open(U_ICUDATA_CURR, displayLocale, status));
icu::LocalUResourceBundlePointer currencies(
LocalUResourceBundlePointer currencies(
ures_getByKey(bundle.getAlias(), _kCurrencies, nullptr, status));
icu::LocalUResourceBundlePointer currency(
LocalUResourceBundlePointer currency(
ures_getByKeyWithFallback(currencies.getAlias(), keywordValue.data(), nullptr, status));

dispName = ures_getStringByIndex(currency.getAlias(), UCURRENCY_DISPLAY_NAME_INDEX, &dispNameLen, status);
Expand Down
3 changes: 2 additions & 1 deletion icu4c/source/common/locresdata.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,8 @@ uloc_getTableStringWithFallback(const char *path, const char *locale,
* this falls back through the locale's chain to root
*/
errorCode=U_ZERO_ERROR;
icu::LocalUResourceBundlePointer rb(ures_open(path, locale, &errorCode));
U_ICU_NAMESPACE_OR_INTERNAL::LocalUResourceBundlePointer rb(
ures_open(path, locale, &errorCode));

if(U_FAILURE(errorCode)) {
/* total failure, not even root could be opened */
Expand Down
3 changes: 2 additions & 1 deletion icu4c/source/common/locutil.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,8 @@ LocaleUtility::getAvailableLocaleNames(const UnicodeString& bundleID)
CharString cbundleID;
cbundleID.appendInvariantChars(bundleID, status);
const char* path = cbundleID.isEmpty() ? nullptr : cbundleID.data();
icu::LocalUEnumerationPointer uenum(ures_openAvailableLocales(path, &status));
U_ICU_NAMESPACE_OR_INTERNAL::LocalUEnumerationPointer uenum(
ures_openAvailableLocales(path, &status));
for (;;) {
const char16_t* id = uenum_unext(uenum.getAlias(), nullptr, &status);
if (id == nullptr) {
Expand Down
25 changes: 12 additions & 13 deletions icu4c/source/common/uloc_tag.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@
#include "ulocimp.h"
#include "uassert.h"

using U_ICU_NAMESPACE_OR_INTERNAL::LocalPointer;
using U_ICU_NAMESPACE_OR_INTERNAL::LocalUEnumerationPointer;

namespace {

/* struct holding a single variant */
Expand Down Expand Up @@ -354,10 +357,6 @@ const char*
ultag_getLegacy(const ULanguageTag* langtag);
#endif

} // namespace

U_NAMESPACE_BEGIN

/**
* \class LocalULanguageTagPointer
* "Smart pointer" class, closes a ULanguageTag via ultag_close().
Expand All @@ -369,7 +368,7 @@ U_NAMESPACE_BEGIN
*/
U_DEFINE_LOCAL_OPEN_POINTER(LocalULanguageTagPointer, ULanguageTag, ultag_close);

U_NAMESPACE_END
} // namespace

/*
* -------------------------------------------------
Expand Down Expand Up @@ -869,7 +868,7 @@ namespace {
*/

bool
_addVariantToList(VariantListEntry **first, icu::LocalPointer<VariantListEntry> var) {
_addVariantToList(VariantListEntry **first, LocalPointer<VariantListEntry> var) {
if (*first == nullptr) {
var->next = nullptr;
*first = var.orphan();
Expand Down Expand Up @@ -1212,7 +1211,7 @@ _appendVariantsToLanguageTag(std::string_view localeID, icu::ByteSink& sink, boo
if (_isVariantSubtag(pVar, -1)) {
if (uprv_strcmp(pVar, POSIX_VALUE) || buf.length() != static_cast<int32_t>(uprv_strlen(POSIX_VALUE))) {
/* emit the variant to the list */
icu::LocalPointer<VariantListEntry> var(new VariantListEntry, status);
LocalPointer<VariantListEntry> var(new VariantListEntry, status);
if (U_FAILURE(status)) {
break;
}
Expand Down Expand Up @@ -1284,7 +1283,7 @@ _appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, bool str
icu::MemoryPool<ExtensionListEntry> extPool;
icu::MemoryPool<icu::CharString> strPool;

icu::LocalUEnumerationPointer keywordEnum(uloc_openKeywords(localeID, &status));
LocalUEnumerationPointer keywordEnum(uloc_openKeywords(localeID, &status));
if (U_FAILURE(status) && !hadPosix) {
return;
}
Expand Down Expand Up @@ -1984,7 +1983,7 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode& sta
char *pSubtag, *pNext, *pLastGoodPosition;
int32_t subtagLen;
int32_t extlangIdx;
icu::LocalPointer<ExtensionListEntry> pExtension;
LocalPointer<ExtensionListEntry> pExtension;
char *pExtValueSubtag, *pExtValueSubtagEnd;
int32_t i;
bool privateuseVar = false;
Expand All @@ -2011,7 +2010,7 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode& sta
*(tagBuf + tagLen) = 0;

/* create a ULanguageTag */
icu::LocalULanguageTagPointer t(
LocalULanguageTagPointer t(
static_cast<ULanguageTag*>(uprv_malloc(sizeof(ULanguageTag))));
if (t.isNull()) {
uprv_free(tagBuf);
Expand Down Expand Up @@ -2197,7 +2196,7 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode& sta
if (next & VART) {
if (_isVariantSubtag(pSubtag, subtagLen) ||
(privateuseVar && _isPrivateuseVariantSubtag(pSubtag, subtagLen))) {
icu::LocalPointer<VariantListEntry> var(new VariantListEntry, status);
LocalPointer<VariantListEntry> var(new VariantListEntry, status);
if (U_FAILURE(status)) {
return nullptr;
}
Expand Down Expand Up @@ -2609,7 +2608,7 @@ ulocimp_toLanguageTag(const char* localeID,
int kwdCnt = 0;
bool done = false;

icu::LocalUEnumerationPointer kwdEnum(uloc_openKeywords(canonical.data(), &tmpStatus));
LocalUEnumerationPointer kwdEnum(uloc_openKeywords(canonical.data(), &tmpStatus));
if (U_SUCCESS(tmpStatus)) {
kwdCnt = uenum_count(kwdEnum.getAlias(), &tmpStatus);
if (kwdCnt == 1) {
Expand Down Expand Up @@ -2691,7 +2690,7 @@ ulocimp_forLanguageTag(const char* langtag,
int32_t i, n;
bool noRegion = true;

icu::LocalULanguageTagPointer lt(ultag_parse(langtag, tagLen, parsedLength, status));
LocalULanguageTagPointer lt(ultag_parse(langtag, tagLen, parsedLength, status));
if (U_FAILURE(status)) {
return;
}
Expand Down
51 changes: 47 additions & 4 deletions icu4c/source/common/unicode/char16ptr.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,13 @@

#include "unicode/utypes.h"

#if U_SHOW_CPLUSPLUS_API
#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API

#include <cstddef>
#include <string_view>
#include <type_traits>

#endif

/**
* \file
Expand All @@ -21,8 +24,6 @@
* Also conversion functions from char16_t * to UChar * and OldUChar *.
*/

U_NAMESPACE_BEGIN

/**
* \def U_ALIASING_BARRIER
* Barrier for pointer anti-aliasing optimizations even across function boundaries.
Expand All @@ -36,6 +37,11 @@ U_NAMESPACE_BEGIN
# define U_ALIASING_BARRIER(ptr)
#endif

// ICU DLL-exported
#if U_SHOW_CPLUSPLUS_API

U_NAMESPACE_BEGIN

/**
* char16_t * wrapper with implicit conversion from distinct but bit-compatible pointer types.
* @stable ICU 59
Expand Down Expand Up @@ -251,6 +257,34 @@ const char16_t *ConstChar16Ptr::get() const { return u_.cp; }
#endif
/// \endcond

U_NAMESPACE_END

#endif // U_SHOW_CPLUSPLUS_API

// Usable in header-only definitions
#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API

namespace U_ICU_NAMESPACE_OR_INTERNAL {

#ifndef U_FORCE_HIDE_INTERNAL_API
/** @internal */
template<typename T, typename = std::enable_if_t<std::is_same_v<T, UChar>>>
inline const char16_t *uprv_char16PtrFromUChar(const T *p) {
if constexpr (std::is_same_v<UChar, char16_t>) {
return p;
} else {
#if U_SHOW_CPLUSPLUS_API
return ConstChar16Ptr(p).get();
#else
#ifdef U_ALIASING_BARRIER
U_ALIASING_BARRIER(p);
#endif
return reinterpret_cast<const char16_t *>(p);
#endif
}
}
#endif

/**
* Converts from const char16_t * to const UChar *.
* Includes an aliasing barrier if available.
Expand Down Expand Up @@ -307,6 +341,15 @@ inline OldUChar *toOldUCharPtr(char16_t *p) {
return reinterpret_cast<OldUChar *>(p);
}

} // U_ICU_NAMESPACE_OR_INTERNAL

#endif // U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API

// ICU DLL-exported
#if U_SHOW_CPLUSPLUS_API

U_NAMESPACE_BEGIN

#ifndef U_FORCE_HIDE_INTERNAL_API
/**
* Is T convertible to a std::u16string_view or some other 16-bit string view?
Expand Down Expand Up @@ -379,6 +422,6 @@ inline std::u16string_view toU16StringViewNullable(const T& text) {

U_NAMESPACE_END

#endif /* U_SHOW_CPLUSPLUS_API */
#endif // U_SHOW_CPLUSPLUS_API

#endif // __CHAR16PTR_H__
13 changes: 7 additions & 6 deletions icu4c/source/common/unicode/localpointer.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

/**
* \file
* \brief C++ API: "Smart pointers" for use with and in ICU4C C++ code.
* \brief C++ header-only API: "Smart pointers" for use with and in ICU4C C++ code.
*
* These classes are inspired by
* - std::auto_ptr
Expand All @@ -40,11 +40,11 @@

#include "unicode/utypes.h"

#if U_SHOW_CPLUSPLUS_API
#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API

#include <memory>

U_NAMESPACE_BEGIN
namespace U_ICU_NAMESPACE_OR_INTERNAL {

/**
* "Smart pointer" base class; do not use directly: use LocalPointer etc.
Expand Down Expand Up @@ -548,7 +548,8 @@ class LocalArray : public LocalPointerBase<T> {
* @stable ICU 4.4
*/
#define U_DEFINE_LOCAL_OPEN_POINTER(LocalPointerClassName, Type, closeFunction) \
using LocalPointerClassName = internal::LocalOpenPointer<Type, closeFunction>
using LocalPointerClassName = \
U_ICU_NAMESPACE_OR_INTERNAL::internal::LocalOpenPointer<Type, closeFunction>

#ifndef U_IN_DOXYGEN
namespace internal {
Expand Down Expand Up @@ -603,7 +604,7 @@ class LocalOpenPointer : public LocalPointerBase<Type> {
} // namespace internal
#endif

U_NAMESPACE_END
} // U_ICU_NAMESPACE_OR_INTERNAL

#endif /* U_SHOW_CPLUSPLUS_API */
#endif // U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API
#endif /* __LOCALPOINTER_H__ */
4 changes: 2 additions & 2 deletions icu4c/source/common/unicode/normlzr.h
Original file line number Diff line number Diff line change
Expand Up @@ -801,8 +801,8 @@ Normalizer::compare(const UnicodeString &s1, const UnicodeString &s2,
uint32_t options,
UErrorCode &errorCode) {
// all argument checking is done in unorm_compare
return unorm_compare(toUCharPtr(s1.getBuffer()), s1.length(),
toUCharPtr(s2.getBuffer()), s2.length(),
return unorm_compare(U_ICU_NAMESPACE_OR_INTERNAL::toUCharPtr(s1.getBuffer()), s1.length(),
U_ICU_NAMESPACE_OR_INTERNAL::toUCharPtr(s2.getBuffer()), s2.length(),
options,
&errorCode);
}
Expand Down
8 changes: 3 additions & 5 deletions icu4c/source/common/unicode/ubidi.h
Original file line number Diff line number Diff line change
Expand Up @@ -563,9 +563,8 @@ ubidi_openSized(int32_t maxLength, int32_t maxRunCount, UErrorCode *pErrorCode);
U_CAPI void U_EXPORT2
ubidi_close(UBiDi *pBiDi);

#if U_SHOW_CPLUSPLUS_API

U_NAMESPACE_BEGIN
#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API
namespace U_ICU_NAMESPACE_OR_INTERNAL {

/**
* \class LocalUBiDiPointer
Expand All @@ -578,8 +577,7 @@ U_NAMESPACE_BEGIN
*/
U_DEFINE_LOCAL_OPEN_POINTER(LocalUBiDiPointer, UBiDi, ubidi_close);

U_NAMESPACE_END

}
#endif

/**
Expand Down
8 changes: 3 additions & 5 deletions icu4c/source/common/unicode/ubiditransform.h
Original file line number Diff line number Diff line change
Expand Up @@ -304,9 +304,8 @@ ubiditransform_open(UErrorCode *pErrorCode);
U_CAPI void U_EXPORT2
ubiditransform_close(UBiDiTransform *pBidiTransform);

#if U_SHOW_CPLUSPLUS_API

U_NAMESPACE_BEGIN
#if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API
namespace U_ICU_NAMESPACE_OR_INTERNAL {

/**
* \class LocalUBiDiTransformPointer
Expand All @@ -319,8 +318,7 @@ U_NAMESPACE_BEGIN
*/
U_DEFINE_LOCAL_OPEN_POINTER(LocalUBiDiTransformPointer, UBiDiTransform, ubiditransform_close);

U_NAMESPACE_END

}
#endif

#endif
Loading