// Copyright 2020 the V8 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.

#ifndef V8_HEAP_CPPGC_HEAP_H_
#define V8_HEAP_CPPGC_HEAP_H_

#include "include/cppgc/heap.h"
#include "include/cppgc/liveness-broker.h"
#include "include/cppgc/macros.h"
#include "src/heap/cppgc/garbage-collector.h"
#include "src/heap/cppgc/gc-invoker.h"
#include "src/heap/cppgc/heap-base.h"
#include "src/heap/cppgc/heap-growing.h"

namespace cppgc {
namespace internal {

class V8_EXPORT_PRIVATE Heap final : public HeapBase,
                                     public cppgc::Heap,
                                     public GarbageCollector {
 public:
  static Heap* From(cppgc::Heap* heap) { return static_cast<Heap*>(heap); }
  static const Heap* From(const cppgc::Heap* heap) {
    return static_cast<const Heap*>(heap);
  }

  Heap(std::shared_ptr<cppgc::Platform> platform,
       cppgc::Heap::HeapOptions options);
  ~Heap() final;

  HeapBase& AsBase() { return *this; }
  const HeapBase& AsBase() const { return *this; }

  void CollectGarbage(Config) final;
  void StartIncrementalGarbageCollection(Config) final;
  void FinalizeIncrementalGarbageCollectionIfRunning(Config);

  size_t epoch() const final { return epoch_; }

  void DisableHeapGrowingForTesting();

 private:
  void StartGarbageCollection(Config);
  void FinalizeGarbageCollection(Config::StackState);

  void FinalizeIncrementalGarbageCollectionIfNeeded(
      Config::StackState stack_state) final {
    FinalizeGarbageCollection(stack_state);
  }

  Config config_;
  GCInvoker gc_invoker_;
  HeapGrowing growing_;

  bool gc_in_progress_ = false;
  size_t epoch_ = 0;
};

}  // namespace internal
}  // namespace cppgc

#endif  // V8_HEAP_CPPGC_HEAP_H_
