Browse Source

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 <[email protected]>
santorac 4 years ago
parent
commit
2c55ea574d

+ 36 - 0
Code/Framework/AtomCore/AtomCore/Utils/ScopedValue.h

@@ -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

+ 1 - 0
Code/Framework/AtomCore/AtomCore/atomcore_files.cmake

@@ -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
 )

+ 37 - 0
Code/Framework/AtomCore/Tests/ScopedValueTest.cpp

@@ -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);
+    }
+}

+ 1 - 0
Code/Framework/AtomCore/Tests/atomcore_tests_files.cmake

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