diff options
Diffstat (limited to 'Utilities')
-rw-r--r-- | Utilities/Doxygen/CMakeLists.txt | 2 | ||||
-rw-r--r-- | Utilities/Sphinx/CMakeLists.txt | 2 | ||||
-rw-r--r-- | Utilities/std/cm/optional | 48 |
3 files changed, 37 insertions, 15 deletions
diff --git a/Utilities/Doxygen/CMakeLists.txt b/Utilities/Doxygen/CMakeLists.txt index 5bf13f3..a880f7a 100644 --- a/Utilities/Doxygen/CMakeLists.txt +++ b/Utilities/Doxygen/CMakeLists.txt @@ -3,7 +3,7 @@ if(NOT CMake_SOURCE_DIR) set(CMakeDeveloperReference_STANDALONE 1) - cmake_minimum_required(VERSION 3.1...3.15 FATAL_ERROR) + cmake_minimum_required(VERSION 3.1...3.18 FATAL_ERROR) get_filename_component(tmp "${CMAKE_CURRENT_SOURCE_DIR}" PATH) get_filename_component(CMake_SOURCE_DIR "${tmp}" PATH) include(${CMake_SOURCE_DIR}/Modules/CTestUseLaunchers.cmake) diff --git a/Utilities/Sphinx/CMakeLists.txt b/Utilities/Sphinx/CMakeLists.txt index e5be43a..f989907 100644 --- a/Utilities/Sphinx/CMakeLists.txt +++ b/Utilities/Sphinx/CMakeLists.txt @@ -3,7 +3,7 @@ if(NOT CMake_SOURCE_DIR) set(CMakeHelp_STANDALONE 1) - cmake_minimum_required(VERSION 3.1...3.15 FATAL_ERROR) + cmake_minimum_required(VERSION 3.1...3.18 FATAL_ERROR) get_filename_component(tmp "${CMAKE_CURRENT_SOURCE_DIR}" PATH) get_filename_component(CMake_SOURCE_DIR "${tmp}" PATH) include(${CMake_SOURCE_DIR}/Modules/CTestUseLaunchers.cmake) diff --git a/Utilities/std/cm/optional b/Utilities/std/cm/optional index 9a5d840..0defae1 100644 --- a/Utilities/std/cm/optional +++ b/Utilities/std/cm/optional @@ -68,16 +68,22 @@ public: optional& operator=(nullopt_t) noexcept; optional& operator=(const optional& other); - optional& operator=(optional&& other) noexcept; - template < - typename U = T, - typename = typename std::enable_if< - !std::is_same<typename std::decay<U>::type, cm::optional<T>>::value && - std::is_constructible<T, U>::value && std::is_assignable<T&, U>::value && + template <typename U = T> + typename std::enable_if<std::is_constructible<T, U&&>::value && + std::is_assignable<T&, U&&>::value, + optional&>::type + operator=(optional<U>&& other) noexcept; + + template <typename U = T> + typename std::enable_if< + !std::is_same<typename std::decay<U>::type, cm::optional<T>>::value && + std::is_constructible<T, U&&>::value && + std::is_assignable<T&, U&&>::value && (!std::is_scalar<T>::value || - !std::is_same<typename std::decay<U>::type, T>::value)>::type> - optional& operator=(U&& v); + !std::is_same<typename std::decay<U>::type, T>::value), + optional&>::type + operator=(U&& v); const T* operator->() const; T* operator->(); @@ -134,19 +140,24 @@ optional<T> make_optional(Args&&... args) template <typename T> optional<T>::optional(nullopt_t) noexcept + : optional() { } template <typename T> optional<T>::optional(const optional& other) { - *this = other; + if (other.has_value()) { + this->emplace(*other); + } } template <typename T> optional<T>::optional(optional&& other) noexcept { - *this = std::move(other); + if (other.has_value()) { + this->emplace(std::move(*other)); + } } template <typename T> @@ -192,7 +203,11 @@ optional<T>& optional<T>::operator=(const optional& other) } template <typename T> -optional<T>& optional<T>::operator=(optional&& other) noexcept +template <typename U> +typename std::enable_if<std::is_constructible<T, U&&>::value && + std::is_assignable<T&, U&&>::value, + optional<T>&>::type +optional<T>::operator=(optional<U>&& other) noexcept { if (other.has_value()) { if (this->has_value()) { @@ -207,8 +222,15 @@ optional<T>& optional<T>::operator=(optional&& other) noexcept } template <typename T> -template <typename U, typename> -optional<T>& optional<T>::operator=(U&& v) +template <typename U> +typename std::enable_if< + !std::is_same<typename std::decay<U>::type, cm::optional<T>>::value && + std::is_constructible<T, U&&>::value && + std::is_assignable<T&, U&&>::value && + (!std::is_scalar<T>::value || + !std::is_same<typename std::decay<U>::type, T>::value), + optional<T>&>::type +optional<T>::operator=(U&& v) { if (this->has_value()) { this->value() = v; |