diff --git a/icu4c/source/common/unicode/localpointer.h b/icu4c/source/common/unicode/localpointer.h index b8be3d7942ea..f70ac9c7108e 100644 --- a/icu4c/source/common/unicode/localpointer.h +++ b/icu4c/source/common/unicode/localpointer.h @@ -548,46 +548,52 @@ class LocalArray : public LocalPointerBase { * @stable ICU 4.4 */ #define U_DEFINE_LOCAL_OPEN_POINTER(LocalPointerClassName, Type, closeFunction) \ - class LocalPointerClassName : public LocalPointerBase { \ - public: \ - using LocalPointerBase::operator*; \ - using LocalPointerBase::operator->; \ - explicit LocalPointerClassName(Type *p=nullptr) : LocalPointerBase(p) {} \ - LocalPointerClassName(LocalPointerClassName &&src) noexcept \ - : LocalPointerBase(src.ptr) { \ - src.ptr=nullptr; \ - } \ - /* TODO: Be agnostic of the deleter function signature from the user-provided std::unique_ptr? */ \ - explicit LocalPointerClassName(std::unique_ptr &&p) \ - : LocalPointerBase(p.release()) {} \ - ~LocalPointerClassName() { if (ptr != nullptr) { closeFunction(ptr); } } \ - LocalPointerClassName &operator=(LocalPointerClassName &&src) noexcept { \ - if (ptr != nullptr) { closeFunction(ptr); } \ - LocalPointerBase::ptr=src.ptr; \ - src.ptr=nullptr; \ - return *this; \ - } \ - /* TODO: Be agnostic of the deleter function signature from the user-provided std::unique_ptr? */ \ - LocalPointerClassName &operator=(std::unique_ptr &&p) { \ - adoptInstead(p.release()); \ - return *this; \ - } \ - void swap(LocalPointerClassName &other) noexcept { \ - Type *temp=LocalPointerBase::ptr; \ - LocalPointerBase::ptr=other.ptr; \ - other.ptr=temp; \ - } \ - friend inline void swap(LocalPointerClassName &p1, LocalPointerClassName &p2) noexcept { \ - p1.swap(p2); \ - } \ - void adoptInstead(Type *p) { \ - if (ptr != nullptr) { closeFunction(ptr); } \ - ptr=p; \ - } \ - operator std::unique_ptr () && { \ - return std::unique_ptr(LocalPointerBase::orphan(), closeFunction); \ - } \ + using LocalPointerClassName = LocalOpenPointer + +#ifndef U_IN_DOXYGEN +template +class LocalOpenPointer : public LocalPointerBase { + using LocalPointerBase::ptr; +public: + using LocalPointerBase::operator*; + using LocalPointerBase::operator->; + explicit LocalOpenPointer(Type *p=nullptr) : LocalPointerBase(p) {} + LocalOpenPointer(LocalOpenPointer &&src) noexcept + : LocalPointerBase(src.ptr) { + src.ptr=nullptr; + } + /* TODO: Be agnostic of the deleter function signature from the user-provided std::unique_ptr? */ + explicit LocalOpenPointer(std::unique_ptr &&p) + : LocalPointerBase(p.release()) {} + ~LocalOpenPointer() { if (ptr != nullptr) { closeFunction(ptr); } } + LocalOpenPointer &operator=(LocalOpenPointer &&src) noexcept { + if (ptr != nullptr) { closeFunction(ptr); } + LocalPointerBase::ptr=src.ptr; + src.ptr=nullptr; + return *this; + } + /* TODO: Be agnostic of the deleter function signature from the user-provided std::unique_ptr? */ + LocalOpenPointer &operator=(std::unique_ptr &&p) { + adoptInstead(p.release()); + return *this; } + void swap(LocalOpenPointer &other) noexcept { + Type *temp=LocalPointerBase::ptr; + LocalPointerBase::ptr=other.ptr; + other.ptr=temp; + } + friend inline void swap(LocalOpenPointer &p1, LocalOpenPointer &p2) noexcept { + p1.swap(p2); + } + void adoptInstead(Type *p) { + if (ptr != nullptr) { closeFunction(ptr); } + ptr=p; + } + operator std::unique_ptr () && { + return std::unique_ptr(LocalPointerBase::orphan(), closeFunction); + } +}; +#endif U_NAMESPACE_END diff --git a/icu4c/source/tools/pkgdata/pkgdata.cpp b/icu4c/source/tools/pkgdata/pkgdata.cpp index c2ac112f6efc..53def1bdc49c 100644 --- a/icu4c/source/tools/pkgdata/pkgdata.cpp +++ b/icu4c/source/tools/pkgdata/pkgdata.cpp @@ -60,11 +60,9 @@ U_CDECL_BEGIN U_CDECL_END #if U_HAVE_POPEN - -using icu::LocalPointerBase; - +U_NAMESPACE_BEGIN U_DEFINE_LOCAL_OPEN_POINTER(LocalPipeFilePointer, FILE, pclose); - +U_NAMESPACE_END #endif using icu::LocalMemory; @@ -2184,7 +2182,7 @@ static void loadLists(UPKGOptions *o, UErrorCode *status) static UBool getPkgDataPath(const char *cmd, UBool verbose, char *buf, size_t items) { icu::CharString cmdBuf; UErrorCode status = U_ZERO_ERROR; - LocalPipeFilePointer p; + icu::LocalPipeFilePointer p; size_t n; cmdBuf.append(cmd, status);