Files
2026-08-16 18:24:52 +07:00

116 lines
2.4 KiB
C++

//-----------------------------------------------------------------------------
// Project : VST SDK
//
// Category : Helpers
// Filename : public.sdk/source/vst/utility/optional.h
// Created by : Steinberg, 08/2016
// Description : optional helper
//
//-----------------------------------------------------------------------------
// This file is part of a Steinberg SDK. It is subject to the license terms
// in the LICENSE file found in the top-level directory of this distribution
// and at www.steinberg.net/sdklicenses.
// No part of the SDK, including this file, may be copied, modified, propagated,
// or distributed except according to the terms contained in the LICENSE file.
//-----------------------------------------------------------------------------
#pragma once
#include <cassert>
#include <memory>
#include <utility>
//------------------------------------------------------------------------
namespace VST3 {
//------------------------------------------------------------------------
template <typename T>
struct Optional
{
Optional () noexcept : valid (false) {}
explicit Optional (const T& v) noexcept : _value (v), valid (true) {}
Optional (T&& v) noexcept : _value (std::move (v)), valid (true) {}
Optional (Optional&& other) noexcept { *this = std::move (other); }
Optional& operator= (Optional&& other) noexcept
{
valid = other.valid;
_value = std::move (other._value);
return *this;
}
explicit operator bool () const noexcept
{
setValidationChecked ();
return valid;
}
const T& operator* () const noexcept
{
checkValid ();
return _value;
}
const T* operator-> () const noexcept
{
checkValid ();
return &_value;
}
T& operator* () noexcept
{
checkValid ();
return _value;
}
T* operator-> () noexcept
{
checkValid ();
return &_value;
}
T&& value () noexcept
{
checkValid ();
return std::move (_value);
}
const T& value () const noexcept
{
checkValid ();
return _value;
}
void swap (T& other) noexcept
{
checkValid ();
auto tmp = std::move (other);
other = std::move (_value);
_value = std::move (tmp);
}
private:
T _value {};
bool valid;
#if !defined(NDEBUG)
mutable bool validationChecked {false};
#endif
void setValidationChecked () const
{
#if !defined(NDEBUG)
validationChecked = true;
#endif
}
void checkValid () const
{
#if !defined(NDEBUG)
assert (validationChecked);
#endif
}
};
//------------------------------------------------------------------------
}