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>
This commit is contained in:
@@ -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.h
|
||||||
std/containers/vector_set_base.h
|
std/containers/vector_set_base.h
|
||||||
std/parallel/concurrency_checker.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
|
InstanceDatabase.cpp
|
||||||
lru_cache.cpp
|
lru_cache.cpp
|
||||||
Main.cpp
|
Main.cpp
|
||||||
|
ScopedValueTest.cpp
|
||||||
vector_set.cpp
|
vector_set.cpp
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user