16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org********************************************************************** 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Copyright (C) 1999-2011, International Business Machines 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Corporation and others. All Rights Reserved. 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org********************************************************************** 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// UVector32 is a class implementing a vector of 32 bit integers. 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// It is similar to UVector, but holds int32_t values rather than pointers. 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Most of the code is unchanged from UVector. 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef UVECTOR32_H 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UVECTOR32_H 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h" 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uobject.h" 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uhash.h" 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uassert.h" 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Ultralightweight C++ implementation of a <tt>void*</tt> vector 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * that is (mostly) compatible with java.util.Vector. 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>This is a very simple implementation, written to satisfy an 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * immediate porting need. As such, it is not completely fleshed out, 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and it aims for simplicity and conformity. Nonetheless, it serves 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * its purpose (porting code from java that uses java.util.Vector) 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * well, and it could be easily made into a more robust vector class. 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p><b>Design notes</b> 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>There is index bounds checking, but little is done about it. If 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * indices are out of bounds, either nothing happens, or zero is 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * returned. We <em>do</em> avoid indexing off into the weeds. 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>There is detection of out of memory, but the handling is very 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * coarse-grained -- similar to UnicodeString's protocol, but even 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * coarser. The class contains <em>one static flag</em> that is set 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * when any call to <tt>new</tt> returns zero. This allows the caller 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * to use several vectors and make just one check at the end to see if 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * a memory failure occurred. This is more efficient than making a 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * check after each call on each vector when doing many operations on 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * multiple vectors. The single static flag works best when memory 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * failures are infrequent, and when recovery options are limited or 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * nonexistent. 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p><b>To do</b> 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Improve the handling of index out of bounds errors. 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @author Alan Liu 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass U_COMMON_API UVector32 : public UObject { 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate: 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t count; 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t capacity; 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t maxCapacity; // Limit beyond which capacity is not permitted to grow. 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t* elements; 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UVector32(UErrorCode &status); 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UVector32(int32_t initialCapacity, UErrorCode &status); 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual ~UVector32(); 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Assign this object to another (make this a copy of 'other'). 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Use the 'assign' function to assign each element. 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void assign(const UVector32& other, UErrorCode &ec); 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Compare this vector with another. They will be considered 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * equal if they are of the same size and all elements are equal, 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * as compared using this object's comparer. 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool operator==(const UVector32& other); 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Equivalent to !operator==() 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org inline UBool operator!=(const UVector32& other); 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //------------------------------------------------------------ 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // java.util.Vector API 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //------------------------------------------------------------ 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void addElement(int32_t elem, UErrorCode &status); 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void setElementAt(int32_t elem, int32_t index); 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void insertElementAt(int32_t elem, int32_t index, UErrorCode &status); 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t elementAti(int32_t index) const; 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool equals(const UVector32 &other) const; 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t lastElementi(void) const; 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t indexOf(int32_t elem, int32_t startIndex = 0) const; 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool contains(int32_t elem) const; 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool containsAll(const UVector32& other) const; 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool removeAll(const UVector32& other); 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool retainAll(const UVector32& other); 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void removeElementAt(int32_t index); 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void removeAllElements(); 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t size(void) const; 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool isEmpty(void) const; 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Inline. Use this one for speedy size check. 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org inline UBool ensureCapacity(int32_t minimumCapacity, UErrorCode &status); 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Out-of-line, handles actual growth. Called by ensureCapacity() when necessary. 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool expandCapacity(int32_t minimumCapacity, UErrorCode &status); 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Change the size of this vector as follows: If newSize is 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * smaller, then truncate the array, possibly deleting held 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * elements for i >= newSize. If newSize is larger, grow the 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * array, filling in new slows with zero. 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void setSize(int32_t newSize); 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //------------------------------------------------------------ 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // New API 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //------------------------------------------------------------ 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Returns true if this vector contains none of the elements 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * of the given vector. 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param other vector to be checked for containment 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return true if the test condition is met 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool containsNone(const UVector32& other) const; 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Insert the given integer into this vector at its sorted position. 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The current elements are assumed to be sorted already. 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void sortedInsert(int32_t elem, UErrorCode& ec); 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Returns a pointer to the internal array holding the vector. 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t *getBuffer() const; 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Set the maximum allowed buffer capacity for this vector/stack. 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Default with no limit set is unlimited, go until malloc() fails. 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * A Limit of zero means unlimited capacity. 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Units are vector elements (32 bits each), not bytes. 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void setMaxCapacity(int32_t limit); 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ICU "poor man's RTTI", returns a UClassID for this class. 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static UClassID U_EXPORT2 getStaticClassID(); 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ICU "poor man's RTTI", returns a UClassID for the actual class. 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UClassID getDynamicClassID() const; 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate: 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void _init(int32_t initialCapacity, UErrorCode &status); 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Disallow 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UVector32(const UVector32&); 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Disallow 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UVector32& operator=(const UVector32&); 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // API Functions for Stack operations. 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // In the original UVector, these were in a separate derived class, UStack. 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Here in UVector32, they are all together. 1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool empty(void) const; // TODO: redundant, same as empty(). Remove it? 1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t peeki(void) const; 2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t popi(void); 2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t push(int32_t i, UErrorCode &status); 2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t *reserveBlock(int32_t size, UErrorCode &status); 2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t *popFrame(int32_t size); 2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// UVector32 inlines 2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool UVector32::ensureCapacity(int32_t minimumCapacity, UErrorCode &status) { 2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ((minimumCapacity >= 0) && (capacity >= minimumCapacity)) { 2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return expandCapacity(minimumCapacity, status); 2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t UVector32::elementAti(int32_t index) const { 2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return (index >= 0 && count > 0 && count - index > 0) ? elements[index] : 0; 2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline void UVector32::addElement(int32_t elem, UErrorCode &status) { 2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ensureCapacity(count + 1, status)) { 2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org elements[count] = elem; 2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count++; 2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t *UVector32::reserveBlock(int32_t size, UErrorCode &status) { 2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ensureCapacity(count+size, status) == FALSE) { 2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t *rp = elements+count; 2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count += size; 2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return rp; 2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t *UVector32::popFrame(int32_t size) { 2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_ASSERT(count >= size); 2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count -= size; 2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (count < 0) { 2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count = 0; 2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return elements+count-size; 2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t UVector32::size(void) const { 2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return count; 2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool UVector32::isEmpty(void) const { 2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return count == 0; 2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool UVector32::contains(int32_t obj) const { 2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return indexOf(obj) >= 0; 2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t UVector32::lastElementi(void) const { 2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return elementAti(count-1); 2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool UVector32::operator!=(const UVector32& other) { 2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return !operator==(other); 2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t *UVector32::getBuffer() const { 2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return elements; 2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// UStack inlines 2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool UVector32::empty(void) const { 2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return isEmpty(); 2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t UVector32::peeki(void) const { 2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return lastElementi(); 2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t UVector32::push(int32_t i, UErrorCode &status) { 2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addElement(i, status); 2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return i; 2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t UVector32::popi(void) { 2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t result = 0; 2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (count > 0) { 2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count--; 2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = elements[count]; 2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return result; 3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END 3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 305