From a7194266b3b994db84a3ea8bb433427cadc81c03 Mon Sep 17 00:00:00 2001
From: Christian Semmler <mail@csemmler.com>
Date: Mon, 11 Dec 2023 16:33:46 -0500
Subject: [PATCH] Refactor utility/decomp headers (#318)

---
 .github/workflows/format.yml     |  1 +
 CMakeLists.txt                   |  4 ++++
 CONTRIBUTING.md                  |  1 +
 LEGO1/mxatomidcounter.h          |  2 +-
 LEGO1/mxcompositepresenter.h     |  2 +-
 LEGO1/mxdiskstreamcontroller.h   |  2 +-
 LEGO1/mxnotificationmanager.h    |  2 +-
 LEGO1/{ => mxstl}/mxstl.h        |  0
 LEGO1/mxstl/stlcompat.h          | 18 ++++++++++++++++++
 LEGO1/mxstreamcontroller.h       |  2 +-
 LEGO1/mxstreamlist.h             |  2 +-
 LEGO1/mxticklemanager.h          |  2 +-
 LEGO1/realtime/matrix.cpp        |  2 +-
 LEGO1/realtime/orientableroi.cpp |  2 +-
 LEGO1/realtime/roi.h             |  4 ++--
 LEGO1/realtime/vector.cpp        |  2 +-
 LEGO1/tgl/d3drm/impl.h           |  2 +-
 LEGO1/viewmanager/viewlodlist.h  |  2 +-
 LEGO1/viewmanager/viewroi.cpp    |  2 +-
 {LEGO1 => util}/compat.h         | 20 +++-----------------
 {LEGO1 => util}/decomp.h         |  0
 21 files changed, 42 insertions(+), 32 deletions(-)
 rename LEGO1/{ => mxstl}/mxstl.h (100%)
 create mode 100644 LEGO1/mxstl/stlcompat.h
 rename {LEGO1 => util}/compat.h (71%)
 rename {LEGO1 => util}/decomp.h (100%)

diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml
index 2eab4970..17380db7 100644
--- a/.github/workflows/format.yml
+++ b/.github/workflows/format.yml
@@ -17,6 +17,7 @@ jobs:
           --style=file \
           ISLE/*.cpp ISLE/*.h \
           LEGO1/*.cpp LEGO1/*.h \
+          LEGO1/mxstl/*.h \
           LEGO1/realtime/*.cpp LEGO1/realtime/*.h \
           LEGO1/tgl/*.h \
           LEGO1/tgl/d3drm/*.cpp LEGO1/tgl/d3drm/*.h \
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4a60e3d4..ed3c29cf 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -230,6 +230,8 @@ if (MINGW)
 endif()
 
 # Additional include directories
+
+target_include_directories(lego1 PRIVATE "${CMAKE_SOURCE_DIR}/util")
 target_include_directories(lego1 PUBLIC "${CMAKE_SOURCE_DIR}/3rdparty/vec")
 target_include_directories(lego1 PRIVATE "${CMAKE_SOURCE_DIR}/3rdparty/flic")
 target_include_directories(lego1 PRIVATE "${CMAKE_SOURCE_DIR}/3rdparty/smk")
@@ -264,6 +266,8 @@ if (ISLE_BUILD_APP)
     ISLE/define.cpp
   )
 
+  target_include_directories(isle PRIVATE "${CMAKE_SOURCE_DIR}/util")
+
   # Include LEGO1 headers in ISLE
   target_include_directories(isle PRIVATE "${CMAKE_SOURCE_DIR}/LEGO1")
 
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 1a698a7d..0c65bc1c 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -27,6 +27,7 @@ This repository currently has only one goal: accuracy to the original executable
 * [`ISLE`](/ISLE): Decompilation of `ISLE.EXE`. It depends on some code in `LEGO1`.
 * [`LEGO1`](/LEGO1): Decompilation of `LEGO1.DLL`. This folder contains code from Mindscape's custom in-house engine called **Omni** (file pattern: `mx*`), the LEGO Island-specific extensions for Omni and the game's code (file pattern: `lego*`) as well as several utility libraries developed by Mindscape.
 * [`tools`](/tools): A set of tools aiding in the decompilation effort.
+* [`util`](/util): Utility headers aiding in the decompilation effort.
 
 ## Tooling
 
diff --git a/LEGO1/mxatomidcounter.h b/LEGO1/mxatomidcounter.h
index c75c2b5c..8fb5ae97 100644
--- a/LEGO1/mxatomidcounter.h
+++ b/LEGO1/mxatomidcounter.h
@@ -1,7 +1,7 @@
 #ifndef MXATOMIDCOUNTER_H
 #define MXATOMIDCOUNTER_H
 
-#include "compat.h" // STL
+#include "mxstl/stlcompat.h"
 #include "mxstring.h"
 
 // Counts the number of existing MxAtomId objects based
diff --git a/LEGO1/mxcompositepresenter.h b/LEGO1/mxcompositepresenter.h
index 20b3c347..f64de154 100644
--- a/LEGO1/mxcompositepresenter.h
+++ b/LEGO1/mxcompositepresenter.h
@@ -1,8 +1,8 @@
 #ifndef MXCOMPOSITEPRESENTER_H
 #define MXCOMPOSITEPRESENTER_H
 
-#include "compat.h" // STL
 #include "mxpresenter.h"
+#include "mxstl/stlcompat.h"
 
 class MxCompositePresenterList : public list<MxPresenter*> {};
 
diff --git a/LEGO1/mxdiskstreamcontroller.h b/LEGO1/mxdiskstreamcontroller.h
index bed571f4..2de006d1 100644
--- a/LEGO1/mxdiskstreamcontroller.h
+++ b/LEGO1/mxdiskstreamcontroller.h
@@ -1,9 +1,9 @@
 #ifndef MXDISKSTREAMCONTROLLER_H
 #define MXDISKSTREAMCONTROLLER_H
 
-#include "compat.h" // STL
 #include "decomp.h"
 #include "mxdsbuffer.h"
+#include "mxstl/stlcompat.h"
 #include "mxstreamcontroller.h"
 #include "mxtypes.h"
 
diff --git a/LEGO1/mxnotificationmanager.h b/LEGO1/mxnotificationmanager.h
index a26f3748..9ab9c733 100644
--- a/LEGO1/mxnotificationmanager.h
+++ b/LEGO1/mxnotificationmanager.h
@@ -1,10 +1,10 @@
 #ifndef MXNOTIFICATIONMANAGER_H
 #define MXNOTIFICATIONMANAGER_H
 
-#include "compat.h"
 #include "mxcore.h"
 #include "mxcriticalsection.h"
 #include "mxnotificationparam.h"
+#include "mxstl/stlcompat.h"
 #include "mxtypes.h"
 
 class MxNotification {
diff --git a/LEGO1/mxstl.h b/LEGO1/mxstl/mxstl.h
similarity index 100%
rename from LEGO1/mxstl.h
rename to LEGO1/mxstl/mxstl.h
diff --git a/LEGO1/mxstl/stlcompat.h b/LEGO1/mxstl/stlcompat.h
new file mode 100644
index 00000000..bc0076bf
--- /dev/null
+++ b/LEGO1/mxstl/stlcompat.h
@@ -0,0 +1,18 @@
+#ifndef STLCOMPAT_H
+#define STLCOMPAT_H
+
+#include "compat.h"
+
+#if defined(_MSC_VER) && _MSC_VER <= MSVC420_VERSION
+// Disable "nonstandard extension used : 'bool'" warning spam
+#pragma warning(disable : 4237)
+#include "mxstl.h"
+#else
+#include <algorithm>
+#include <list>
+#include <set>
+using std::list;
+using std::set;
+#endif
+
+#endif // STLCOMPAT_H
diff --git a/LEGO1/mxstreamcontroller.h b/LEGO1/mxstreamcontroller.h
index 767b4cba..9a763ba1 100644
--- a/LEGO1/mxstreamcontroller.h
+++ b/LEGO1/mxstreamcontroller.h
@@ -1,13 +1,13 @@
 #ifndef MXSTREAMCONTROLLER_H
 #define MXSTREAMCONTROLLER_H
 
-#include "compat.h" // STL
 #include "decomp.h"
 #include "mxatomid.h"
 #include "mxcore.h"
 #include "mxcriticalsection.h"
 #include "mxdsaction.h"
 #include "mxdsobject.h"
+#include "mxstl/stlcompat.h"
 #include "mxstreamlist.h"
 #include "mxstreamprovider.h"
 
diff --git a/LEGO1/mxstreamlist.h b/LEGO1/mxstreamlist.h
index 46024be5..2a9e7351 100644
--- a/LEGO1/mxstreamlist.h
+++ b/LEGO1/mxstreamlist.h
@@ -1,10 +1,10 @@
 #ifndef MXSTREAMLIST_H
 #define MXSTREAMLIST_H
 
-#include "compat.h" // STL
 #include "mxdsaction.h"
 #include "mxdssubscriber.h"
 #include "mxnextactiondatastart.h"
+#include "mxstl/stlcompat.h"
 
 template <class T>
 class MxStreamList : public list<T> {};
diff --git a/LEGO1/mxticklemanager.h b/LEGO1/mxticklemanager.h
index b7d90763..85994ef5 100644
--- a/LEGO1/mxticklemanager.h
+++ b/LEGO1/mxticklemanager.h
@@ -1,8 +1,8 @@
 #ifndef MXTICKLEMANAGER_H
 #define MXTICKLEMANAGER_H
 
-#include "compat.h"
 #include "mxcore.h"
+#include "mxstl/stlcompat.h"
 #include "mxtypes.h"
 
 class MxTickleClient {
diff --git a/LEGO1/realtime/matrix.cpp b/LEGO1/realtime/matrix.cpp
index 7b2a94b3..3ba63ca5 100644
--- a/LEGO1/realtime/matrix.cpp
+++ b/LEGO1/realtime/matrix.cpp
@@ -1,7 +1,7 @@
 
 #include "matrix.h"
 
-#include "../decomp.h"
+#include "decomp.h"
 #include "math.h"
 
 #include <memory.h>
diff --git a/LEGO1/realtime/orientableroi.cpp b/LEGO1/realtime/orientableroi.cpp
index 651a1ac7..e03b78cb 100644
--- a/LEGO1/realtime/orientableroi.cpp
+++ b/LEGO1/realtime/orientableroi.cpp
@@ -1,6 +1,6 @@
 #include "orientableroi.h"
 
-#include "../decomp.h"
+#include "decomp.h"
 
 DECOMP_SIZE_ASSERT(OrientableROI, 0xdc)
 
diff --git a/LEGO1/realtime/roi.h b/LEGO1/realtime/roi.h
index 66c17a84..40cff140 100644
--- a/LEGO1/realtime/roi.h
+++ b/LEGO1/realtime/roi.h
@@ -3,9 +3,9 @@
 
 // ROI stands for Real-time Object Instance.
 
-#include "../compat.h"
-#include "../mxstl.h"
+#include "../mxstl/stlcompat.h"
 #include "../realtime/realtime.h"
+#include "compat.h"
 #include "lodlist.h"
 #include "vector.h"
 
diff --git a/LEGO1/realtime/vector.cpp b/LEGO1/realtime/vector.cpp
index 1d41470c..54df74e4 100644
--- a/LEGO1/realtime/vector.cpp
+++ b/LEGO1/realtime/vector.cpp
@@ -1,7 +1,7 @@
 
 #include "vector.h"
 
-#include "../decomp.h"
+#include "decomp.h"
 
 #include <math.h>
 #include <memory.h>
diff --git a/LEGO1/tgl/d3drm/impl.h b/LEGO1/tgl/d3drm/impl.h
index bbc7baa0..89894c2d 100644
--- a/LEGO1/tgl/d3drm/impl.h
+++ b/LEGO1/tgl/d3drm/impl.h
@@ -1,6 +1,6 @@
 
-#include "../../decomp.h"
 #include "../tgl.h"
+#include "decomp.h"
 
 #include <d3drm.h>
 
diff --git a/LEGO1/viewmanager/viewlodlist.h b/LEGO1/viewmanager/viewlodlist.h
index 12817ff9..d695624f 100644
--- a/LEGO1/viewmanager/viewlodlist.h
+++ b/LEGO1/viewmanager/viewlodlist.h
@@ -1,9 +1,9 @@
 #ifndef VIEWLODLIST_H
 #define VIEWLODLIST_H
 
-#include "../compat.h"
 #include "../realtime/lodlist.h"
 #include "assert.h"
+#include "compat.h"
 
 #pragma warning(disable : 4786)
 
diff --git a/LEGO1/viewmanager/viewroi.cpp b/LEGO1/viewmanager/viewroi.cpp
index 47cb71e8..47f340ac 100644
--- a/LEGO1/viewmanager/viewroi.cpp
+++ b/LEGO1/viewmanager/viewroi.cpp
@@ -1,6 +1,6 @@
 #include "viewroi.h"
 
-#include "../decomp.h"
+#include "decomp.h"
 
 DECOMP_SIZE_ASSERT(ViewROI, 0xe0)
 
diff --git a/LEGO1/compat.h b/util/compat.h
similarity index 71%
rename from LEGO1/compat.h
rename to util/compat.h
index 9616b254..c1175cd2 100644
--- a/LEGO1/compat.h
+++ b/util/compat.h
@@ -1,5 +1,5 @@
-#ifndef ISLECOMPAT_H
-#define ISLECOMPAT_H
+#ifndef COMPAT_H
+#define COMPAT_H
 
 // Various macros to enable compiling with other/newer compilers.
 
@@ -11,9 +11,6 @@
 #define COMPAT_CONST
 #endif
 
-// DIsable "nonstandard extension used : 'bool'" warning spam
-#pragma warning(disable : 4237)
-
 // Disable "identifier was truncated to '255' characters" warning.
 // Impossible to avoid this if using STL map or set.
 // This removes most (but not all) occurrences of the warning.
@@ -21,17 +18,6 @@
 
 #define MSVC420_VERSION 1020
 
-// STL compatibility.
-#if defined(_MSC_VER) && _MSC_VER <= MSVC420_VERSION
-#include "mxstl.h"
-#else
-#include <algorithm>
-#include <list>
-#include <set>
-using std::list;
-using std::set;
-#endif
-
 // We use `override` so newer compilers can tell us our vtables are valid,
 // however this keyword was added in C++11, so we define it as empty for
 // compatibility with older compilers.
@@ -39,4 +25,4 @@ using std::set;
 #define override
 #endif
 
-#endif // ISLECOMPAT_H
+#endif // COMPAT_H
diff --git a/LEGO1/decomp.h b/util/decomp.h
similarity index 100%
rename from LEGO1/decomp.h
rename to util/decomp.h