16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org****************************************************************************** 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Copyright (C) 2002-2012, International Business Machines 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Corporation and others. All Rights Reserved. 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org****************************************************************************** 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* file name: uobject.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: 2002jun26 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* created by: Markus W. Scherer 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef __UOBJECT_H__ 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define __UOBJECT_H__ 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h" 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \file 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \brief C++ API: Common ICU base class UObject. 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @{ 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \def U_NO_THROW 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Define this to define the throw() specification so 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * certain functions do not throw any exceptions 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * UMemory operator new methods should have the throw() specification 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * appended to them, so that the compiler adds the additional NULL check 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * before calling constructors. Without, if <code>operator new</code> returns NULL the 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * constructor is still called, and if the constructor references member 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * data, (which it typically does), the result is a segmentation violation. 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.2 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef U_NO_THROW 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define U_NO_THROW throw() 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** @} */ 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*===========================================================================*/ 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* UClassID-based RTTI */ 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*===========================================================================*/ 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * UClassID is used to identify classes without using the compiler's RTTI. 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This was used before C++ compilers consistently supported RTTI. 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ICU 4.6 requires compiler RTTI to be turned on. 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Each class hierarchy which needs 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * to implement polymorphic clone() or operator==() defines two methods, 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * described in detail below. UClassID values can be compared using 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * operator==(). Nothing else should be done with them. 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \par 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * In class hierarchies that implement "poor man's RTTI", 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * each concrete subclass implements getDynamicClassID() in the same way: 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \code 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * class Derived { 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * public: 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * virtual UClassID getDynamicClassID() const 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * { return Derived::getStaticClassID(); } 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * } 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \endcode 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Each concrete class implements getStaticClassID() as well, which allows 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * clients to test for a specific type. 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \code 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * class Derived { 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * public: 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * static UClassID U_EXPORT2 getStaticClassID(); 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * private: 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * static char fgClassID; 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * } 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * // In Derived.cpp: 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * UClassID Derived::getStaticClassID() 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * { return (UClassID)&Derived::fgClassID; } 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * char Derived::fgClassID = 0; // Value is irrelevant 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \endcode 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 2.0 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef void* UClassID; 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * UMemory is the common ICU base class. 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * All other ICU C++ classes are derived from UMemory (starting with ICU 2.4). 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This is primarily to make it possible and simple to override the 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * C++ memory management by adding new/delete operators to this base class. 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * To override ALL ICU memory management, including that from plain C code, 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * replace the allocation functions declared in cmemory.h 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * UMemory does not contain any virtual functions. 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Common "boilerplate" functions are defined in UObject. 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 2.4 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass U_COMMON_API UMemory { 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* test versions for debugging shaper heap memory problems */ 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef SHAPER_MEMORY_DEBUG 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static void * NewArray(int size, int count); 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static void * GrowArray(void * array, int newSize ); 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static void FreeArray(void * array ); 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_OVERRIDE_CXX_ALLOCATION 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Override for ICU4C C++ memory management. 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * simple, non-class types are allocated using the macros in common/cmemory.h 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (uprv_malloc(), uprv_free(), uprv_realloc()); 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * they or something else could be used here to implement C++ new/delete 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * for ICU4C C++ classes 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 2.4 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static void * U_EXPORT2 operator new(size_t size) U_NO_THROW; 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Override for ICU4C C++ memory management. 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * See new(). 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 2.4 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static void * U_EXPORT2 operator new[](size_t size) U_NO_THROW; 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Override for ICU4C C++ memory management. 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * simple, non-class types are allocated using the macros in common/cmemory.h 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (uprv_malloc(), uprv_free(), uprv_realloc()); 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * they or something else could be used here to implement C++ new/delete 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * for ICU4C C++ classes 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 2.4 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static void U_EXPORT2 operator delete(void *p) U_NO_THROW; 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Override for ICU4C C++ memory management. 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * See delete(). 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 2.4 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static void U_EXPORT2 operator delete[](void *p) U_NO_THROW; 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_HAVE_PLACEMENT_NEW 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Override for ICU4C C++ memory management for STL. 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * See new(). 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 2.6 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static inline void * U_EXPORT2 operator new(size_t, void *ptr) U_NO_THROW { return ptr; } 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Override for ICU4C C++ memory management for STL. 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * See delete(). 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 2.6 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static inline void U_EXPORT2 operator delete(void *, void *) U_NO_THROW {} 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* U_HAVE_PLACEMENT_NEW */ 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_HAVE_DEBUG_LOCATION_NEW 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This method overrides the MFC debug version of the operator new 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param size The requested memory size 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param file The file where the allocation was requested 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param line The line where the allocation was requested 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static void * U_EXPORT2 operator new(size_t size, const char* file, int line) U_NO_THROW; 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This method provides a matching delete for the MFC debug new 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param p The pointer to the allocated memory 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param file The file where the allocation was requested 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param line The line where the allocation was requested 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static void U_EXPORT2 operator delete(void* p, const char* file, int line) U_NO_THROW; 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* U_HAVE_DEBUG_LOCATION_NEW */ 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* U_OVERRIDE_CXX_ALLOCATION */ 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Assignment operator not declared. The compiler will provide one 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * which does nothing since this class does not contain any data members. 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * API/code coverage may show the assignment operator as present and 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * untested - ignore. 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Subclasses need this assignment operator if they use compiler-provided 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * assignment operators of their own. An alternative to not declaring one 1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * here would be to declare and empty-implement a protected or public one. 1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMemory &UMemory::operator=(const UMemory &); 1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * UObject is the common ICU "boilerplate" class. 2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * UObject inherits UMemory (starting with ICU 2.4), 2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and all other public ICU C++ classes 2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * are derived from UObject (starting with ICU 2.2). 2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * UObject contains common virtual functions, in particular a virtual destructor. 2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The clone() function is not available in UObject because it is not 2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * implemented by all ICU classes. 2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Many ICU services provide a clone() function for their class trees, 2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * defined on the service's C++ base class, and all subclasses within that 2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * service class tree return a pointer to the service base class 2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (which itself is a subclass of UObject). 2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This is because some compilers do not support covariant (same-as-this) 2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * return types; cast to the appropriate subclass if necessary. 2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 2.2 2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass U_COMMON_API UObject : public UMemory { 2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Destructor. 2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 2.2 2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual ~UObject(); 2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ICU4C "poor man's RTTI", returns a UClassID for the actual ICU class. 2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The base class implementation returns a dummy value. 2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Use compiler RTTI rather than ICU's "poor man's RTTI". 2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Since ICU 4.6, new ICU C++ class hierarchies do not implement "poor man's RTTI". 2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 2.2 2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UClassID getDynamicClassID() const; 2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprotected: 2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // the following functions are protected to prevent instantiation and 2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // direct use of UObject itself 2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // default constructor 2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // inline UObject() {} 2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // copy constructor 2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // inline UObject(const UObject &other) {} 2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if 0 2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // TODO Sometime in the future. Implement operator==(). 2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // (This comment inserted in 2.2) 2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // some or all of the following "boilerplate" functions may be made public 2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // in a future ICU4C release when all subclasses implement them 2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // assignment operator 2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // (not virtual, see "Taligent's Guide to Designing Programs" pp.73..74) 2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // commented out because the implementation is the same as a compiler's default 2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // UObject &operator=(const UObject &other) { return *this; } 2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // comparison operators 2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual inline UBool operator==(const UObject &other) const { return this==&other; } 2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org inline UBool operator!=(const UObject &other) const { return !operator==(other); } 2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // clone() commented out from the base class: 2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // some compilers do not support co-variant return types 2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // (i.e., subclasses would have to return UObject * as well, instead of SubClass *) 2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // see also UObject class documentation. 2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // virtual UObject *clone() const; 2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Assignment operator not declared. The compiler will provide one 2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * which does nothing since this class does not contain any data members. 2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * API/code coverage may show the assignment operator as present and 2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * untested - ignore. 2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Subclasses need this assignment operator if they use compiler-provided 2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * assignment operators of their own. An alternative to not declaring one 2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * here would be to declare and empty-implement a protected or public one. 2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UObject &UObject::operator=(const UObject &); 2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef U_HIDE_INTERNAL_API 2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This is a simple macro to add ICU RTTI to an ICU object implementation. 2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This does not go into the header. This should only be used in *.cpp files. 2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param myClass The name of the class that needs RTTI defined. 2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @internal 2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UOBJECT_DEFINE_RTTI_IMPLEMENTATION(myClass) \ 2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UClassID U_EXPORT2 myClass::getStaticClassID() { \ 2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static char classID = 0; \ 2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return (UClassID)&classID; \ 2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } \ 2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UClassID myClass::getDynamicClassID() const \ 2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { return myClass::getStaticClassID(); } 3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This macro adds ICU RTTI to an ICU abstract class implementation. 3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This macro should be invoked in *.cpp files. The corresponding 3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * header should declare getStaticClassID. 3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param myClass The name of the class that needs RTTI defined. 3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @internal 3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UOBJECT_DEFINE_ABSTRACT_RTTI_IMPLEMENTATION(myClass) \ 3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UClassID U_EXPORT2 myClass::getStaticClassID() { \ 3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static char classID = 0; \ 3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return (UClassID)&classID; \ 3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* U_HIDE_INTERNAL_API */ 3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END 3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 321