]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/common/uvectr32.h
ICU-511.35.tar.gz
[apple/icu.git] / icuSources / common / uvectr32.h
index 7d73e220f6246065f16dcf94e7906bba99b69839..d03eba62d00275d37223e60851a7d9e2d50d001d 100644 (file)
@@ -1,6 +1,6 @@
 /*
 **********************************************************************
-*   Copyright (C) 1999-2004, International Business Machines
+*   Copyright (C) 1999-2011, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 **********************************************************************
 */
@@ -61,6 +61,8 @@ private:
     int32_t   count;
 
     int32_t   capacity;
+    
+    int32_t   maxCapacity;   // Limit beyond which capacity is not permitted to grow.
 
     int32_t*  elements;
 
@@ -69,7 +71,7 @@ public:
 
     UVector32(int32_t initialCapacity, UErrorCode &status);
 
-    ~UVector32();
+    virtual ~UVector32();
 
     /**
      * Assign this object to another (make this a copy of 'other').
@@ -161,17 +163,21 @@ public:
      */
     int32_t *getBuffer() const;
 
+    /**
+     * Set the maximum allowed buffer capacity for this vector/stack.
+     * Default with no limit set is unlimited, go until malloc() fails.
+     * A Limit of zero means unlimited capacity.
+     * Units are vector elements (32 bits each), not bytes.
+     */
+    void setMaxCapacity(int32_t limit);
+
     /**
      * ICU "poor man's RTTI", returns a UClassID for this class.
-     *
-     * @draft ICU 2.2
      */
     static UClassID U_EXPORT2 getStaticClassID();
 
     /**
      * ICU "poor man's RTTI", returns a UClassID for the actual class.
-     *
-     * @draft ICU 2.2
      */
     virtual UClassID getDynamicClassID() const;
 
@@ -205,7 +211,7 @@ public:
 // UVector32 inlines
 
 inline UBool UVector32::ensureCapacity(int32_t minimumCapacity, UErrorCode &status) {
-    if (capacity >= minimumCapacity) {
+    if ((minimumCapacity >= 0) && (capacity >= minimumCapacity)) {
         return TRUE;
     } else {
         return expandCapacity(minimumCapacity, status);
@@ -213,7 +219,7 @@ inline UBool UVector32::ensureCapacity(int32_t minimumCapacity, UErrorCode &stat
 }
 
 inline int32_t UVector32::elementAti(int32_t index) const {
-    return (0 <= index && index < count) ? elements[index] : 0;
+    return (index >= 0 && count > 0 && count - index > 0) ? elements[index] : 0;
 }
 
 
@@ -225,7 +231,9 @@ inline void UVector32::addElement(int32_t elem, UErrorCode &status) {
 }
 
 inline int32_t *UVector32::reserveBlock(int32_t size, UErrorCode &status) {
-    ensureCapacity(count+size, status);
+    if (ensureCapacity(count+size, status) == FALSE) {
+        return NULL;
+    }
     int32_t  *rp = elements+count;
     count += size;
     return rp;
@@ -264,7 +272,7 @@ inline UBool UVector32::operator!=(const UVector32& other) {
 
 inline int32_t *UVector32::getBuffer() const {
     return elements;
-};
+}
 
 
 // UStack inlines