OSCL_EXPORT_REF void Oscl_Vector_Base::assign_vector(const Oscl_Vector_Base& x)
{
    if (x.size() > capacity())
    {
        // allocate space and copy
        OsclAny* tmp = pOpaqueType->allocate((uint32)x.end() - (uint32)x.begin());
        uninitialized_copy(x.begin(), x.end(), tmp);
        destroy(begin(), end());
        if (elems)
            pOpaqueType->deallocate(elems);
        elems = tmp;
        bufsize = x.size();
    }
    else if (size() >= x.size())
    {
        OsclAny* i = copy(x.begin(), x.end(), begin());
        destroy(i, end());
    }
    else
    {
        copy(x.begin(), increment_T(x.begin(), size()), begin());
        uninitialized_copy(increment_T(x.begin(), size()), x.end(), end());
    }
    numelems = x.size();
}
OsclAny* Oscl_Vector_Base::uninitialized_copy(OsclAny* first, OsclAny* last, OsclAny* result)
{
    while (first != last)
    {
        pOpaqueType->construct(result, first);
        result = increment_T(result, 1);
        first = increment_T(first, 1);
    }
    return result;
}
OSCL_EXPORT_REF OsclAny* Oscl_Vector_Base::erase(OsclAny* pos)
{
    //note: use move instead of copy here since we assume
    //it's not necessary to construct/destruct just to move
    //an element.
    pOpaqueType->destroy(pos);
    if (increment_T(pos, 1) != end())
        move(increment_T(pos, 1), end(), pos);
    numelems--;
    return pos;
}
OSCL_EXPORT_REF void Oscl_Queue_Base::reserve(uint32 n)
{
    if (n > bufsize)
    {
        OsclAny* newElems = pOpaqueType->allocate(n * sizeof_T);
        // transfer old contents using normal operations on (this) queue
        // constructing new copy in "new__" variables.  Note that data
        //  won't wrap here, so ok to just use [i++].
        uint32 i = 0;
        while (! empty())
        {
            pOpaqueType->construct(increment_T(newElems, i++), front());
            pop();
        }
        if (elems)
        {
            pOpaqueType->deallocate(elems);
        }
        // now set new values
        elems = newElems;
        bufsize = n;
        numelems = i;
        ifront = 0;
        irear = numelems > 0 ? ifront + numelems - 1 : bufsize - 1;
    }
}
OSCL_EXPORT_REF void Oscl_Vector_Base::push_front(const OsclAny* x)
{
    OSCL_ASSERT(x);
    if (numelems == bufsize)
    {
        uint32 new_bufsize = (bufsize) ? 2 * bufsize : 2;
        reserve(new_bufsize);
    }
    for (uint32 i = numelems; i > 0; i--)
    {
        pOpaqueType->construct(increment_T(elems, i), increment_T(elems, i - 1));
        pOpaqueType->destroy(increment_T(elems, i - 1));
    }
    numelems++;
    pOpaqueType->construct(begin(), x);
}
void Oscl_Vector_Base::destroy(OsclAny* first, OsclAny* last)
{
    while (first != last)
    {
        pOpaqueType->destroy(first);
        first = increment_T(first, 1);
    }
}
OSCL_EXPORT_REF void Oscl_Vector_Base::reserve(uint32 n)
{
    if (n > bufsize)
    {
        OsclAny* oldmem = elems;
        elems = pOpaqueType->allocate(n * sizeof_T);
        OsclAny* newelems = elems;
        OsclAny* oldelems = oldmem;
        for (uint32 i = 0; i < numelems; i++)
        {
            pOpaqueType->construct(newelems, oldelems);
            newelems = increment_T(newelems, 1);
            oldelems = increment_T(oldelems, 1);
        }
        if (oldmem)
        {
            destroy(oldmem, increment_T(oldmem, numelems));
            pOpaqueType->deallocate(oldmem);
        }
        bufsize = n;
    }
}
OSCL_EXPORT_REF OsclAny* Oscl_Vector_Base::insert(OsclAny* pos, const OsclAny* x)
{
    OSCL_ASSERT(x);
    if (numelems == bufsize)
    {
        uint32 new_bufsize = (bufsize) ? 2 * bufsize : 2;
        OsclAny* oldPtr = elems;
        reserve(new_bufsize);
        int32 diff = ((char*)elems) - ((char*)oldPtr);
        pos = (OsclAny*)(((char*)pos) + diff);
    }
    OsclAny* ptr = increment_T(elems, numelems);
    while (ptr > pos)
    {
        OsclAny* previous = increment_T(ptr, -1);
        pOpaqueType->construct(ptr, previous);
        pOpaqueType->destroy(previous);
        ptr = previous;
    }
    numelems++;
    pOpaqueType->construct(pos, x);
    return pos;
}