On Thu, 05 Aug 2010 15:23:13 -0400, simendsjo <simen.end...@pandavre.com> wrote:

On 05.08.2010 20:50, Steven Schveighoffer wrote:
On Thu, 05 Aug 2010 14:41:12 -0400, simendsjo
<simen.end...@pandavre.com> wrote:

On 05.08.2010 19:35, Steven Schveighoffer wrote:
On Thu, 05 Aug 2010 13:10:44 -0400, simendsjo
<simen.end...@pandavre.com> wrote:
(...)

(...)
Ah, that's really good to know! So I can see if it will reallocate using
bool willReallocate = array.capacity < (array.length +
numberOfItemsToAppend)
?

Yes, except the condition should be <=. And that function is
implementation independent (the value returned isn't, but it's
guaranteed that willReallocate should reflect whether the runtime will
reallocate)

        bool willReallocate(T)(T[] array, T[] toAppend) {
                return array.capacity < (array.length + toAppend.length);
        }
        
        int[] a = [0];
        auto aOldPtr = a.ptr;
        assert(a.capacity == 3);
        
        // a.length == a.capacity, so no reallocation
        int[] b = [1,2];
        assert(!willReallocate(a, b));
        a ~= b;
        assert(a.ptr == aOldPtr);
        
        // c.length == 0, so still no
        int[] c;
        assert(!willReallocate(a, c));
        a ~= c;
        assert(a.ptr == aOldPtr);
        
        // there, a.length > a.capacity and reallocation
        int[] d = [3];
        assert(willReallocate(a, d));
        a ~= d;
        assert(a.ptr != aOldPtr);

Oh right, for some reason, my brain did a fantastic translation of your statement to:

bool willNOTReallocate = array.length + numberOfItemsToAppend < array.capacity;

Which I then pointed out should really be <=

Sorry :)

-Steve

Reply via email to