// Copyright 2015 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_CANCELABLE_TASK_H_
#define V8_CANCELABLE_TASK_H_

#include "include/v8-platform.h"
#include "src/base/macros.h"

namespace v8 {
namespace internal {

class Isolate;


class Cancelable {
 public:
  explicit Cancelable(Isolate* isolate);
  virtual ~Cancelable();

  virtual void Cancel() { is_cancelled_ = true; }

 protected:
  Isolate* isolate_;
  bool is_cancelled_;

 private:
  DISALLOW_COPY_AND_ASSIGN(Cancelable);
};


// Multiple inheritance can be used because Task is a pure interface.
class CancelableTask : public Cancelable, public Task {
 public:
  explicit CancelableTask(Isolate* isolate) : Cancelable(isolate) {}

  // Task overrides.
  void Run() final {
    if (!is_cancelled_) {
      RunInternal();
    }
  }

  virtual void RunInternal() = 0;

 private:
  DISALLOW_COPY_AND_ASSIGN(CancelableTask);
};


// Multiple inheritance can be used because IdleTask is a pure interface.
class CancelableIdleTask : public Cancelable, public IdleTask {
 public:
  explicit CancelableIdleTask(Isolate* isolate) : Cancelable(isolate) {}

  // IdleTask overrides.
  void Run(double deadline_in_seconds) final {
    if (!is_cancelled_) {
      RunInternal(deadline_in_seconds);
    }
  }

  virtual void RunInternal(double deadline_in_seconds) = 0;

 private:
  DISALLOW_COPY_AND_ASSIGN(CancelableIdleTask);
};


}  // namespace internal
}  // namespace v8

#endif  // V8_CANCELABLE_TASK_H_