/*
 * Copyright 2014 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 NB_FIXED_NO_FREE_ALLOCATOR_H_
#define NB_FIXED_NO_FREE_ALLOCATOR_H_

#include "nb/allocator.h"

namespace nb {

// FixedNoFreeAllocator is an allocator that allocates memory but cannot reuse
// previously allocated memory.  Specifying that the allocator will not reuse
// previously allocated memory allows for a simple and fast implementation
// of Allocate(), namely that it can continually increment an internal "next
// memory address" pointer.  The allocator does not own the memory it is
// managing.  This is so that logic to deal with how to allocate and free
// the memory range can remain separate from the allocator managing it.
//
// An example usage of this class is to act as a "fallback" allocator to a more
// complicated allocator that can reuse old memory.  When the reuse allocator
// runs out of memory to recycle, it can fall back to this fallback allocator.
// This makes sense if there's a finite area of memory dedicated to graphics
// memory and we would like to wrap it in an allocator.
class FixedNoFreeAllocator : public Allocator {
 public:
  FixedNoFreeAllocator(void* memory_start, std::size_t memory_size);
  void* Allocate(std::size_t size) { return Allocate(size, 1, true); }

  void* Allocate(std::size_t size, std::size_t alignment) {
    return Allocate(size, alignment, true);
  }

  void* AllocateForAlignment(std::size_t size, std::size_t alignment) {
    return Allocate(size, alignment, false);
  }
  void* Allocate(std::size_t size, std::size_t alignment, bool align_pointer);
  void Free(void* memory);
  std::size_t GetCapacity() const;
  std::size_t GetAllocated() const;
  void PrintAllocations() const;

 private:
  // The start of our memory range, as passed in to the constructor.
  void* const memory_start_;

  // Equal to the first value of memory outside of the allocator's memory range.
  const void* memory_end_;

  // The memory location that will be passed out upon the next allocation.
  void* next_memory_;
};

}  // namespace nb

#endif  // NB_FIXED_NO_FREE_ALLOCATOR_H_
