@@ -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
592598U_NAMESPACE_END
593599
0 commit comments