intl/icu/source/common/unicode/localpointer.h

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /*
     2 *******************************************************************************
     3 *
     4 *   Copyright (C) 2009-2012, International Business Machines
     5 *   Corporation and others.  All Rights Reserved.
     6 *
     7 *******************************************************************************
     8 *   file name:  localpointer.h
     9 *   encoding:   US-ASCII
    10 *   tab size:   8 (not used)
    11 *   indentation:4
    12 *
    13 *   created on: 2009nov13
    14 *   created by: Markus W. Scherer
    15 */
    17 #ifndef __LOCALPOINTER_H__
    18 #define __LOCALPOINTER_H__
    20 /**
    21  * \file 
    22  * \brief C++ API: "Smart pointers" for use with and in ICU4C C++ code.
    23  *
    24  * These classes are inspired by
    25  * - std::auto_ptr
    26  * - boost::scoped_ptr & boost::scoped_array
    27  * - Taligent Safe Pointers (TOnlyPointerTo)
    28  *
    29  * but none of those provide for all of the goals for ICU smart pointers:
    30  * - Smart pointer owns the object and releases it when it goes out of scope.
    31  * - No transfer of ownership via copy/assignment to reduce misuse. Simpler & more robust.
    32  * - ICU-compatible: No exceptions.
    33  * - Need to be able to orphan/release the pointer and its ownership.
    34  * - Need variants for normal C++ object pointers, C++ arrays, and ICU C service objects.
    35  *
    36  * For details see http://site.icu-project.org/design/cpp/scoped_ptr
    37  */
    39 #include "unicode/utypes.h"
    41 #if U_SHOW_CPLUSPLUS_API
    43 U_NAMESPACE_BEGIN
    45 /**
    46  * "Smart pointer" base class; do not use directly: use LocalPointer etc.
    47  *
    48  * Base class for smart pointer classes that do not throw exceptions.
    49  *
    50  * Do not use this base class directly, since it does not delete its pointer.
    51  * A subclass must implement methods that delete the pointer:
    52  * Destructor and adoptInstead().
    53  *
    54  * There is no operator T *() provided because the programmer must decide
    55  * whether to use getAlias() (without transfer of ownership) or orpan()
    56  * (with transfer of ownership and NULLing of the pointer).
    57  *
    58  * @see LocalPointer
    59  * @see LocalArray
    60  * @see U_DEFINE_LOCAL_OPEN_POINTER
    61  * @stable ICU 4.4
    62  */
    63 template<typename T>
    64 class LocalPointerBase {
    65 public:
    66     /**
    67      * Constructor takes ownership.
    68      * @param p simple pointer to an object that is adopted
    69      * @stable ICU 4.4
    70      */
    71     explicit LocalPointerBase(T *p=NULL) : ptr(p) {}
    72     /**
    73      * Destructor deletes the object it owns.
    74      * Subclass must override: Base class does nothing.
    75      * @stable ICU 4.4
    76      */
    77     ~LocalPointerBase() { /* delete ptr; */ }
    78     /**
    79      * NULL check.
    80      * @return TRUE if ==NULL
    81      * @stable ICU 4.4
    82      */
    83     UBool isNull() const { return ptr==NULL; }
    84     /**
    85      * NULL check.
    86      * @return TRUE if !=NULL
    87      * @stable ICU 4.4
    88      */
    89     UBool isValid() const { return ptr!=NULL; }
    90     /**
    91      * Comparison with a simple pointer, so that existing code
    92      * with ==NULL need not be changed.
    93      * @param other simple pointer for comparison
    94      * @return true if this pointer value equals other
    95      * @stable ICU 4.4
    96      */
    97     bool operator==(const T *other) const { return ptr==other; }
    98     /**
    99      * Comparison with a simple pointer, so that existing code
   100      * with !=NULL need not be changed.
   101      * @param other simple pointer for comparison
   102      * @return true if this pointer value differs from other
   103      * @stable ICU 4.4
   104      */
   105     bool operator!=(const T *other) const { return ptr!=other; }
   106     /**
   107      * Access without ownership change.
   108      * @return the pointer value
   109      * @stable ICU 4.4
   110      */
   111     T *getAlias() const { return ptr; }
   112     /**
   113      * Access without ownership change.
   114      * @return the pointer value as a reference
   115      * @stable ICU 4.4
   116      */
   117     T &operator*() const { return *ptr; }
   118     /**
   119      * Access without ownership change.
   120      * @return the pointer value
   121      * @stable ICU 4.4
   122      */
   123     T *operator->() const { return ptr; }
   124     /**
   125      * Gives up ownership; the internal pointer becomes NULL.
   126      * @return the pointer value;
   127      *         caller becomes responsible for deleting the object
   128      * @stable ICU 4.4
   129      */
   130     T *orphan() {
   131         T *p=ptr;
   132         ptr=NULL;
   133         return p;
   134     }
   135     /**
   136      * Deletes the object it owns,
   137      * and adopts (takes ownership of) the one passed in.
   138      * Subclass must override: Base class does not delete the object.
   139      * @param p simple pointer to an object that is adopted
   140      * @stable ICU 4.4
   141      */
   142     void adoptInstead(T *p) {
   143         // delete ptr;
   144         ptr=p;
   145     }
   146 protected:
   147     /**
   148      * Actual pointer.
   149      * @internal
   150      */
   151     T *ptr;
   152 private:
   153     // No comparison operators with other LocalPointerBases.
   154     bool operator==(const LocalPointerBase &other);
   155     bool operator!=(const LocalPointerBase &other);
   156     // No ownership transfer: No copy constructor, no assignment operator.
   157     LocalPointerBase(const LocalPointerBase &other);
   158     void operator=(const LocalPointerBase &other);
   159     // No heap allocation. Use only on the stack.
   160     static void * U_EXPORT2 operator new(size_t size);
   161     static void * U_EXPORT2 operator new[](size_t size);
   162 #if U_HAVE_PLACEMENT_NEW
   163     static void * U_EXPORT2 operator new(size_t, void *ptr);
   164 #endif
   165 };
   167 /**
   168  * "Smart pointer" class, deletes objects via the standard C++ delete operator.
   169  * For most methods see the LocalPointerBase base class.
   170  *
   171  * Usage example:
   172  * \code
   173  * LocalPointer<UnicodeString> s(new UnicodeString((UChar32)0x50005));
   174  * int32_t length=s->length();  // 2
   175  * UChar lead=s->charAt(0);  // 0xd900
   176  * if(some condition) { return; }  // no need to explicitly delete the pointer
   177  * s.adoptInstead(new UnicodeString((UChar)0xfffc));
   178  * length=s->length();  // 1
   179  * // no need to explicitly delete the pointer
   180  * \endcode
   181  *
   182  * @see LocalPointerBase
   183  * @stable ICU 4.4
   184  */
   185 template<typename T>
   186 class LocalPointer : public LocalPointerBase<T> {
   187 public:
   188     /**
   189      * Constructor takes ownership.
   190      * @param p simple pointer to an object that is adopted
   191      * @stable ICU 4.4
   192      */
   193     explicit LocalPointer(T *p=NULL) : LocalPointerBase<T>(p) {}
   194     /**
   195      * Destructor deletes the object it owns.
   196      * @stable ICU 4.4
   197      */
   198     ~LocalPointer() {
   199         delete LocalPointerBase<T>::ptr;
   200     }
   201     /**
   202      * Deletes the object it owns,
   203      * and adopts (takes ownership of) the one passed in.
   204      * @param p simple pointer to an object that is adopted
   205      * @stable ICU 4.4
   206      */
   207     void adoptInstead(T *p) {
   208         delete LocalPointerBase<T>::ptr;
   209         LocalPointerBase<T>::ptr=p;
   210     }
   211 };
   213 /**
   214  * "Smart pointer" class, deletes objects via the C++ array delete[] operator.
   215  * For most methods see the LocalPointerBase base class.
   216  * Adds operator[] for array item access.
   217  *
   218  * Usage example:
   219  * \code
   220  * LocalArray<UnicodeString> a(new UnicodeString[2]);
   221  * a[0].append((UChar)0x61);
   222  * if(some condition) { return; }  // no need to explicitly delete the array
   223  * a.adoptInstead(new UnicodeString[4]);
   224  * a[3].append((UChar)0x62).append((UChar)0x63).reverse();
   225  * // no need to explicitly delete the array
   226  * \endcode
   227  *
   228  * @see LocalPointerBase
   229  * @stable ICU 4.4
   230  */
   231 template<typename T>
   232 class LocalArray : public LocalPointerBase<T> {
   233 public:
   234     /**
   235      * Constructor takes ownership.
   236      * @param p simple pointer to an array of T objects that is adopted
   237      * @stable ICU 4.4
   238      */
   239     explicit LocalArray(T *p=NULL) : LocalPointerBase<T>(p) {}
   240     /**
   241      * Destructor deletes the array it owns.
   242      * @stable ICU 4.4
   243      */
   244     ~LocalArray() {
   245         delete[] LocalPointerBase<T>::ptr;
   246     }
   247     /**
   248      * Deletes the array it owns,
   249      * and adopts (takes ownership of) the one passed in.
   250      * @param p simple pointer to an array of T objects that is adopted
   251      * @stable ICU 4.4
   252      */
   253     void adoptInstead(T *p) {
   254         delete[] LocalPointerBase<T>::ptr;
   255         LocalPointerBase<T>::ptr=p;
   256     }
   257     /**
   258      * Array item access (writable).
   259      * No index bounds check.
   260      * @param i array index
   261      * @return reference to the array item
   262      * @stable ICU 4.4
   263      */
   264     T &operator[](ptrdiff_t i) const { return LocalPointerBase<T>::ptr[i]; }
   265 };
   267 /**
   268  * \def U_DEFINE_LOCAL_OPEN_POINTER
   269  * "Smart pointer" definition macro, deletes objects via the closeFunction.
   270  * Defines a subclass of LocalPointerBase which works just
   271  * like LocalPointer<Type> except that this subclass will use the closeFunction
   272  * rather than the C++ delete operator.
   273  *
   274  * Requirement: The closeFunction must tolerate a NULL pointer.
   275  * (We could add a NULL check here but it is normally redundant.)
   276  *
   277  * Usage example:
   278  * \code
   279  * LocalUCaseMapPointer csm(ucasemap_open(localeID, options, &errorCode));
   280  * utf8OutLength=ucasemap_utf8ToLower(csm.getAlias(),
   281  *     utf8Out, (int32_t)sizeof(utf8Out),
   282  *     utf8In, utf8InLength, &errorCode);
   283  * if(U_FAILURE(errorCode)) { return; }  // no need to explicitly delete the UCaseMap
   284  * \endcode
   285  *
   286  * @see LocalPointerBase
   287  * @see LocalPointer
   288  * @stable ICU 4.4
   289  */
   290 #define U_DEFINE_LOCAL_OPEN_POINTER(LocalPointerClassName, Type, closeFunction) \
   291     class LocalPointerClassName : public LocalPointerBase<Type> { \
   292     public: \
   293         explicit LocalPointerClassName(Type *p=NULL) : LocalPointerBase<Type>(p) {} \
   294         ~LocalPointerClassName() { closeFunction(ptr); } \
   295         void adoptInstead(Type *p) { \
   296             closeFunction(ptr); \
   297             ptr=p; \
   298         } \
   299     }
   301 U_NAMESPACE_END
   303 #endif  /* U_SHOW_CPLUSPLUS_API */
   304 #endif  /* __LOCALPOINTER_H__ */

mercurial