// Copyright 2017 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_RENDERER_RASTERIZER_EGL_RECT_ALLOCATOR_H_
#define COBALT_RENDERER_RASTERIZER_EGL_RECT_ALLOCATOR_H_

#include <vector>

#include "cobalt/math/rect.h"
#include "cobalt/math/size.h"

namespace cobalt {
namespace renderer {
namespace rasterizer {
namespace egl {

// Manage 2D allocations from a virtual 2D space. This maintains a sorted list
// of unused memory from which allocations are made using a best-fit search.
// If an allocation does not exactly fit a memory block, then the unused
// portions are added to the unused memory list. Upon deallocation, unused
// memory blocks are not merged, so fragmentation will occur quickly.
class RectAllocator {
 public:
  RectAllocator();
  explicit RectAllocator(const math::Size& total_size);

  const math::Size& GetTotalSize() const { return total_size_; }

  // Remove all allocations, and optionally reset the total managed memory.
  void Reset() { Reset(total_size_); }
  void Reset(const math::Size& total_size);

  math::Rect Allocate(const math::Size& alloc_size);
  void Deallocate(const math::Rect& allocation) { AddUnused(allocation); }

 private:
  void AddUnused(const math::Rect& memory);

  math::Size total_size_;     // Total memory space managed by the allocator.

  typedef std::vector<math::Rect> MemoryList;
  MemoryList unused_;
};

}  // namespace egl
}  // namespace rasterizer
}  // namespace renderer
}  // namespace cobalt

#endif  // COBALT_RENDERER_RASTERIZER_EGL_RECT_ALLOCATOR_H_
