mirror of
https://github.com/izzy2lost/dolphin.git
synced 2026-06-19 01:16:48 -07:00
Common: Add a std::optional implementation
std::optional makes a few things a bit neater and less error prone. However, we still cannot use C++17 (unfortunately), so this commit adds an implementation of std::optional that we can use right now. Based on https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/lib/gtl/optional.h which seems to be fairly similar to C++17's <optional> and standards compliant. It's one of the few implementations that handle propagating type traits like copy constructibility, just like libc++/libstdc++.
This commit is contained in:
+23
-9
@@ -1,7 +1,3 @@
|
||||
set(CMAKE_CXX_STANDARD 14)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||
|
||||
if(CMAKE_SYSTEM_NAME MATCHES "Windows")
|
||||
add_definitions(-DNOMINMAX)
|
||||
add_definitions(-DUNICODE)
|
||||
@@ -13,11 +9,29 @@ if(CMAKE_SYSTEM_NAME MATCHES "Windows")
|
||||
add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
|
||||
endif()
|
||||
|
||||
# enable the latest C++ standard feature set,
|
||||
# and also disable MSVC specific extensions
|
||||
# to be even more standards compliant.
|
||||
check_and_add_flag(CPPLATEST /std:c++latest)
|
||||
check_and_add_flag(STANDARD_COMPLIANCE /permissive-)
|
||||
if(CMAKE_C_COMPILER_ID MATCHES "MSVC")
|
||||
# enable the latest C++ standard feature set,
|
||||
# and also disable MSVC specific extensions
|
||||
# to be even more standards compliant.
|
||||
check_and_add_flag(CPPLATEST /std:c++latest)
|
||||
check_and_add_flag(STANDARD_COMPLIANCE /permissive-)
|
||||
else()
|
||||
# Enable C++17, but fall back to C++14 if it isn't available.
|
||||
# CMAKE_CXX_STANDARD cannot be used here because we require C++14 or newer, not any standard.
|
||||
check_and_add_flag(CXX17 -std=c++17)
|
||||
if(NOT FLAG_CXX_CXX17)
|
||||
check_and_add_flag(CXX1Z -std=c++1z)
|
||||
if (NOT FLAG_CXX_CXX1Z)
|
||||
set(CMAKE_CXX_STANDARD 14)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# These compat headers must not be in the include path when building with MSVC,
|
||||
# because it currently does not support __has_include_next / #include_next.
|
||||
include_directories(SYSTEM Core/Common/Compat)
|
||||
endif()
|
||||
|
||||
# These aren't actually needed for C11/C++11
|
||||
# but some dependencies require them (LLVM, libav).
|
||||
|
||||
@@ -227,4 +227,4 @@
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
</Project>
|
||||
|
||||
@@ -324,4 +324,4 @@
|
||||
<ItemGroup>
|
||||
<Natvis Include="BitField.natvis" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
</Project>
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
// Copyright 2017 Dolphin Emulator Project
|
||||
// Licensed under GPLv2+
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#pragma once
|
||||
|
||||
// MPark.Variant
|
||||
//
|
||||
// Copyright Michael Park, 2015-2017
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#include <cstddef>
|
||||
|
||||
namespace std
|
||||
{
|
||||
struct in_place_t
|
||||
{
|
||||
explicit in_place_t() = default;
|
||||
};
|
||||
|
||||
template <std::size_t I>
|
||||
struct in_place_index_t
|
||||
{
|
||||
explicit in_place_index_t() = default;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct in_place_type_t
|
||||
{
|
||||
explicit in_place_type_t() = default;
|
||||
};
|
||||
|
||||
constexpr in_place_t in_place{};
|
||||
|
||||
template <std::size_t I>
|
||||
constexpr in_place_index_t<I> in_place_index{};
|
||||
|
||||
template <typename T>
|
||||
constexpr in_place_type_t<T> in_place_type{};
|
||||
|
||||
} // namespace std
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user