// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

#ifndef RUNTIME_LLVM_CODEGEN_CODEGEN_CUSTOM_ZONE_H_
#define RUNTIME_LLVM_CODEGEN_CODEGEN_CUSTOM_ZONE_H_

#include <vector>

// We use a custom zone here which doesn't depend on VM internals (e.g. handles,
// thread, ...)
#if defined(RUNTIME_VM_ZONE_H_)
#error "We want our own zone implementation"
#endif
#define RUNTIME_VM_ZONE_H_

namespace dart {

class Zone {
 public:
  Zone() {}
  ~Zone();

  template <class ElementType>
  inline ElementType* Alloc(intptr_t length) {
    return static_cast<ElementType*>(
        AllocUnsafe(sizeof(ElementType) * length));
  }

  template <class ElementType>
  inline ElementType* Realloc(ElementType* old_array,
                              intptr_t old_length,
                              intptr_t new_length) {
    void* memory = AllocUnsafe(sizeof(ElementType) * new_length);
    memmove(memory, old_array, sizeof(ElementType) * old_length);
    return static_cast<ElementType*>(memory);
  }

  template <class ElementType>
  void Free(ElementType* old_array, intptr_t len) {}

  void* AllocUnsafe(intptr_t size);

 private:
  Zone(const Zone&) = delete;
  void operator=(const Zone&) = delete;
  std::vector<void*> buffers_;
};

}  // namespace dart

#endif  // RUNTIME_LLVM_CODEGEN_CODEGEN_CUSTOM_ZONE_H_
