Skip to content

Commit 6fa113e

Browse files
committed
ICU-22651 Refactor U_DEFINE_LOCAL_OPEN_POINTER into a template.
1 parent b827157 commit 6fa113e

File tree

2 files changed

+48
-44
lines changed

2 files changed

+48
-44
lines changed

icu4c/source/common/unicode/localpointer.h

Lines changed: 45 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -548,46 +548,52 @@ class LocalArray : public LocalPointerBase<T> {
548548
* @stable ICU 4.4
549549
*/
550550
#define U_DEFINE_LOCAL_OPEN_POINTER(LocalPointerClassName, Type, closeFunction) \
551-
class LocalPointerClassName : public LocalPointerBase<Type> { \
552-
public: \
553-
using LocalPointerBase<Type>::operator*; \
554-
using LocalPointerBase<Type>::operator->; \
555-
explicit LocalPointerClassName(Type *p=nullptr) : LocalPointerBase<Type>(p) {} \
556-
LocalPointerClassName(LocalPointerClassName &&src) noexcept \
557-
: LocalPointerBase<Type>(src.ptr) { \
558-
src.ptr=nullptr; \
559-
} \
560-
/* TODO: Be agnostic of the deleter function signature from the user-provided std::unique_ptr? */ \
561-
explicit LocalPointerClassName(std::unique_ptr<Type, decltype(&closeFunction)> &&p) \
562-
: LocalPointerBase<Type>(p.release()) {} \
563-
~LocalPointerClassName() { if (ptr != nullptr) { closeFunction(ptr); } } \
564-
LocalPointerClassName &operator=(LocalPointerClassName &&src) noexcept { \
565-
if (ptr != nullptr) { closeFunction(ptr); } \
566-
LocalPointerBase<Type>::ptr=src.ptr; \
567-
src.ptr=nullptr; \
568-
return *this; \
569-
} \
570-
/* TODO: Be agnostic of the deleter function signature from the user-provided std::unique_ptr? */ \
571-
LocalPointerClassName &operator=(std::unique_ptr<Type, decltype(&closeFunction)> &&p) { \
572-
adoptInstead(p.release()); \
573-
return *this; \
574-
} \
575-
void swap(LocalPointerClassName &other) noexcept { \
576-
Type *temp=LocalPointerBase<Type>::ptr; \
577-
LocalPointerBase<Type>::ptr=other.ptr; \
578-
other.ptr=temp; \
579-
} \
580-
friend inline void swap(LocalPointerClassName &p1, LocalPointerClassName &p2) noexcept { \
581-
p1.swap(p2); \
582-
} \
583-
void adoptInstead(Type *p) { \
584-
if (ptr != nullptr) { closeFunction(ptr); } \
585-
ptr=p; \
586-
} \
587-
operator std::unique_ptr<Type, decltype(&closeFunction)> () && { \
588-
return std::unique_ptr<Type, decltype(&closeFunction)>(LocalPointerBase<Type>::orphan(), closeFunction); \
589-
} \
551+
using LocalPointerClassName = LocalOpenPointer<Type, closeFunction>
552+
553+
#ifndef U_IN_DOXYGEN
554+
template <typename Type, auto closeFunction>
555+
class LocalOpenPointer : public LocalPointerBase<Type> {
556+
using LocalPointerBase<Type>::ptr;
557+
public:
558+
using LocalPointerBase<Type>::operator*;
559+
using LocalPointerBase<Type>::operator->;
560+
explicit LocalOpenPointer(Type *p=nullptr) : LocalPointerBase<Type>(p) {}
561+
LocalOpenPointer(LocalOpenPointer &&src) noexcept
562+
: LocalPointerBase<Type>(src.ptr) {
563+
src.ptr=nullptr;
564+
}
565+
/* TODO: Be agnostic of the deleter function signature from the user-provided std::unique_ptr? */
566+
explicit LocalOpenPointer(std::unique_ptr<Type, decltype(closeFunction)> &&p)
567+
: LocalPointerBase<Type>(p.release()) {}
568+
~LocalOpenPointer() { if (ptr != nullptr) { closeFunction(ptr); } }
569+
LocalOpenPointer &operator=(LocalOpenPointer &&src) noexcept {
570+
if (ptr != nullptr) { closeFunction(ptr); }
571+
LocalPointerBase<Type>::ptr=src.ptr;
572+
src.ptr=nullptr;
573+
return *this;
574+
}
575+
/* TODO: Be agnostic of the deleter function signature from the user-provided std::unique_ptr? */
576+
LocalOpenPointer &operator=(std::unique_ptr<Type, decltype(closeFunction)> &&p) {
577+
adoptInstead(p.release());
578+
return *this;
590579
}
580+
void swap(LocalOpenPointer &other) noexcept {
581+
Type *temp=LocalPointerBase<Type>::ptr;
582+
LocalPointerBase<Type>::ptr=other.ptr;
583+
other.ptr=temp;
584+
}
585+
friend inline void swap(LocalOpenPointer &p1, LocalOpenPointer &p2) noexcept {
586+
p1.swap(p2);
587+
}
588+
void adoptInstead(Type *p) {
589+
if (ptr != nullptr) { closeFunction(ptr); }
590+
ptr=p;
591+
}
592+
operator std::unique_ptr<Type, decltype(closeFunction)> () && {
593+
return std::unique_ptr<Type, decltype(closeFunction)>(LocalPointerBase<Type>::orphan(), closeFunction);
594+
}
595+
};
596+
#endif
591597

592598
U_NAMESPACE_END
593599

icu4c/source/tools/pkgdata/pkgdata.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,9 @@ U_CDECL_BEGIN
6060
U_CDECL_END
6161

6262
#if U_HAVE_POPEN
63-
64-
using icu::LocalPointerBase;
65-
63+
U_NAMESPACE_BEGIN
6664
U_DEFINE_LOCAL_OPEN_POINTER(LocalPipeFilePointer, FILE, pclose);
67-
65+
U_NAMESPACE_END
6866
#endif
6967

7068
using icu::LocalMemory;
@@ -2184,7 +2182,7 @@ static void loadLists(UPKGOptions *o, UErrorCode *status)
21842182
static UBool getPkgDataPath(const char *cmd, UBool verbose, char *buf, size_t items) {
21852183
icu::CharString cmdBuf;
21862184
UErrorCode status = U_ZERO_ERROR;
2187-
LocalPipeFilePointer p;
2185+
icu::LocalPipeFilePointer p;
21882186
size_t n;
21892187

21902188
cmdBuf.append(cmd, status);

0 commit comments

Comments
 (0)