blob: 86b60cbdf0cf49f273888e1db4eafd92eba7c0ef [file] [log] [blame]
mark@chromium.org4688c262011-06-28 11:20:02 +09001// Copyright (c) 2011 The Chromium Authors. All rights reserved.
pkasting@chromium.orgaea81622009-11-21 08:16:26 +09002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef BASE_AUTO_RESET_H_
6#define BASE_AUTO_RESET_H_
7
8#include "base/basictypes.h"
9
mark@chromium.org4688c262011-06-28 11:20:02 +090010// AutoReset<> is useful for setting a variable to a new value only within a
11// particular scope. An AutoReset<> object resets a variable to its original
12// value upon destruction, making it an alternative to writing "var = false;"
13// or "var = old_val;" at all of a block's exit points.
pkasting@chromium.orgaea81622009-11-21 08:16:26 +090014//
mark@chromium.org4688c262011-06-28 11:20:02 +090015// This should be obvious, but note that an AutoReset<> instance should have a
16// shorter lifetime than its scoped_variable, to prevent invalid memory writes
17// when the AutoReset<> object is destroyed.
pkasting@chromium.orgaea81622009-11-21 08:16:26 +090018
gspencer@chromium.orgeb492ac2010-06-02 04:28:34 +090019template<typename T>
pkasting@chromium.orgaea81622009-11-21 08:16:26 +090020class AutoReset {
21 public:
gspencer@chromium.orgeb492ac2010-06-02 04:28:34 +090022 AutoReset(T* scoped_variable, T new_value)
pkasting@chromium.orgaea81622009-11-21 08:16:26 +090023 : scoped_variable_(scoped_variable),
24 original_value_(*scoped_variable) {
25 *scoped_variable_ = new_value;
26 }
gspencer@chromium.orgeb492ac2010-06-02 04:28:34 +090027
pkasting@chromium.orgaea81622009-11-21 08:16:26 +090028 ~AutoReset() { *scoped_variable_ = original_value_; }
29
30 private:
gspencer@chromium.orgeb492ac2010-06-02 04:28:34 +090031 T* scoped_variable_;
32 T original_value_;
pkasting@chromium.orgaea81622009-11-21 08:16:26 +090033
34 DISALLOW_COPY_AND_ASSIGN(AutoReset);
35};
36
37#endif // BASE_AUTO_RESET_H_