From b5527845c4ccd01e0ea7aa0a5ef0a2b4ef7ea735 Mon Sep 17 00:00:00 2001
From: Basile Burg <basile.b@gmx.com>
Date: Sat, 2 Jul 2016 16:54:05 +0200
Subject: [PATCH] dastworx, define the bad versions

---
 dastworx/src/common.d | 131 +++++++++++++++++++++++++++++++++++++++---
 dastworx/src/main.d   |   1 +
 2 files changed, 123 insertions(+), 9 deletions(-)

diff --git a/dastworx/src/common.d b/dastworx/src/common.d
index e6fea690..2d15d59c 100644
--- a/dastworx/src/common.d
+++ b/dastworx/src/common.d
@@ -50,15 +50,128 @@ q{
     else version(unittest) log();
 };
 
-// TODO: define accurately the list of bad versions
-version(linux)
-    enum badVersions = ["none", "Windows", "Win32", "Win64", "OSX"];
-else version(Windows)
-    enum badVersions = ["none", "linux", "OSX", "Posix",
-        "FreeBSD", "Solaris"];
-else version(OSX)
-    enum badVersions = ["none", "linux", "Windows", "Win32", "Win64"];
-else static assert(0);
+immutable string[] badVersions;
+
+private enum predefinedVersions = [
+	"AArch64",
+	"AIX",
+	"all",
+	"Alpha",
+	"Alpha_HardFloat",
+	"Alpha_SoftFloat",
+	"Android",
+	"ARM",
+	"ARM_HardFloat",
+	"ARM_SoftFloat",
+	"ARM_SoftFP",
+	"ARM_Thumb",
+	"assert",
+	"BigEndian",
+	"BSD",
+	"CRuntime_Bionic",
+	"CRuntime_DigitalMars",
+	"CRuntime_Glibc",
+	"CRuntime_Microsoft",
+	"Cygwin",
+	"DigitalMars",
+	"DragonFlyBSD",
+	"D_Coverage",
+	"D_Ddoc",
+	"D_HardFloat",
+	"D_InlineAsm_X86",
+	"D_InlineAsm_X86_64",
+	"D_LP64",
+	"D_NoBoundsChecks",
+	"D_PIC",
+	"D_SIMD",
+	"D_SoftFloat",
+	"D_Version2",
+	"D_X32",
+	"ELFv1",
+	"ELFv2",
+	"Epiphany",
+	"FreeBSD",
+	"FreeStanding",
+	"GNU",
+	"Haiku",
+	"HPPA",
+	"HPPA64",
+	"Hurd",
+	"IA64",
+	"iOS",
+	"LDC",
+	"linux",
+	"LittleEndian",
+	"MinGW",
+	"MIPS32",
+	"MIPS64",
+	"MIPS_EABI",
+	"MIPS_HardFloat",
+	"MIPS_N32",
+	"MIPS_N64",
+	"MIPS_O32",
+	"MIPS_O64",
+	"MIPS_SoftFloat",
+	"NetBSD",
+	"none",
+	"NVPTX",
+	"NVPTX64",
+	"OpenBSD",
+	"OSX",
+	"PlayStation",
+	"PlayStation4",
+	"Posix",
+	"PPC",
+	"PPC64",
+	"PPC_HardFloat",
+	"PPC_SoftFloat",
+	"S390",
+	"S390X",
+	"SDC",
+	"SH",
+	"SH64",
+	"SkyOS",
+	"Solaris",
+	"SPARC",
+	"SPARC64",
+	"SPARC_HardFloat",
+	"SPARC_SoftFloat",
+	"SPARC_V8Plus",
+	"SystemZ",
+	"SysV3",
+	"SysV4",
+	"TVOS",
+	"unittest",
+	"WatchOS",
+	"Win32",
+	"Win64",
+	"Windows",
+	"X86",
+	"X86_64"
+];
+
+static this()
+{
+    // note: compiler switch -m32/64 can lead to wrong results
+    string addVersionidentifier(string ver)()
+    {
+        return `version(` ~ ver ~ `){} else badVersions ~= "` ~ ver ~ "\";\n";
+    }
+
+    string addVerionIdentifiers()
+    {
+        import std.meta: aliasSeqOf;
+        import std.range: iota;
+        string result;
+        foreach(i; aliasSeqOf!(iota(0, predefinedVersions.length)))
+        {
+            result ~= addVersionidentifier!(predefinedVersions[i]);
+        }
+        return result;
+    }
+
+    mixin(addVerionIdentifiers);
+}
 
 /**
  * Make a D string compatible with an Object Pascal string literal.
diff --git a/dastworx/src/main.d b/dastworx/src/main.d
index 643d8ee9..0f6e11d0 100644
--- a/dastworx/src/main.d
+++ b/dastworx/src/main.d
@@ -137,6 +137,7 @@ version(devel)
 {
     version(none) import std.compiler;
     version(all) import std.uri;
+    version(WatchOS) import std.math;
     mixin(q{import std.c.time;});
     // TODO: something
     // NOTE: there was a bug here...