// 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 INCLUDE_CPPGC_DEFAULT_PLATFORM_H_
#define INCLUDE_CPPGC_DEFAULT_PLATFORM_H_

#include <memory>
#include <vector>

#include "cppgc/platform.h"
#include "libplatform/libplatform.h"
#include "v8config.h"  // NOLINT(build/include_directory)

namespace cppgc {

/**
 * Platform provided by cppgc. Uses V8's DefaultPlatform provided by
 * libplatform internally. Exception: `GetForegroundTaskRunner()`, see below.
 */
class V8_EXPORT DefaultPlatform : public Platform {
 public:
  using IdleTaskSupport = v8::platform::IdleTaskSupport;
  explicit DefaultPlatform(
      int thread_pool_size = 0,
      IdleTaskSupport idle_task_support = IdleTaskSupport::kDisabled)
      : v8_platform_(v8::platform::NewDefaultPlatform(thread_pool_size,
                                                      idle_task_support)) {}

  cppgc::PageAllocator* GetPageAllocator() override {
    return v8_platform_->GetPageAllocator();
  }

  double MonotonicallyIncreasingTime() override {
    return v8_platform_->MonotonicallyIncreasingTime();
  }

  std::shared_ptr<cppgc::TaskRunner> GetForegroundTaskRunner() override {
    // V8's default platform creates a new task runner when passed the
    // `v8::Isolate` pointer the first time. For non-default platforms this will
    // require getting the appropriate task runner.
    return v8_platform_->GetForegroundTaskRunner(kNoIsolate);
  }

  std::unique_ptr<cppgc::JobHandle> PostJob(
      cppgc::TaskPriority priority,
      std::unique_ptr<cppgc::JobTask> job_task) override {
    return v8_platform_->PostJob(priority, std::move(job_task));
  }

 protected:
  static constexpr v8::Isolate* kNoIsolate = nullptr;

  std::unique_ptr<v8::Platform> v8_platform_;
};

}  // namespace cppgc

#endif  // INCLUDE_CPPGC_DEFAULT_PLATFORM_H_
