Added a new ScopedValue utility class that simply sets a value when it goes out of scope. This is particularly handy for flags that track whether the callstack is inside a particular scope, like a m_isInitializing flag.

Signed-off-by: santorac <55155825+santorac@users.noreply.github.com>
monroegm-disable-blank-issue-2
santorac 4 years ago
parent 4c1c2d6f6b
commit 2c55ea574d

@ -0,0 +1,36 @@
/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#pragma once
#include <AzCore/std/functional.h>
namespace AZ
{
//! Sets a variable upon construction and again when the object goes out of scope.
template<typename T>
class ScopedValue
{
private:
T* m_ptr;
T m_finalValue;
public:
ScopedValue(T* ptr, T initialValue, T finalValue)
{
m_ptr = ptr;
*m_ptr = initialValue;
m_finalValue = finalValue;
}
~ScopedValue()
{
*m_ptr = m_finalValue;
}
};
} // namespace AZ

@ -19,4 +19,5 @@ set(FILES
std/containers/vector_set.h
std/containers/vector_set_base.h
std/parallel/concurrency_checker.h
Utils/ScopedValue.h
)

@ -0,0 +1,37 @@
/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#include <AtomCore/Utils/ScopedValue.h>
#include <AzCore/UnitTest/TestTypes.h>
namespace UnitTest
{
TEST(ScopedValueTest, TestBoolValue)
{
bool localValue = false;
{
AZ::ScopedValue<bool> scopedValue(&localValue, true, false);
EXPECT_EQ(true, localValue);
}
EXPECT_EQ(false, localValue);
}
TEST(ScopedValueTest, TestIntValue)
{
int localValue = 0;
{
AZ::ScopedValue<int> scopedValue(&localValue, 1, 2);
EXPECT_EQ(1, localValue);
}
EXPECT_EQ(2, localValue);
}
}

@ -12,5 +12,6 @@ set(FILES
InstanceDatabase.cpp
lru_cache.cpp
Main.cpp
ScopedValueTest.cpp
vector_set.cpp
)

Loading…
Cancel
Save