123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570 |
- #ifndef __LOCALPOINTER_H__
- #define __LOCALPOINTER_H__
- #include "unicode/utypes.h"
- #if U_SHOW_CPLUSPLUS_API
- U_NAMESPACE_BEGIN
- template<typename T>
- class LocalPointerBase {
- public:
-
- explicit LocalPointerBase(T *p=NULL) : ptr(p) {}
-
- ~LocalPointerBase() { }
-
- UBool isNull() const { return ptr==NULL; }
-
- UBool isValid() const { return ptr!=NULL; }
-
- bool operator==(const T *other) const { return ptr==other; }
-
- bool operator!=(const T *other) const { return ptr!=other; }
-
- T *getAlias() const { return ptr; }
-
- T &operator*() const { return *ptr; }
-
- T *operator->() const { return ptr; }
-
- T *orphan() {
- T *p=ptr;
- ptr=NULL;
- return p;
- }
-
- void adoptInstead(T *p) {
-
- ptr=p;
- }
- protected:
-
- T *ptr;
- private:
-
- bool operator==(const LocalPointerBase<T> &other);
- bool operator!=(const LocalPointerBase<T> &other);
-
- LocalPointerBase(const LocalPointerBase<T> &other);
- void operator=(const LocalPointerBase<T> &other);
-
- static void * U_EXPORT2 operator new(size_t size);
- static void * U_EXPORT2 operator new[](size_t size);
- #if U_HAVE_PLACEMENT_NEW
- static void * U_EXPORT2 operator new(size_t, void *ptr);
- #endif
- };
- template<typename T>
- class LocalPointer : public LocalPointerBase<T> {
- public:
- using LocalPointerBase<T>::operator*;
- using LocalPointerBase<T>::operator->;
-
- explicit LocalPointer(T *p=NULL) : LocalPointerBase<T>(p) {}
-
- LocalPointer(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
- if(p==NULL && U_SUCCESS(errorCode)) {
- errorCode=U_MEMORY_ALLOCATION_ERROR;
- }
- }
- #ifndef U_HIDE_DRAFT_API
- #if U_HAVE_RVALUE_REFERENCES
-
- LocalPointer(LocalPointer<T> &&src) U_NOEXCEPT : LocalPointerBase<T>(src.ptr) {
- src.ptr=NULL;
- }
- #endif
- #endif
-
- ~LocalPointer() {
- delete LocalPointerBase<T>::ptr;
- }
- #ifndef U_HIDE_DRAFT_API
- #if U_HAVE_RVALUE_REFERENCES
-
- LocalPointer<T> &operator=(LocalPointer<T> &&src) U_NOEXCEPT {
- return moveFrom(src);
- }
- #endif
-
- LocalPointer<T> &moveFrom(LocalPointer<T> &src) U_NOEXCEPT {
- delete LocalPointerBase<T>::ptr;
- LocalPointerBase<T>::ptr=src.ptr;
- src.ptr=NULL;
- return *this;
- }
-
- void swap(LocalPointer<T> &other) U_NOEXCEPT {
- T *temp=LocalPointerBase<T>::ptr;
- LocalPointerBase<T>::ptr=other.ptr;
- other.ptr=temp;
- }
- #endif
-
- friend inline void swap(LocalPointer<T> &p1, LocalPointer<T> &p2) U_NOEXCEPT {
- p1.swap(p2);
- }
-
- void adoptInstead(T *p) {
- delete LocalPointerBase<T>::ptr;
- LocalPointerBase<T>::ptr=p;
- }
-
- void adoptInsteadAndCheckErrorCode(T *p, UErrorCode &errorCode) {
- if(U_SUCCESS(errorCode)) {
- delete LocalPointerBase<T>::ptr;
- LocalPointerBase<T>::ptr=p;
- if(p==NULL) {
- errorCode=U_MEMORY_ALLOCATION_ERROR;
- }
- } else {
- delete p;
- }
- }
- };
- template<typename T>
- class LocalArray : public LocalPointerBase<T> {
- public:
- using LocalPointerBase<T>::operator*;
- using LocalPointerBase<T>::operator->;
-
- explicit LocalArray(T *p=NULL) : LocalPointerBase<T>(p) {}
- #ifndef U_HIDE_DRAFT_API
-
- LocalArray(T *p, UErrorCode &errorCode) : LocalPointerBase<T>(p) {
- if(p==NULL && U_SUCCESS(errorCode)) {
- errorCode=U_MEMORY_ALLOCATION_ERROR;
- }
- }
- #if U_HAVE_RVALUE_REFERENCES
-
- LocalArray(LocalArray<T> &&src) U_NOEXCEPT : LocalPointerBase<T>(src.ptr) {
- src.ptr=NULL;
- }
- #endif
- #endif
-
- ~LocalArray() {
- delete[] LocalPointerBase<T>::ptr;
- }
- #ifndef U_HIDE_DRAFT_API
- #if U_HAVE_RVALUE_REFERENCES
-
- LocalArray<T> &operator=(LocalArray<T> &&src) U_NOEXCEPT {
- return moveFrom(src);
- }
- #endif
-
- LocalArray<T> &moveFrom(LocalArray<T> &src) U_NOEXCEPT {
- delete[] LocalPointerBase<T>::ptr;
- LocalPointerBase<T>::ptr=src.ptr;
- src.ptr=NULL;
- return *this;
- }
-
- void swap(LocalArray<T> &other) U_NOEXCEPT {
- T *temp=LocalPointerBase<T>::ptr;
- LocalPointerBase<T>::ptr=other.ptr;
- other.ptr=temp;
- }
- #endif
-
- friend inline void swap(LocalArray<T> &p1, LocalArray<T> &p2) U_NOEXCEPT {
- p1.swap(p2);
- }
-
- void adoptInstead(T *p) {
- delete[] LocalPointerBase<T>::ptr;
- LocalPointerBase<T>::ptr=p;
- }
- #ifndef U_HIDE_DRAFT_API
-
- void adoptInsteadAndCheckErrorCode(T *p, UErrorCode &errorCode) {
- if(U_SUCCESS(errorCode)) {
- delete[] LocalPointerBase<T>::ptr;
- LocalPointerBase<T>::ptr=p;
- if(p==NULL) {
- errorCode=U_MEMORY_ALLOCATION_ERROR;
- }
- } else {
- delete[] p;
- }
- }
- #endif
-
- T &operator[](ptrdiff_t i) const { return LocalPointerBase<T>::ptr[i]; }
- };
- #if U_HAVE_RVALUE_REFERENCES
- #define U_DEFINE_LOCAL_OPEN_POINTER(LocalPointerClassName, Type, closeFunction) \
- class LocalPointerClassName : public LocalPointerBase<Type> { \
- public: \
- using LocalPointerBase<Type>::operator*; \
- using LocalPointerBase<Type>::operator->; \
- explicit LocalPointerClassName(Type *p=NULL) : LocalPointerBase<Type>(p) {} \
- LocalPointerClassName(LocalPointerClassName &&src) U_NOEXCEPT \
- : LocalPointerBase<Type>(src.ptr) { \
- src.ptr=NULL; \
- } \
- ~LocalPointerClassName() { closeFunction(ptr); } \
- LocalPointerClassName &operator=(LocalPointerClassName &&src) U_NOEXCEPT { \
- return moveFrom(src); \
- } \
- LocalPointerClassName &moveFrom(LocalPointerClassName &src) U_NOEXCEPT { \
- closeFunction(ptr); \
- LocalPointerBase<Type>::ptr=src.ptr; \
- src.ptr=NULL; \
- return *this; \
- } \
- void swap(LocalPointerClassName &other) U_NOEXCEPT { \
- Type *temp=LocalPointerBase<Type>::ptr; \
- LocalPointerBase<Type>::ptr=other.ptr; \
- other.ptr=temp; \
- } \
- friend inline void swap(LocalPointerClassName &p1, LocalPointerClassName &p2) U_NOEXCEPT { \
- p1.swap(p2); \
- } \
- void adoptInstead(Type *p) { \
- closeFunction(ptr); \
- ptr=p; \
- } \
- }
- #else
- #define U_DEFINE_LOCAL_OPEN_POINTER(LocalPointerClassName, Type, closeFunction) \
- class LocalPointerClassName : public LocalPointerBase<Type> { \
- public: \
- using LocalPointerBase<Type>::operator*; \
- using LocalPointerBase<Type>::operator->; \
- explicit LocalPointerClassName(Type *p=NULL) : LocalPointerBase<Type>(p) {} \
- ~LocalPointerClassName() { closeFunction(ptr); } \
- LocalPointerClassName &moveFrom(LocalPointerClassName &src) U_NOEXCEPT { \
- closeFunction(ptr); \
- LocalPointerBase<Type>::ptr=src.ptr; \
- src.ptr=NULL; \
- return *this; \
- } \
- void swap(LocalPointerClassName &other) U_NOEXCEPT { \
- Type *temp=LocalPointerBase<Type>::ptr; \
- LocalPointerBase<Type>::ptr=other.ptr; \
- other.ptr=temp; \
- } \
- friend inline void swap(LocalPointerClassName &p1, LocalPointerClassName &p2) U_NOEXCEPT { \
- p1.swap(p2); \
- } \
- void adoptInstead(Type *p) { \
- closeFunction(ptr); \
- ptr=p; \
- } \
- }
- #endif
- U_NAMESPACE_END
- #endif
- #endif
|