From a65723d4da1af40f4a790b689b8a95a5748a892e Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Sat, 31 Jul 2021 00:20:27 +0200 Subject: [PATCH] [libcalamares] Extend cPointerSetter with initial-value This is a convenience for "set to at end of scope". --- src/libcalamares/utils/RAII.h | 39 +++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/src/libcalamares/utils/RAII.h b/src/libcalamares/utils/RAII.h index 0b8c9b2aa..00e276ec6 100644 --- a/src/libcalamares/utils/RAII.h +++ b/src/libcalamares/utils/RAII.h @@ -70,11 +70,42 @@ struct cPointerSetter std::optional< T > m_value; T* m_pointer; - cPointerSetter( T* p ) : m_pointer(p) {} - ~cPointerSetter() { if ( m_pointer && m_value.has_value() ) { *m_pointer = m_value.value(); } } + /** @brief Create a setter with no value set + * + * Until a value is set via operator=(), this pointer-setter + * will do nothing on destruction, leaving the pointed-to + * value unchanged. + */ + cPointerSetter( T* p ) + : m_pointer( p ) + { + } + /** @brief Create a setter with a value already set + * + * This ensures that on destruction, the value @p v will be written; + * it is equivalent to assigning @p v immediately. The pointed-to + * value is **not** changed (until destruction). + */ + cPointerSetter( T* p, T v ) + : m_value( v ) + , m_pointer( p ) + { + } + ~cPointerSetter() + { + if ( m_pointer && m_value.has_value() ) + { + *m_pointer = m_value.value(); + } + } - const T& operator=(const T& v) { m_value = v; return v; } + const T& operator=( const T& v ) + { + m_value = v; + return v; + } }; -template < typename T > cPointerSetter( T p ) -> cPointerSetter; +template < typename T > +cPointerSetter( T p )->cPointerSetter< decltype( *p ) >; #endif