Squashed 'third_party/GSL/' content from commit 0cebbd7

Change-Id: Iffb2e32f2f45297ac6d3e82168cd9df4ac5acc2f
git-subtree-dir: third_party/GSL
git-subtree-split: 0cebbd77bfc21acbf1cc05983ad626539eeeb8e0
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..b0de85d
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,84 @@
+cmake_minimum_required(VERSION 3.1.3)
+
+project(GSL CXX)
+
+include(ExternalProject)
+find_package(Git)
+
+# creates a library GSL which is an interface (header files only)
+add_library(GSL INTERFACE)
+
+# determine whether this is a standalone project or included by other projects
+set(GSL_STANDALONE_PROJECT OFF)
+if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
+  set(GSL_STANDALONE_PROJECT ON)
+endif ()
+
+set(GSL_CXX_STANDARD "14" CACHE STRING "Use c++ standard")
+set(GSL_CXX_STD "cxx_std_${GSL_CXX_STANDARD}")
+
+if (MSVC)
+    set(GSL_CXX_STD_OPT "-std:c++${GSL_CXX_STANDARD}")
+else()
+    set(GSL_CXX_STD_OPT "-std=c++${GSL_CXX_STANDARD}")
+endif()
+
+# when minimum version required is 3.8.0 remove if below
+# both branches do exactly the same thing
+if (CMAKE_VERSION VERSION_LESS 3.7.9)
+    include(CheckCXXCompilerFlag)
+    CHECK_CXX_COMPILER_FLAG("${GSL_CXX_STD_OPT}" COMPILER_SUPPORTS_CXX_STANDARD)
+
+    if(COMPILER_SUPPORTS_CXX_STANDARD)
+        target_compile_options(GSL INTERFACE "${GSL_CXX_STD_OPT}")
+    else()
+        message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no c++${GSL_CXX_STANDARD} support. Please use a different C++ compiler.")
+    endif()
+else ()
+    target_compile_features(GSL INTERFACE "${GSL_CXX_STD}")
+    # on *nix systems force the use of -std=c++XX instead of -std=gnu++XX (default)
+    set(CMAKE_CXX_EXTENSIONS OFF)
+endif()
+
+# add definitions to the library and targets that consume it
+target_compile_definitions(GSL INTERFACE
+    $<$<CXX_COMPILER_ID:MSVC>:
+        # remove unnecessary warnings about unchecked iterators
+        _SCL_SECURE_NO_WARNINGS
+        # remove deprecation warnings about std::uncaught_exception() (from catch)
+        _SILENCE_CXX17_UNCAUGHT_EXCEPTION_DEPRECATION_WARNING
+    >
+)
+
+# add include folders to the library and targets that consume it
+target_include_directories(GSL INTERFACE
+    $<BUILD_INTERFACE:
+        ${CMAKE_CURRENT_SOURCE_DIR}/include
+    >
+)
+
+if ((CMAKE_VERSION GREATER 3.7.9) OR (CMAKE_VERSION EQUAL 3.7.9))
+    if (MSVC_IDE)
+        option(VS_ADD_NATIVE_VISUALIZERS "Configure project to use Visual Studio native visualizers" TRUE)
+    else()
+        set(VS_ADD_NATIVE_VISUALIZERS FALSE CACHE INTERNAL "Native visualizers are Visual Studio extension" FORCE)
+    endif()
+
+    # add natvis file to the library so it will automatically be loaded into Visual Studio
+    if(VS_ADD_NATIVE_VISUALIZERS)
+        target_sources(GSL INTERFACE
+            ${CMAKE_CURRENT_SOURCE_DIR}/GSL.natvis
+        )
+    endif()
+endif()
+
+install(
+    DIRECTORY include/gsl
+    DESTINATION include
+)
+
+option(GSL_TEST "Generate tests." ${GSL_STANDALONE_PROJECT})
+if (GSL_TEST)
+	enable_testing()
+	add_subdirectory(tests)
+endif ()