diff --git a/include/Nazara/Core/MovableValue.hpp b/include/Nazara/Core/MovableValue.hpp new file mode 100644 index 000000000..15f22e19b --- /dev/null +++ b/include/Nazara/Core/MovableValue.hpp @@ -0,0 +1,38 @@ +// Copyright (C) 2020 Jérôme Leclercq +// This file is part of the "Nazara Engine - Core module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_MOVABLE_VALUE_HPP +#define NAZARA_MOVABLE_VALUE_HPP + +namespace Nz +{ + template + class MovableValue + { + public: + MovableValue(T value = T{}); + MovableValue(const MovableValue&) = default; + MovableValue(MovableValue&& ptr) noexcept; + ~MovableValue() = default; + + T& Get(); + const T& Get() const; + + operator T&(); + operator const T&() const; + + MovableValue& operator=(T value); + MovableValue& operator=(const MovableValue&) = default; + MovableValue& operator=(MovableValue&& ptr) noexcept; + + private: + T m_value; + }; +} + +#include + +#endif // NAZARA_MOVABLE_VALUE_HPP diff --git a/include/Nazara/Core/MovableValue.inl b/include/Nazara/Core/MovableValue.inl new file mode 100644 index 000000000..520e32a61 --- /dev/null +++ b/include/Nazara/Core/MovableValue.inl @@ -0,0 +1,61 @@ +// Copyright (C) 2020 Jérôme Leclercq +// This file is part of the "Nazara Engine - Core module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +namespace Nz +{ + template + MovableValue::MovableValue(T value) : + m_value(std::move(value)) + { + } + + template + MovableValue::MovableValue(MovableValue&& val) noexcept : + m_value() + { + std::swap(m_value, val.m_value); + } + + template + T& MovableValue::Get() + { + return m_value; + } + + template + const T& MovableValue::Get() const + { + return m_value; + } + + template + MovableValue::operator T&() + { + return m_value; + } + + template + MovableValue::operator const T&() const + { + return m_value; + } + + template + MovableValue& MovableValue::operator=(T value) + { + m_value = std::move(value); + + return *this; + } + + template + MovableValue& MovableValue::operator=(MovableValue&& ptr) noexcept + { + std::swap(m_value, ptr.m_value); + return *this; + } +}