@@ -548,46 +548,52 @@ class LocalArray : public LocalPointerBase<T> {
548
548
* @stable ICU 4.4
549
549
*/
550
550
#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 ;
590
579
}
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
591
597
592
598
U_NAMESPACE_END
593
599
0 commit comments