60 lines
2.1 KiB
C++
60 lines
2.1 KiB
C++
//===- WalkResult.h - Status of completed walk ------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Result kind for completed walk.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef MLIR_SUPPORT_WALKRESULT_H
|
|
#define MLIR_SUPPORT_WALKRESULT_H
|
|
|
|
#include "mlir/Support/LLVM.h"
|
|
|
|
namespace mlir {
|
|
class Diagnostic;
|
|
class InFlightDiagnostic;
|
|
|
|
/// A utility result that is used to signal how to proceed with an ongoing walk:
|
|
/// * Interrupt: the walk will be interrupted and no more operations, regions
|
|
/// or blocks will be visited.
|
|
/// * Advance: the walk will continue.
|
|
/// * Skip: the walk of the current operation, region or block and their
|
|
/// nested elements that haven't been visited already will be skipped and will
|
|
/// continue with the next operation, region or block.
|
|
class WalkResult {
|
|
enum ResultEnum { Interrupt, Advance, Skip } result;
|
|
|
|
public:
|
|
WalkResult(ResultEnum result = Advance) : result(result) {}
|
|
|
|
/// Allow LogicalResult to interrupt the walk on failure.
|
|
WalkResult(LogicalResult result)
|
|
: result(failed(result) ? Interrupt : Advance) {}
|
|
|
|
/// Allow diagnostics to interrupt the walk.
|
|
WalkResult(Diagnostic &&) : result(Interrupt) {}
|
|
WalkResult(InFlightDiagnostic &&) : result(Interrupt) {}
|
|
|
|
bool operator==(const WalkResult &rhs) const { return result == rhs.result; }
|
|
bool operator!=(const WalkResult &rhs) const { return result != rhs.result; }
|
|
|
|
static WalkResult interrupt() { return {Interrupt}; }
|
|
static WalkResult advance() { return {Advance}; }
|
|
static WalkResult skip() { return {Skip}; }
|
|
|
|
/// Returns true if the walk was interrupted.
|
|
bool wasInterrupted() const { return result == Interrupt; }
|
|
|
|
/// Returns true if the walk was skipped.
|
|
bool wasSkipped() const { return result == Skip; }
|
|
};
|
|
|
|
} // namespace mlir
|
|
|
|
#endif
|