16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************* 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Copyright (C) 2009-2012, International Business Machines 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Corporation and others. All Rights Reserved. 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************* 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* file name: localpointer.h 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* encoding: US-ASCII 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* tab size: 8 (not used) 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* indentation:4 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* created on: 2009nov13 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* created by: Markus W. Scherer 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef __LOCALPOINTER_H__ 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define __LOCALPOINTER_H__ 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \file 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \brief C++ API: "Smart pointers" for use with and in ICU4C C++ code. 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * These classes are inspired by 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * - std::auto_ptr 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * - boost::scoped_ptr & boost::scoped_array 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * - Taligent Safe Pointers (TOnlyPointerTo) 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * but none of those provide for all of the goals for ICU smart pointers: 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * - Smart pointer owns the object and releases it when it goes out of scope. 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * - No transfer of ownership via copy/assignment to reduce misuse. Simpler & more robust. 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * - ICU-compatible: No exceptions. 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * - Need to be able to orphan/release the pointer and its ownership. 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * - Need variants for normal C++ object pointers, C++ arrays, and ICU C service objects. 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * For details see http://site.icu-project.org/design/cpp/scoped_ptr 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h" 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_SHOW_CPLUSPLUS_API 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * "Smart pointer" base class; do not use directly: use LocalPointer etc. 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Base class for smart pointer classes that do not throw exceptions. 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Do not use this base class directly, since it does not delete its pointer. 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * A subclass must implement methods that delete the pointer: 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Destructor and adoptInstead(). 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * There is no operator T *() provided because the programmer must decide 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * whether to use getAlias() (without transfer of ownership) or orpan() 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (with transfer of ownership and NULLing of the pointer). 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @see LocalPointer 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @see LocalArray 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @see U_DEFINE_LOCAL_OPEN_POINTER 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.4 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtemplate<typename T> 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass LocalPointerBase { 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Constructor takes ownership. 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param p simple pointer to an object that is adopted 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.4 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org explicit LocalPointerBase(T *p=NULL) : ptr(p) {} 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Destructor deletes the object it owns. 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Subclass must override: Base class does nothing. 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.4 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ~LocalPointerBase() { /* delete ptr; */ } 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * NULL check. 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return TRUE if ==NULL 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.4 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool isNull() const { return ptr==NULL; } 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * NULL check. 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return TRUE if !=NULL 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.4 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool isValid() const { return ptr!=NULL; } 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Comparison with a simple pointer, so that existing code 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * with ==NULL need not be changed. 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param other simple pointer for comparison 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return true if this pointer value equals other 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.4 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org bool operator==(const T *other) const { return ptr==other; } 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Comparison with a simple pointer, so that existing code 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * with !=NULL need not be changed. 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param other simple pointer for comparison 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return true if this pointer value differs from other 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.4 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org bool operator!=(const T *other) const { return ptr!=other; } 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Access without ownership change. 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the pointer value 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.4 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org T *getAlias() const { return ptr; } 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Access without ownership change. 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the pointer value as a reference 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.4 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org T &operator*() const { return *ptr; } 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Access without ownership change. 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the pointer value 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.4 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org T *operator->() const { return ptr; } 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Gives up ownership; the internal pointer becomes NULL. 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the pointer value; 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * caller becomes responsible for deleting the object 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.4 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org T *orphan() { 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org T *p=ptr; 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ptr=NULL; 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return p; 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Deletes the object it owns, 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and adopts (takes ownership of) the one passed in. 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Subclass must override: Base class does not delete the object. 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param p simple pointer to an object that is adopted 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.4 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void adoptInstead(T *p) { 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // delete ptr; 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ptr=p; 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprotected: 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Actual pointer. 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @internal 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org T *ptr; 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate: 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // No comparison operators with other LocalPointerBases. 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org bool operator==(const LocalPointerBase &other); 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org bool operator!=(const LocalPointerBase &other); 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // No ownership transfer: No copy constructor, no assignment operator. 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LocalPointerBase(const LocalPointerBase &other); 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void operator=(const LocalPointerBase &other); 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // No heap allocation. Use only on the stack. 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static void * U_EXPORT2 operator new(size_t size); 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static void * U_EXPORT2 operator new[](size_t size); 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_HAVE_PLACEMENT_NEW 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static void * U_EXPORT2 operator new(size_t, void *ptr); 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * "Smart pointer" class, deletes objects via the standard C++ delete operator. 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * For most methods see the LocalPointerBase base class. 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Usage example: 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \code 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * LocalPointer<UnicodeString> s(new UnicodeString((UChar32)0x50005)); 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * int32_t length=s->length(); // 2 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * UChar lead=s->charAt(0); // 0xd900 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * if(some condition) { return; } // no need to explicitly delete the pointer 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * s.adoptInstead(new UnicodeString((UChar)0xfffc)); 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * length=s->length(); // 1 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * // no need to explicitly delete the pointer 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \endcode 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @see LocalPointerBase 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.4 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtemplate<typename T> 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass LocalPointer : public LocalPointerBase<T> { 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Constructor takes ownership. 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param p simple pointer to an object that is adopted 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.4 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org explicit LocalPointer(T *p=NULL) : LocalPointerBase<T>(p) {} 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Destructor deletes the object it owns. 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.4 1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ~LocalPointer() { 1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete LocalPointerBase<T>::ptr; 2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Deletes the object it owns, 2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and adopts (takes ownership of) the one passed in. 2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param p simple pointer to an object that is adopted 2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.4 2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void adoptInstead(T *p) { 2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete LocalPointerBase<T>::ptr; 2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LocalPointerBase<T>::ptr=p; 2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * "Smart pointer" class, deletes objects via the C++ array delete[] operator. 2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * For most methods see the LocalPointerBase base class. 2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Adds operator[] for array item access. 2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Usage example: 2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \code 2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * LocalArray<UnicodeString> a(new UnicodeString[2]); 2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * a[0].append((UChar)0x61); 2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * if(some condition) { return; } // no need to explicitly delete the array 2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * a.adoptInstead(new UnicodeString[4]); 2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * a[3].append((UChar)0x62).append((UChar)0x63).reverse(); 2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * // no need to explicitly delete the array 2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \endcode 2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @see LocalPointerBase 2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.4 2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtemplate<typename T> 2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass LocalArray : public LocalPointerBase<T> { 2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Constructor takes ownership. 2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param p simple pointer to an array of T objects that is adopted 2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.4 2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org explicit LocalArray(T *p=NULL) : LocalPointerBase<T>(p) {} 2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Destructor deletes the array it owns. 2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.4 2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ~LocalArray() { 2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete[] LocalPointerBase<T>::ptr; 2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Deletes the array it owns, 2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and adopts (takes ownership of) the one passed in. 2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param p simple pointer to an array of T objects that is adopted 2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.4 2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void adoptInstead(T *p) { 2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete[] LocalPointerBase<T>::ptr; 2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LocalPointerBase<T>::ptr=p; 2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Array item access (writable). 2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * No index bounds check. 2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param i array index 2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return reference to the array item 2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.4 2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org T &operator[](ptrdiff_t i) const { return LocalPointerBase<T>::ptr[i]; } 2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \def U_DEFINE_LOCAL_OPEN_POINTER 2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * "Smart pointer" definition macro, deletes objects via the closeFunction. 2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Defines a subclass of LocalPointerBase which works just 2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * like LocalPointer<Type> except that this subclass will use the closeFunction 2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * rather than the C++ delete operator. 2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Requirement: The closeFunction must tolerate a NULL pointer. 2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (We could add a NULL check here but it is normally redundant.) 2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Usage example: 2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \code 2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * LocalUCaseMapPointer csm(ucasemap_open(localeID, options, &errorCode)); 2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * utf8OutLength=ucasemap_utf8ToLower(csm.getAlias(), 2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * utf8Out, (int32_t)sizeof(utf8Out), 2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * utf8In, utf8InLength, &errorCode); 2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * if(U_FAILURE(errorCode)) { return; } // no need to explicitly delete the UCaseMap 2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \endcode 2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @see LocalPointerBase 2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @see LocalPointer 2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.4 2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define U_DEFINE_LOCAL_OPEN_POINTER(LocalPointerClassName, Type, closeFunction) \ 2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org class LocalPointerClassName : public LocalPointerBase<Type> { \ 2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org public: \ 2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org explicit LocalPointerClassName(Type *p=NULL) : LocalPointerBase<Type>(p) {} \ 2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ~LocalPointerClassName() { closeFunction(ptr); } \ 2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void adoptInstead(Type *p) { \ 2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org closeFunction(ptr); \ 2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ptr=p; \ 2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } \ 2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END 3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* U_SHOW_CPLUSPLUS_API */ 3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* __LOCALPOINTER_H__ */ 305