blob: c7ea1c615e60621b1a631e04abd3fc495bd08fd4 [file] [log] [blame]
//===- OwningOpRef.h - MLIR OwningOpRef -------------------------*- 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
//
//===----------------------------------------------------------------------===//
//
// This file provides a base class for owning op refs.
//
//===----------------------------------------------------------------------===//
#ifndef MLIR_IR_OWNINGOPREF_H
#define MLIR_IR_OWNINGOPREF_H
#include <utility>
namespace mlir {
/// This class acts as an owning reference to an op, and will automatically
/// destroy the held op on destruction if the held op is valid.
///
/// Note that OpBuilder and related functionality should be highly preferred
/// instead, and this should only be used in situations where existing solutions
/// are not viable.
template <typename OpTy>
class OwningOpRef {
public:
/// The underlying operation type stored in this reference.
using OperationT = OpTy;
OwningOpRef(std::nullptr_t = nullptr) {}
OwningOpRef(OpTy op) : op(op) {}
OwningOpRef(OwningOpRef &&other) : op(other.release()) {}
~OwningOpRef() {
if (op)
op->erase();
}
/// Assign from another op reference.
OwningOpRef &operator=(OwningOpRef &&other) {
if (op)
op->erase();
op = other.release();
return *this;
}
/// Allow accessing the internal op.
OpTy get() const { return op; }
OpTy operator*() const { return op; }
OpTy *operator->() { return &op; }
explicit operator bool() const { return op; }
/// Release the referenced op.
OpTy release() {
OpTy released;
std::swap(released, op);
return released;
}
private:
OpTy op;
};
} // end namespace mlir
#endif // MLIR_IR_OWNINGOPREF_H