mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-11 14:41:50 +00:00
utils: Add TINT_SCOPED_ASSIGNMENT()
A helper class and macro used to simplify scope-based assignment of variables. Change-Id: I02b3a05240a2c4628f813de931c40d8fba3cb07b Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/51480 Auto-Submit: Ben Clayton <bclayton@google.com> Kokoro: Kokoro <noreply+kokoro@google.com> Reviewed-by: Antonio Maiorano <amaiorano@google.com> Commit-Queue: Ben Clayton <bclayton@google.com>
This commit is contained in:
committed by
Commit Bot service account
parent
f3dcbf5c5c
commit
b350500cdb
64
src/utils/scoped_assignment.h
Normal file
64
src/utils/scoped_assignment.h
Normal file
@@ -0,0 +1,64 @@
|
||||
// Copyright 2021 The Tint Authors.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#ifndef SRC_UTILS_SCOPED_ASSIGNMENT_H_
|
||||
#define SRC_UTILS_SCOPED_ASSIGNMENT_H_
|
||||
|
||||
#include <type_traits>
|
||||
|
||||
namespace tint {
|
||||
namespace utils {
|
||||
|
||||
/// Helper class that temporarily assigns a value to a variable for the lifetime
|
||||
/// of the ScopedAssignment object. Once the ScopedAssignment is destructed, the
|
||||
/// original value is restored.
|
||||
template <typename T>
|
||||
class ScopedAssignment {
|
||||
public:
|
||||
/// Constructor
|
||||
/// @param var the variable to temporarily assign a new value to
|
||||
/// @param val the value to assign to `ref` for the lifetime of this
|
||||
/// ScopedAssignment.
|
||||
ScopedAssignment(T& var, T val) : ref_(var) {
|
||||
old_value_ = var;
|
||||
var = val;
|
||||
}
|
||||
|
||||
/// Destructor
|
||||
/// Restores the original value of the variable.
|
||||
~ScopedAssignment() { ref_ = old_value_; }
|
||||
|
||||
private:
|
||||
ScopedAssignment(const ScopedAssignment&) = delete;
|
||||
ScopedAssignment& operator=(const ScopedAssignment&) = delete;
|
||||
|
||||
T& ref_;
|
||||
T old_value_;
|
||||
};
|
||||
|
||||
} // namespace utils
|
||||
} // namespace tint
|
||||
|
||||
#define TINT_CONCAT_2(a, b) a##b
|
||||
#define TINT_CONCAT(a, b) TINT_CONCAT_2(a, b)
|
||||
|
||||
/// TINT_SCOPED_ASSIGNMENT(var, val) assigns `val` to `var`, and automatically
|
||||
/// restores the original value of `var` when exiting the current lexical scope.
|
||||
#define TINT_SCOPED_ASSIGNMENT(var, val) \
|
||||
::tint::utils::ScopedAssignment<std::remove_reference_t<decltype(var)>> \
|
||||
TINT_CONCAT(tint_scoped_assignment_, __COUNTER__) { \
|
||||
var, val \
|
||||
}
|
||||
|
||||
#endif // SRC_UTILS_SCOPED_ASSIGNMENT_H_
|
||||
47
src/utils/scoped_assignment_test.cc
Normal file
47
src/utils/scoped_assignment_test.cc
Normal file
@@ -0,0 +1,47 @@
|
||||
// Copyright 2021 The Tint Authors.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#include "src/utils/scoped_assignment.h"
|
||||
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
namespace tint {
|
||||
namespace utils {
|
||||
namespace {
|
||||
|
||||
TEST(ScopedAssignmentTest, Scopes) {
|
||||
int i = 0;
|
||||
EXPECT_EQ(i, 0);
|
||||
{
|
||||
EXPECT_EQ(i, 0);
|
||||
TINT_SCOPED_ASSIGNMENT(i, 1);
|
||||
EXPECT_EQ(i, 1);
|
||||
{
|
||||
EXPECT_EQ(i, 1);
|
||||
TINT_SCOPED_ASSIGNMENT(i, 2);
|
||||
EXPECT_EQ(i, 2);
|
||||
}
|
||||
{
|
||||
EXPECT_EQ(i, 1);
|
||||
TINT_SCOPED_ASSIGNMENT(i, 3);
|
||||
EXPECT_EQ(i, 3);
|
||||
}
|
||||
EXPECT_EQ(i, 1);
|
||||
}
|
||||
EXPECT_EQ(i, 0);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace utils
|
||||
} // namespace tint
|
||||
Reference in New Issue
Block a user