// Copyright 2011 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef BASE_AUTO_RESET_H_
#define BASE_AUTO_RESET_H_

#include <utility>
// Necessary per <utility>'s usage of `sizeof(std::intmax_t)` without IWYU.
#include <stdint.h>

#include "base/check_op.h"
#include "base/memory/raw_ptr_exclusion.h"

// base::AutoReset<> is useful for setting a variable to a new value only within
// a particular scope. An base::AutoReset<> object resets a variable to its
// original value upon destruction, making it an alternative to writing
// "var = false;" or "var = old_val;" at all of a block's exit points.
//
// This should be obvious, but note that an base::AutoReset<> instance should
// have a shorter lifetime than its scoped_variable, to prevent invalid memory
// writes when the base::AutoReset<> object is destroyed.

namespace base {

template <typename T>
class [[maybe_unused, nodiscard]] AutoReset {
 public:
  template <typename U>
  AutoReset(T* scoped_variable, U&& new_value)
      : scoped_variable_(scoped_variable),
        original_value_(
            std::exchange(*scoped_variable_, std::forward<U>(new_value))) {}

  // A constructor that's useful for asserting the old value of
  // `scoped_variable`, especially when it's inconvenient to check this before
  // constructing the AutoReset object (e.g. in a class member initializer
  // list).
  template <typename U>
  AutoReset(T* scoped_variable, U&& new_value, const T& expected_old_value)
      : AutoReset(scoped_variable, new_value) {
    DCHECK_EQ(original_value_, expected_old_value);
  }

  AutoReset(AutoReset&& other)
      : scoped_variable_(std::exchange(other.scoped_variable_, nullptr)),
        original_value_(std::move(other.original_value_)) {}

  AutoReset& operator=(AutoReset&& rhs) {
    scoped_variable_ = std::exchange(rhs.scoped_variable_, nullptr);
    original_value_ = std::move(rhs.original_value_);
    return *this;
  }

  ~AutoReset() {
    if (scoped_variable_) {
      *scoped_variable_ = std::move(original_value_);
    }
  }

 private:
  // `scoped_variable_` is not a raw_ptr<T> for performance reasons: Large
  // number of non-PartitionAlloc pointees + AutoReset is typically short-lived
  // (e.g. allocated on the stack).
  RAW_PTR_EXCLUSION T* scoped_variable_;

  T original_value_;
};

}  // namespace base

#endif  // BASE_AUTO_RESET_H_
