Browse Source

Merge branch 'release/v0.0.4'

Jérôme BUISINE 4 months ago
parent
commit
57ab4a47b1
1 changed files with 69 additions and 1 deletions
  1. 69 1
      main/rawls_merge.cpp

+ 69 - 1
main/rawls_merge.cpp

@@ -5,9 +5,77 @@
 #include "lodepng.h"
 #include "rawls.h"
 
-#include <filesystem>
 #include <algorithm>
 
+// We haven't checked which filesystem to include yet
+#ifndef INCLUDE_STD_FILESYSTEM_EXPERIMENTAL
+
+// Check for feature test macro for <filesystem>
+#   if defined(__cpp_lib_filesystem)
+#       define INCLUDE_STD_FILESYSTEM_EXPERIMENTAL 0
+
+// Check for feature test macro for <experimental/filesystem>
+#   elif defined(__cpp_lib_experimental_filesystem)
+#       define INCLUDE_STD_FILESYSTEM_EXPERIMENTAL 1
+
+// We can't check if headers exist...
+// Let's assume experimental to be safe
+#   elif !defined(__has_include)
+#       define INCLUDE_STD_FILESYSTEM_EXPERIMENTAL 1
+
+// Check if the header "<filesystem>" exists
+#   elif __has_include(<filesystem>)
+
+// If we're compiling on Visual Studio and are not compiling with C++17, we need to use experimental
+#       ifdef _MSC_VER
+
+// Check and include header that defines "_HAS_CXX17"
+#           if __has_include(<yvals_core.h>)
+#               include <yvals_core.h>
+
+// Check for enabled C++17 support
+#               if defined(_HAS_CXX17) && _HAS_CXX17
+// We're using C++17, so let's use the normal version
+#                   define INCLUDE_STD_FILESYSTEM_EXPERIMENTAL 0
+#               endif
+#           endif
+
+// If the marco isn't defined yet, that means any of the other VS specific checks failed, so we need to use experimental
+#           ifndef INCLUDE_STD_FILESYSTEM_EXPERIMENTAL
+#               define INCLUDE_STD_FILESYSTEM_EXPERIMENTAL 1
+#           endif
+
+// Not on Visual Studio. Let's use the normal version
+#       else // #ifdef _MSC_VER
+#           define INCLUDE_STD_FILESYSTEM_EXPERIMENTAL 0
+#       endif
+
+// Check if the header "<filesystem>" exists
+#   elif __has_include(<experimental/filesystem>)
+#       define INCLUDE_STD_FILESYSTEM_EXPERIMENTAL 1
+
+// Fail if neither header is available with a nice error message
+#   else
+#       error Could not find system header "<filesystem>" or "<experimental/filesystem>"
+#   endif
+
+// We priously determined that we need the exprimental version
+#   if INCLUDE_STD_FILESYSTEM_EXPERIMENTAL
+// Include it
+#       include <experimental/filesystem>
+
+// We need the alias from std::experimental::filesystem to std::filesystem
+namespace std {
+    namespace filesystem = experimental::filesystem;
+}
+
+// We have a decent compiler and can use the normal version
+#   else
+// Include it
+#       include <filesystem>
+#   endif
+
+#endif // #ifndef INCLUDE_STD_FILESYSTEM_EXPERIMENTAL
 
 void writeProgress(float progress){
     int barWidth = 200;