Ignore:
Timestamp:
Sep 21, 2011 2:28:26 PM (13 years ago)
Author:
gah
Message:

update from trunk

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/blt4/src/core/RpSimpleBuffer.h

    r1897 r2544  
     1
    12/*
    23 * ======================================================================
     
    6970#include <cstdarg>
    7071
     72/*
     73 * Note: I think I would redo this class to deal only with unsigned byte
     74 *       arrays, instead of arrays of <T>.  I would create other classes
     75 *       that arrays of <T> that used the lower level byte array.
     76 *
     77 *       It would make it cleaner if the class only dealt with bytes
     78 *       instead of elements (of various sizes). 
     79 *
     80 *       Specific implementations of <T> could perform data alignment on
     81 *       word/double word/quad word boundaries.  This is an optimization
     82 *       that should could done for double arrays.
     83 *
     84 * Note: The signed int argument on append() should be replaced with a
     85 *       size_t.  This limits the length of strings to appended.  It
     86 *       silently truncates bigger sizes to the lower 32-bits. 
     87 */
    7188namespace Rappture {
    7289
     
    7491class SimpleBuffer {
    7592public:
    76     SimpleBuffer();
     93    /**
     94     * Construct an empty SimpleBuffer.
     95     */
     96    SimpleBuffer() {
     97        Initialize();
     98    }
     99    /**
     100     * Construct a SimpleBuffer loaded with initial data.
     101     *
     102     * @param bytes pointer to bytes being stored.
     103     * @param nbytes number of bytes being stored.
     104     */
     105    SimpleBuffer(const T* bytes, int numElems=-1) {
     106        Initialize();
     107        append(bytes, numElems);
     108    }
    77109    SimpleBuffer(size_t nmemb);
    78     SimpleBuffer(const T* bytes, int nmemb=-1);
     110   
     111    /**
     112     * Copy constructor
     113     * @param SimpleBuffer object to copy
     114     */
    79115    SimpleBuffer(const SimpleBuffer& b);
     116   
    80117    SimpleBuffer<T>& operator=(const SimpleBuffer<T>& b);
    81118    SimpleBuffer     operator+(const SimpleBuffer& b) const;
    82119    SimpleBuffer<T>& operator+=(const SimpleBuffer<T>& b);
    83120    T operator[](size_t offset);
    84     virtual ~SimpleBuffer();
    85 
    86     const T* bytes() const;
    87     size_t size() const;
    88     size_t nmemb() const;
    89 
    90     SimpleBuffer<T>& clear();
     121   
     122    /**
     123     * Destructor
     124     */
     125    virtual ~SimpleBuffer() {
     126        Release();
     127    }
     128   
     129    /**
     130     * Get the bytes currently stored in the buffer.  These bytes can
     131     * be stored, and used later to construct another Buffer to
     132     * decode the information.
     133     *
     134     * @return Pointer to the bytes in the buffer.
     135     */
     136    const T* bytes() const {
     137        return _buf;
     138    }
     139    /**
     140     * Get the number of bytes currently stored in the buffer.
     141     * @return Number of the bytes used in the buffer.
     142     */
     143    size_t size() const {
     144        return _numElemsUsed * sizeof(T);
     145    }
     146    /**
     147     * Get the number of members currently stored in the buffer.
     148     * @return Number of the members used in the buffer.
     149     */
     150    size_t nmemb() const {
     151        return _numElemsUsed;
     152    }
     153    /**
     154     * Get the number of members currently stored in the buffer.
     155     * @return Number of the members used in the buffer.
     156     */
     157    size_t count() const {
     158        return _numElemsUsed;
     159    }
     160    /**
     161     * Set the number of members currently stored in the buffer.
     162     * @return Number of the members used in the buffer.
     163     */
     164    size_t count(size_t newCount) {
     165        _numElemsUsed = newCount;
     166        return _numElemsUsed;
     167    }
     168    /**
     169     * Clear the buffer, making it empty.
     170     * @return Reference to this buffer.
     171     */
     172    SimpleBuffer<T>& clear() {
     173        Release();
     174        return *this;
     175    }
     176    size_t extend(size_t extraElems);
    91177    int append(const T* bytes, int nmemb=-1);
    92178    int appendf(const char *format, ...);
     
    98184    SimpleBuffer<T>& rewind();
    99185    SimpleBuffer<T>& show();
    100 
     186   
    101187    bool good() const;
    102188    bool bad() const;
    103189    bool eof() const;
    104 
     190   
    105191    SimpleBuffer<T>& move(SimpleBuffer<T>& b);
    106 
     192   
    107193protected:
    108 
    109     void bufferInit();
    110     void bufferFree();
    111 
     194   
     195    void Initialize();
     196    void Release();
     197   
    112198private:
    113 
     199   
    114200    /// Pointer to the memory that holds our buffer's data
    115201    T* _buf;
    116 
     202   
    117203    /// Position offset within the buffer's memory
    118204    size_t _pos;
    119 
     205   
    120206    /// Number of members stored in the buffer
    121     size_t _nMembStored;
    122 
     207    size_t _numElemsUsed;
     208   
    123209    /// Total number of members available in the buffer
    124     size_t _nMembAvl;
    125 
     210    size_t _numElemsAllocated;
     211   
    126212    /// State of the last file like operation.
    127213    bool _fileState;
    128 
     214   
    129215    /// Minimum number of members is set to the number you can fit in 256 bytes
    130     const static int _minMembCnt=(256/sizeof(T));
    131 
     216    const static size_t _minNumElems = (256/sizeof(T));
     217   
    132218    size_t __guesslen(const T* bytes);
    133 
     219   
    134220};
    135 
     221   
    136222typedef SimpleBuffer<char>   SimpleCharBuffer;
    137223typedef SimpleBuffer<float>  SimpleFloatBuffer;
     
    139225
    140226/**
    141  * Construct an empty SimpleBuffer.
    142  */
    143 template<class T>
    144 SimpleBuffer<T>::SimpleBuffer()
    145 {
    146     bufferInit();
    147 }
    148 
    149 
    150 /**
    151227 * Construct an empty SimpleBuffer of specified size.
    152228 */
    153229template<class T>
    154 SimpleBuffer<T>::SimpleBuffer(size_t nmemb)
    155 {
    156     bufferInit();
    157 
    158     if (nmemb == 0) {
     230SimpleBuffer<T>::SimpleBuffer(size_t numElems)
     231{
     232    Initialize();
     233
     234    if (numElems == 0) {
    159235        // ignore requests for sizes equal to zero
    160236        return;
     
    162238
    163239    // buffer sizes less than min_size are set to min_size
    164     if (nmemb < (size_t) _minMembCnt) {
    165         nmemb = _minMembCnt;
    166     }
    167 
    168     if (set(nmemb) != nmemb) {
     240    if (numElems < (size_t) _minNumElems) {
     241        numElems = _minNumElems;
     242    }
     243
     244    if (set(numElems) != numElems) {
    169245        return;
    170246    }
    171     _nMembStored = nmemb;
    172 }
    173 
    174 
    175 /**
    176  * Construct a SimpleBuffer loaded with initial data.
    177  *
    178  * @param bytes pointer to bytes being stored.
    179  * @param nbytes number of bytes being stored.
    180  */
    181 template<class T>
    182 SimpleBuffer<T>::SimpleBuffer(const T* bytes, int nmemb)
    183 {
    184     bufferInit();
    185     append(bytes,nmemb);
     247    _numElemsUsed = numElems;
    186248}
    187249
     
    194256SimpleBuffer<T>::SimpleBuffer(const SimpleBuffer<T>& b)
    195257{
    196     bufferInit();
    197     append(b.bytes(),b.nmemb());
     258    Initialize();
     259    append(b.bytes(), b.nmemb());
    198260}
    199261
     
    207269SimpleBuffer<T>::operator=(const SimpleBuffer<T>& b)
    208270{
    209     bufferFree();
    210     bufferInit();
     271    Release();
    211272    append(b.bytes(),b.nmemb());
    212273    return *this;
     
    247308template<class T>
    248309T
    249 SimpleBuffer<T>::operator[](size_t idx)
    250 {
    251     return (_buf+idx);
    252 }
    253 
    254 
    255 /**
    256  * Destructor
    257  */
    258 template<class T>
    259 SimpleBuffer<T>::~SimpleBuffer()
    260 {
    261     bufferFree();
    262 }
    263 
    264 
    265 /**
    266  * Get the bytes currently stored in the buffer.  These bytes can
    267  * be stored, and used later to construct another Buffer to
    268  * decode the information.
    269  *
    270  * @return Pointer to the bytes in the buffer.
    271  */
    272 template<class T>
    273 const T*
    274 SimpleBuffer<T>::bytes() const
    275 {
    276     return _buf;
    277 }
    278 
    279 
    280 /**
    281  * Get the number of bytes currently stored in the buffer.
    282  * @return Number of the bytes used in the buffer.
    283  */
    284 template<class T>
    285 size_t
    286 SimpleBuffer<T>::size() const
    287 {
    288     return _nMembStored*sizeof(T);
    289 }
    290 
    291 
    292 /**
    293  * Get the number of members currently stored in the buffer.
    294  * @return Number of the members used in the buffer.
    295  */
    296 template<class T>
    297 size_t
    298 SimpleBuffer<T>::nmemb() const
    299 {
    300     return _nMembStored;
    301 }
    302 
    303 
    304 /**
    305  * Clear the buffer, making it empty.
    306  * @return Reference to this buffer.
    307  */
    308 template<class T>
    309 SimpleBuffer<T>&
    310 SimpleBuffer<T>::clear()
    311 {
    312     bufferFree();
    313     bufferInit();
    314 
    315     return *this;
    316 }
     310SimpleBuffer<T>::operator[](size_t index)
     311{
     312    return (_buf + index);              // Rely on pointer arithmetic
     313}
     314
     315
    317316
    318317/**
     
    327326    return strlen(bytes);
    328327}
     328
     329/* FIXME:       Change the signed int to size_t.  Move the -1 copy string
     330 *              up to the SimpleCharBuffer class.   There needs to be both
     331 *              a heavy duty class that can take a string bigger than
     332 *              2^31-1 in length, and a convenient class that doesn't make
     333 *              you add call strlen(s).
     334 *             
     335 */
    329336
    330337/**
     
    348355template<class T>
    349356int
    350 SimpleBuffer<T>::append(const T* bytes, int nmemb)
    351 {
    352     size_t newMembCnt = 0;
    353     size_t nbytes = 0;
    354 
    355     void* dest = NULL;
    356     void const* src  = NULL;
    357     size_t size = 0;
     357SimpleBuffer<T>::append(const T* bytes, int numElems)
     358{
    358359
    359360    // User specified NULL buffer to append
    360     if ( (bytes == NULL) && (nmemb < 1) ) {
    361         return 0;
     361    if (bytes == NULL) {
     362        return 0;                       // Should not give append a NULL
     363                                        // buffer pointer.
    362364    }
    363365
     
    367369    // bytes in *bytes.
    368370
    369     if (nmemb == -1) {
    370         // user signaled null terminated string
    371         // or that we should make an educated guess
    372         // at the length of the object.
    373         nbytes = __guesslen(bytes);
    374         nmemb = nbytes/sizeof(T);
    375     }
    376 
    377     if (nmemb <= 0) {
     371    size_t numBytes = 0;
     372    if (numElems == -1) {
     373        /* This should be moved into the SimpleCharBuffer.  It doesn't make
     374         * sense to look for a NUL byte unless it's a string buffer. We
     375         * can then change numElems to be size_t. */
     376        numBytes = __guesslen(bytes);
     377        numElems = numBytes / sizeof(T);
     378    }
     379    if (numElems <= 0) {
     380        return numElems;
     381    }
     382
     383    size_t newSize;
     384    newSize = _numElemsUsed + numElems;
     385    if (newSize > _numElemsAllocated) {
     386
     387        // buffer sizes less than min_size are set to min_size
     388        if (newSize < _minNumElems) {
     389            newSize = _minNumElems;
     390        }
     391
     392        /*
     393         * Allocate a larger buffer for the string if the current one isn't
     394         * large enough. Allocate extra space in the new buffer so that there
     395         * will be room to grow before we have to allocate again.
     396         */
     397        size_t size;
     398        size = (_numElemsAllocated > 0) ? _numElemsAllocated : _minNumElems;
     399        while (newSize > size) {
     400            size += size;
     401        }
     402
     403        /*
     404         * reallocate to a larger buffer
     405         */
     406        if (set(size) != size) {
     407            return 0;
     408        }
     409    }
     410    memcpy(_buf + _numElemsUsed, bytes, numElems * sizeof(T));
     411    _numElemsUsed += numElems;
     412    return numElems;
     413}
     414
     415/**
     416 * Append bytes to the end of this buffer
     417 * @param pointer to bytes to be added
     418 * @param number of bytes to be added
     419 * @return number of bytes appended.
     420 */
     421template<class T>
     422size_t
     423SimpleBuffer<T>::extend(size_t numExtraElems)
     424{
     425    size_t newSize;
     426
     427    newSize = _numElemsUsed + numExtraElems;
     428    if (newSize > _numElemsAllocated) {
     429
     430        /* Enforce a minimum buffer size. */
     431        if (newSize < (size_t) _minNumElems) {
     432            newSize = (size_t) _minNumElems;
     433        }
     434
     435        size_t size;
     436        size = (_numElemsAllocated > 0) ? _numElemsAllocated : _minNumElems;
     437
     438        /* Keep doubling the size of the buffer until we have enough space to
     439         * hold the extra elements. */
     440        while (newSize > size) {
     441            size += size;
     442        }
     443        /* Reallocate to a larger buffer. */
     444        if (set(size) != size) {
     445            return 0;
     446        }
     447    }
     448    return _numElemsAllocated;
     449}
     450
     451/**
     452 * Append formatted bytes to the end of this buffer
     453 * @param pointer to bytes to be added
     454 * @param number of bytes to be added
     455 * @return number of bytes appended.
     456 */
     457template<class T>
     458int
     459SimpleBuffer<T>::appendf(const char *format, ...)
     460{
     461    size_t newMembCnt = 0;
     462    size_t nbytes = 0;
     463    int nmemb = 0;
     464
     465    char* dest = NULL;
     466    size_t size = 0;
     467    size_t bytesAdded = 0;
     468    va_list arg;
     469
     470    // User specified NULL format
     471    if (format == NULL) {
     472        return 0;
     473    }
     474
     475    // FIXME: i think this needs to be division,
     476    // need to create test case with array of ints
     477    // i'm not sure we can even guess the number
     478    // bytes in *bytes.
     479
     480
     481    // add one for terminating null character
     482    nbytes = strlen(format) + 1;
     483
     484    if (nbytes <= 0) {
    378485        // no data written, invalid option
    379         return nmemb;
    380     }
    381 
    382     newMembCnt = (size_t)(_nMembStored + nmemb);
    383 
    384     if (newMembCnt > _nMembAvl) {
     486        return nbytes;
     487    }
     488
     489    // FIXME: we need ceil of nbytes/sizeof(T), instead we add 1 for safety
     490
     491    nmemb = nbytes/sizeof(T);
     492    if (nmemb == 0) {
     493        nmemb++;
     494    }
     495
     496    newMembCnt = (size_t)(_numElemsUsed + nmemb);
     497
     498    if (newMembCnt > _numElemsAllocated) {
    385499
    386500        // buffer sizes less than min_size are set to min_size
    387         if (newMembCnt < (size_t) _minMembCnt) {
    388             newMembCnt = (size_t) _minMembCnt;
     501        if (newMembCnt < (size_t) _minNumElems) {
     502            newMembCnt = (size_t) _minNumElems;
    389503        }
    390504
     
    395509         */
    396510        size_t membAvl;
    397         membAvl = (_nMembAvl > 0) ? _nMembAvl : _minMembCnt;
     511        membAvl = (_numElemsAllocated > 0) ? _numElemsAllocated : _minNumElems;
    398512        while (newMembCnt > membAvl) {
    399513            membAvl += membAvl;
     
    408522    }
    409523
    410     dest = (void*) (_buf + _nMembStored);
    411     src  = (void const*) bytes;
    412     size = (size_t) (nmemb*sizeof(T));
    413     memcpy(dest,src,size);
    414 
    415     _nMembStored += nmemb;
    416 
    417     return nmemb;
    418 }
    419 
    420 /**
    421  * Append formatted bytes to the end of this buffer
    422  * @param pointer to bytes to be added
    423  * @param number of bytes to be added
    424  * @return number of bytes appended.
    425  */
    426 template<class T>
    427 int
    428 SimpleBuffer<T>::appendf(const char *format, ...)
    429 {
    430     size_t newMembCnt = 0;
    431     size_t nbytes = 0;
    432     int nmemb = 0;
    433 
    434     char* dest = NULL;
    435     size_t size = 0;
    436     size_t bytesAdded = 0;
    437     va_list arg;
    438 
    439     // User specified NULL format
    440     if (format == NULL) {
    441         return 0;
    442     }
    443 
    444     // FIXME: i think this needs to be division,
    445     // need to create test case with array of ints
    446     // i'm not sure we can even guess the number
    447     // bytes in *bytes.
    448 
    449 
    450     // add one for terminating null character
    451     nbytes = strlen(format) + 1;
    452 
    453     if (nbytes <= 0) {
    454         // no data written, invalid option
    455         return nbytes;
    456     }
    457 
    458     // FIXME: we need ceil of nbytes/sizeof(T), instead we add 1 for safety
    459 
    460     nmemb = nbytes/sizeof(T);
    461     if (nmemb == 0) {
    462         nmemb++;
    463     }
    464 
    465     newMembCnt = (size_t)(_nMembStored + nmemb);
    466 
    467     if (newMembCnt > _nMembAvl) {
    468 
    469         // buffer sizes less than min_size are set to min_size
    470         if (newMembCnt < (size_t) _minMembCnt) {
    471             newMembCnt = (size_t) _minMembCnt;
    472         }
    473 
    474         /*
    475          * Allocate a larger buffer for the string if the current one isn't
    476          * large enough. Allocate extra space in the new buffer so that there
    477          * will be room to grow before we have to allocate again.
    478          */
    479         size_t membAvl;
    480         membAvl = (_nMembAvl > 0) ? _nMembAvl : _minMembCnt;
    481         while (newMembCnt > membAvl) {
    482             membAvl += membAvl;
    483         }
    484 
    485         /*
    486          * reallocate to a larger buffer
    487          */
    488         if (set(membAvl) != membAvl) {
    489             return 0;
    490         }
    491     }
    492 
    493     dest = (char*) (_buf + _nMembStored);
    494     size = (_nMembAvl-_nMembStored)*sizeof(T);
     524    dest = (char*) (_buf + _numElemsUsed);
     525    size = (_numElemsAllocated-_numElemsUsed)*sizeof(T);
    495526
    496527    va_start(arg,format);
     
    511542
    512543        // FIXME: round the new size up to the nearest multiple of 256?
    513         set(_nMembStored+nmemb);
     544        set(_numElemsUsed+nmemb);
    514545
    515546        // reset dest because it may have moved during reallocation
    516         dest = (char*) (_buf + _nMembStored);
     547        dest = (char*) (_buf + _numElemsUsed);
    517548        size = bytesAdded;
    518549
     
    528559    }
    529560
    530     _nMembStored += nmemb;
     561    _numElemsUsed += nmemb;
    531562
    532563    // remove the null character added by vsnprintf()
     
    549580SimpleBuffer<T>::remove(int nmemb)
    550581{
    551     if ((_nMembStored - nmemb) < 0){
    552         _nMembStored = 0;
     582    if ((_numElemsUsed - nmemb) < 0){
     583        _numElemsUsed = 0;
    553584        _pos = 0;
    554585    } else {
    555         _nMembStored -= nmemb;
    556         if (_pos >= _nMembStored) {
     586        _numElemsUsed -= nmemb;
     587        if (_pos >= _numElemsUsed) {
    557588            // move _pos back to the new end of the buffer.
    558             _pos = _nMembStored-1;
     589            _pos = _numElemsUsed-1;
    559590        }
    560591    }
     
    563594    return nmemb;
    564595}
    565 
    566596
    567597template<class T>
     
    585615    }
    586616    _buf = buf;
    587     _nMembAvl = nmemb;
    588     return _nMembAvl;
    589 }
    590 
     617    _numElemsAllocated = nmemb;
     618    return _numElemsAllocated;
     619}
    591620
    592621template<> inline
     
    596625    size_t curMemb = 0;
    597626
    598     while (curMemb != _nMembStored) {
     627    while (curMemb != _numElemsUsed) {
    599628        fprintf(stdout,"_buf[%lu] = :%c:\n", (long unsigned int)curMemb,
    600629                _buf[curMemb]);
    601630        curMemb += 1;
    602631    }
    603     fprintf(stdout,"_nMembAvl = :%lu:\n", (long unsigned int)_nMembAvl);
     632    fprintf(stdout,"_numElemsAllocated = :%lu:\n",
     633            (long unsigned int)_numElemsAllocated);
    604634
    605635    return *this;
     
    613643    size_t curMemb = 0;
    614644
    615     while (curMemb != _nMembStored) {
     645    while (curMemb != _numElemsUsed) {
    616646        fprintf(stdout,"_buf[%lu] = :%#x:\n", (long unsigned int)curMemb,
    617647                (unsigned long)_buf[curMemb]);
    618648        curMemb += 1;
    619649    }
    620     fprintf(stdout,"_nMembAvl = :%lu:\n", (long unsigned int)_nMembAvl);
     650    fprintf(stdout,"_numElemsAllocated = :%lu:\n", (long unsigned int)_numElemsAllocated);
    621651
    622652    return *this;
     
    651681
    652682    // make sure we don't read off the end of our buffer
    653     if ( (_pos + nmemb) > _nMembStored ) {
    654         nMembRead = _nMembStored - _pos;
     683    if ( (_pos + nmemb) > _numElemsUsed ) {
     684        nMembRead = _numElemsUsed - _pos;
    655685    }
    656686    else {
     
    694724            _pos = 0;
    695725        }
    696         else if (offset >= (long)_nMembStored) {
     726        else if (offset >= (long)_numElemsUsed) {
    697727            /* dont go off the end of data */
    698             _pos = _nMembStored - 1;
     728            _pos = _numElemsUsed - 1;
    699729        }
    700730        else {
     
    707737            _pos = 0;
    708738        }
    709         else if ((_pos + offset) >= _nMembStored) {
     739        else if ((_pos + offset) >= _numElemsUsed) {
    710740            /* dont go off the end of data */
    711             _pos = _nMembStored - 1;
     741            _pos = _numElemsUsed - 1;
    712742        }
    713743        else {
     
    716746    }
    717747    else if (whence == SEEK_END) {
    718         if (offset <= (long)(-1*_nMembStored)) {
     748        if (offset <= (long)(-1*_numElemsUsed)) {
    719749            /* dont go off the beginning of data */
    720750            _pos = 0;
     
    722752        else if (offset >= 0) {
    723753            /* dont go off the end of data */
    724             _pos = _nMembStored - 1;
     754            _pos = _numElemsUsed - 1;
    725755        }
    726756        else {
    727             _pos = (size_t)((_nMembStored - 1) + offset);
     757            _pos = (size_t)((_numElemsUsed - 1) + offset);
    728758        }
    729759    }
     
    794824SimpleBuffer<T>::eof() const
    795825{
    796     return (_pos >= _nMembStored);
     826    return (_pos >= _numElemsUsed);
    797827}
    798828
     
    801831 * Move the data from this SimpleBuffer to the SimpleBuffer provided by
    802832 * the caller. All data except the _pos is moved and this SimpleBuffer is
    803  * re-initialized with bufferInit().
     833 * re-initialized with Initialize().
    804834 * @param SimpleBuffer to move the information to
    805835 * @return reference to this SimpleBuffer object.
     
    809839SimpleBuffer<T>::move(SimpleBuffer<T>& b)
    810840{
    811     bufferFree();
     841    Release();
    812842
    813843    _buf = b._buf;
    814844    _pos = b._pos;
    815845    _fileState = b._fileState;
    816     _nMembStored = b._nMembStored;
    817     _nMembAvl = b._nMembAvl;
    818 
    819     b.bufferInit();
     846    _numElemsUsed = b._numElemsUsed;
     847    _numElemsAllocated = b._numElemsAllocated;
     848
     849    b.Initialize();
    820850
    821851    return *this;
     
    825855 /**
    826856  *  Initializes a dynamic buffer, discarding any previous contents
    827   *  of the buffer. bufferFree() should have been called already
     857  *  of the buffer. Release() should have been called already
    828858  *  if the dynamic buffer was previously in use.
    829859  */
    830860template<class T>
    831861void
    832 SimpleBuffer<T>::bufferInit()
     862SimpleBuffer<T>::Initialize()
    833863{
    834864    _buf = NULL;
    835865    _pos = 0;
    836866    _fileState = true;
    837     _nMembStored = 0;
    838     _nMembAvl = 0;
     867    _numElemsUsed = 0;
     868    _numElemsAllocated = 0;
    839869}
    840870
     
    846876template<class T>
    847877void
    848 SimpleBuffer<T>::bufferFree()
     878SimpleBuffer<T>::Release()
    849879{
    850880    if (_buf != NULL) {
     
    852882        _buf = NULL;
    853883    }
    854     bufferInit();
     884    Initialize();
    855885}
    856886
Note: See TracChangeset for help on using the changeset viewer.