|
- /*
- * Carla Scope-related classes and tools (pointer and setter taken from JUCE v4)
- * Copyright (C) 2013 Raw Material Software Ltd.
- * Copyright (c) 2016 ROLI Ltd.
- * Copyright (C) 2013-2020 Filipe Coelho <falktx@falktx.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * For a full copy of the GNU General Public License see the doc/GPL.txt file.
- */
-
- #ifndef CARLA_SCOPE_UTILS_HPP_INCLUDED
- #define CARLA_SCOPE_UTILS_HPP_INCLUDED
-
- #include "CarlaUtils.hpp"
-
- #include <algorithm>
- #include <clocale>
-
- #if ! (defined(CARLA_OS_HAIKU) || defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN))
- # define CARLA_USE_NEWLOCALE
- #endif
-
- #if defined(CARLA_OS_WIN) && __MINGW64_VERSION_MAJOR >= 5
- # define CARLA_USE_CONFIGTHREADLOCALE
- #endif
-
- // -----------------------------------------------------------------------
- // CarlaScopedEnvVar class
-
- class CarlaScopedEnvVar {
- public:
- CarlaScopedEnvVar(const char* const envVar, const char* const valueOrNull) noexcept
- : key(nullptr),
- origValue(nullptr)
- {
- CARLA_SAFE_ASSERT_RETURN(envVar != nullptr && envVar[0] != '\0',);
-
- key = carla_strdup_safe(envVar);
- CARLA_SAFE_ASSERT_RETURN(key != nullptr,);
-
- if (const char* const envVarValue = std::getenv(key))
- {
- origValue = carla_strdup_safe(envVarValue);
- CARLA_SAFE_ASSERT_RETURN(origValue != nullptr,);
- }
-
- // change env var if requested
- if (valueOrNull != nullptr)
- carla_setenv(key, valueOrNull);
- // if null, unset. but only if there is in an active env var value
- else if (origValue != nullptr)
- carla_unsetenv(key);
- }
-
- ~CarlaScopedEnvVar() noexcept
- {
- bool hasOrigValue = false;
-
- if (origValue != nullptr)
- {
- hasOrigValue = true;
-
- carla_setenv(key, origValue);
-
- delete[] origValue;
- origValue = nullptr;
- }
-
- if (key != nullptr)
- {
- if (! hasOrigValue)
- carla_unsetenv(key);
-
- delete[] key;
- key = nullptr;
- }
- }
-
- private:
- const char* key;
- const char* origValue;
-
- CARLA_DECLARE_NON_COPYABLE(CarlaScopedEnvVar)
- CARLA_PREVENT_HEAP_ALLOCATION
- };
-
- //=====================================================================================================================
- /**
- Helper class providing an RAII-based mechanism for temporarily setting and
- then re-setting a value.
-
- E.g. @code
- int x = 1;
-
- {
- CarlaScopedValueSetter setter (x, 2);
-
- // x is now 2
- }
-
- // x is now 1 again
-
- {
- CarlaScopedValueSetter setter (x, 3, 4);
-
- // x is now 3
- }
-
- // x is now 4
- @endcode
- */
- template <typename ValueType>
- class CarlaScopedValueSetter
- {
- public:
- /** Creates a CarlaScopedValueSetter that will immediately change the specified value to the
- given new value, and will then reset it to its original value when this object is deleted.
- Must be used only for 'noexcept' compatible types.
- */
- CarlaScopedValueSetter(ValueType& valueToSet, ValueType newValue) noexcept
- : value(valueToSet),
- originalValue(valueToSet)
- {
- valueToSet = newValue;
- }
-
- /** Creates a CarlaScopedValueSetter that will immediately change the specified value to the
- given new value, and will then reset it to be valueWhenDeleted when this object is deleted.
- */
- CarlaScopedValueSetter(ValueType& valueToSet, ValueType newValue, ValueType valueWhenDeleted) noexcept
- : value(valueToSet),
- originalValue(valueWhenDeleted)
- {
- valueToSet = newValue;
- }
-
- ~CarlaScopedValueSetter() noexcept
- {
- value = originalValue;
- }
-
- private:
- //=================================================================================================================
- ValueType& value;
- const ValueType originalValue;
-
- CARLA_DECLARE_NON_COPYABLE(CarlaScopedValueSetter)
- CARLA_PREVENT_HEAP_ALLOCATION
- };
-
- // -----------------------------------------------------------------------
-
- #endif // CARLA_SCOPE_UTILS_HPP_INCLUDED
|