1//===-- SaveAndRestore.h - Utility  -------------------------------*- C++ -*-=//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9///
10/// \file
11/// This file provides utility classes that use RAII to save and restore
12/// values.
13///
14//===----------------------------------------------------------------------===//
15
16#ifndef LLVM_SUPPORT_SAVEANDRESTORE_H
17#define LLVM_SUPPORT_SAVEANDRESTORE_H
18
19namespace llvm {
20
21/// A utility class that uses RAII to save and restore the value of a variable.
22template <typename T> struct SaveAndRestore {
23  SaveAndRestore(T &X) : X(X), OldValue(X) {}
24  SaveAndRestore(T &X, const T &NewValue) : X(X), OldValue(X) {
25    X = NewValue;
26  }
27  ~SaveAndRestore() { X = OldValue; }
28  T get() { return OldValue; }
29
30private:
31  T &X;
32  T OldValue;
33};
34
35/// Similar to \c SaveAndRestore.  Operates only on bools; the old value of a
36/// variable is saved, and during the dstor the old value is or'ed with the new
37/// value.
38struct SaveOr {
39  SaveOr(bool &X) : X(X), OldValue(X) { X = false; }
40  ~SaveOr() { X |= OldValue; }
41
42private:
43  bool &X;
44  const bool OldValue;
45};
46
47} // namespace llvm
48
49#endif
50