What are your feelings about changing current growing algorithm of
UT_StringBuf from a:

n + 4

to

max(old * 1.5, n)
(ie, switch to a exponential growing algorithm).

Here are the Mike algos, and my suggested changes (3-4 lines, I think...
:)
suppose g_nGrowExtraBytes = 4 and g_nGrowFactor = 1.5.

#if 0 // Mike growing functions
void UT_Stringbuf::grow_nocopy(size_t n)
{
        ++n;    // allow for zero termination
        if (n > capacity()) {
                const size_t nCurSize = size();
                if (m_psz) {
                        delete[] m_psz;
                }
                n += g_nGrowExtraBytes;
                m_psz  = new char_type[n];
                m_pEnd = m_psz + nCurSize;
                m_size = n;
        }
}

void UT_Stringbuf::grow_copy(size_t n)
{
        ++n;    // allow for zero termination
        if (n > capacity()) {
                n += g_nGrowExtraBytes;
                char_type* p = new char_type[n];
                const size_t nCurSize = size();
                if (m_psz) {
                        memcpy(p, m_psz, size() + 1);
                        delete[] m_psz;
                }
                m_psz  = p;
                m_pEnd = m_psz + nCurSize;
                m_size = n;
        }
}

#else // JCA growing functions

void UT_Stringbuf::grow_nocopy(size_t n)
{
        ++n;    // allow for zero termination
        if (n > capacity()) {
                const size_t nCurSize = size();
                if (m_psz) {
                        delete[] m_psz;
                }
                n = max(nCurSize * g_nGrowFactor, n);
                m_psz  = new char_type[n];
                m_pEnd = m_psz + nCurSize;
                m_size = n;
        }
}

void UT_Stringbuf::grow_copy(size_t n)
{
        ++n;    // allow for zero termination
        if (n > capacity()) {
                const size_t nCurSize = size();
                n = max(static_cast<size_t> (nCurSize * g_nGrowFactor), n);
                char_type* p = new char_type[n];
                if (m_psz) {
                        memcpy(p, m_psz, size() + 1);
                        delete[] m_psz;
                }
                m_psz  = p;
                m_pEnd = m_psz + nCurSize;
                m_size = n;
        }
}
#endif

Comments?

Cheers,

--
Joaquín Cuenca Abela
[EMAIL PROTECTED]

Reply via email to