#ifndef V8_HEAP_CPPGC_TASK_HANDLE_H_
#define V8_HEAP_CPPGC_TASK_HANDLE_H_
#include <memory>
#include "src/base/logging.h"
namespace cppgc {
namespace internal {
struct SingleThreadedHandle {
struct NonEmptyTag {};
SingleThreadedHandle() = default;
explicit SingleThreadedHandle(NonEmptyTag)
: is_cancelled_(std::make_shared<bool>(false)) {}
void Cancel() {
DCHECK(is_cancelled_);
*is_cancelled_ = true;
}
void CancelIfNonEmpty() {
if (is_cancelled_) {
*is_cancelled_ = true;
}
}
bool IsCanceled() const {
DCHECK(is_cancelled_);
return *is_cancelled_;
}
explicit operator bool() const {
return is_cancelled_.get() && !*is_cancelled_.get();
}
private:
std::shared_ptr<bool> is_cancelled_;
};
}
}
#endif