//
// Copyright (c) 2002-2011 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//

// HandleAllocator.cpp: Implements the gl::HandleAllocator class, which is used
// to allocate GL handles.

#include "libGLESv2/HandleAllocator.h"

#include "libGLESv2/main.h"

namespace gl
{

HandleAllocator::HandleAllocator() : mBaseValue(1), mNextValue(1)
{
}

HandleAllocator::~HandleAllocator()
{
}

void HandleAllocator::setBaseHandle(GLuint value)
{
    ASSERT(mBaseValue == mNextValue);
    mBaseValue = value;
    mNextValue = value;
}

GLuint HandleAllocator::allocate()
{
    if (mFreeValues.size())
    {
        GLuint handle = mFreeValues.back();
        mFreeValues.pop_back();
        return handle;
    }
    return mNextValue++;
}

void HandleAllocator::release(GLuint handle)
{
    if (handle == mNextValue - 1)
    {
        // Don't drop below base value
        if(mNextValue > mBaseValue)
        {
            mNextValue--;
        }
    }
    else
    {
        // Only free handles that we own - don't drop below the base value
        if (handle >= mBaseValue)
        {
            mFreeValues.push_back(handle);
        }
    }
}

}
