From 1459812c483cad9290c30eeeeb61c158543dc17d Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Sun, 27 Jun 2021 23:46:17 +0200
Subject: [PATCH] BUILD: Use precompiled headers, store all forward
 declarations in the "Utils.hh" header and use namespaces to isolate vivy's
 code

---
 CMakeLists.txt         | 19 +++++++++++++++++++
 src/Ass/Line.hh        |  1 +
 src/Ass/Style.hh       |  1 +
 src/Ass/Syl.hh         |  1 +
 src/MainWindow.hh      |  6 +-----
 src/TimingScene.hh     |  3 +--
 src/TimingView.hh      |  3 +--
 src/Utils.hh           | 13 +++++++++++++
 src/VivyApplication.hh |  1 -
 9 files changed, 38 insertions(+), 10 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0154649f..6baee4fd 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -68,8 +68,27 @@ target_link_libraries(Vivy PRIVATE ${AVUTIL_LIBRARY})
 target_link_libraries(Vivy PRIVATE ${SWRESAMPLE_LIBRARY})
 target_link_libraries(Vivy PRIVATE ${AVFORMAT_LIBRARY})
 
+# Headers related things
 target_include_directories(Vivy PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/inc)
+target_precompile_headers(Vivy PRIVATE
+    # ASS headers
+    "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/src/Ass/Ass.hh>"
+    "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/src/Ass/Line.hh>"
+    "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/src/Ass/Syl.hh>"
+    "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/src/Ass/Style.hh>"
+    "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/src/Ass/AssFactory.hh>"
+    "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/src/Ass/Char.hh>"
 
+    # Utils
+    "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/src/Utils.hh>"
+
+    # Document headers
+    "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/src/Document/VivyDocument.hh>"
+    "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/src/Document/VivyDocumentStore.hh>"
+    "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/src/Document/CRTPSubDocument.hh>"
+)
+
+# More options and warnings
 target_compile_options(Vivy PRIVATE
     -Wall -Wextra -Wshadow -pedantic
     -Wcast-align -Wconversion -Wsign-conversion
diff --git a/src/Ass/Line.hh b/src/Ass/Line.hh
index c4b1a39b..9af49255 100644
--- a/src/Ass/Line.hh
+++ b/src/Ass/Line.hh
@@ -7,6 +7,7 @@
 
 namespace Vivy::Ass
 {
+
 class Line {
 private:
     quint64 start{ 0 };
diff --git a/src/Ass/Style.hh b/src/Ass/Style.hh
index 82e6c4be..c56a3fcd 100644
--- a/src/Ass/Style.hh
+++ b/src/Ass/Style.hh
@@ -7,6 +7,7 @@
 
 namespace Vivy::Ass
 {
+
 struct Color {
     union {
         quint8 a, r, g, b;
diff --git a/src/Ass/Syl.hh b/src/Ass/Syl.hh
index cb5c522b..964e7550 100644
--- a/src/Ass/Syl.hh
+++ b/src/Ass/Syl.hh
@@ -8,6 +8,7 @@
 
 namespace Vivy::Ass
 {
+
 class Line;
 
 class Syl {
diff --git a/src/MainWindow.hh b/src/MainWindow.hh
index a2784f43..d53031cc 100644
--- a/src/MainWindow.hh
+++ b/src/MainWindow.hh
@@ -5,17 +5,13 @@
 #error "This is a C++ header"
 #endif
 
+#include "Utils.hh"
 #include "AudioVisualizer.hh"
 #include "Document/VivyDocumentStore.hh"
 #include <QMainWindow>
 
-class QMenu;
-class QAction;
-class QTabWidget;
-
 namespace Vivy
 {
-class VivyApplication;
 
 class MainWindow final : public QMainWindow {
     Q_OBJECT
diff --git a/src/TimingScene.hh b/src/TimingScene.hh
index 53bb00ad..a47560c1 100644
--- a/src/TimingScene.hh
+++ b/src/TimingScene.hh
@@ -1,6 +1,7 @@
 #ifndef VIVY_TIMING_SCENE_H
 #define VIVY_TIMING_SCENE_H
 
+#include "Utils.hh"
 #include "Ass/Ass.hh"
 #include "TimingBar.hh"
 
@@ -11,8 +12,6 @@
 #include <QGraphicsScene>
 #include <memory>
 
-class QGraphicsPixmapItem;
-
 namespace Vivy
 {
 class TimingScene final : public QGraphicsScene {
diff --git a/src/TimingView.hh b/src/TimingView.hh
index be10d5b9..bb64bc40 100644
--- a/src/TimingView.hh
+++ b/src/TimingView.hh
@@ -5,6 +5,7 @@
 #error "This is a C++ header"
 #endif
 
+#include "Utils.hh"
 #include "TimingBar.hh"
 #include "TimingScene.hh"
 
@@ -13,8 +14,6 @@
 #include <QVector>
 #include <QGraphicsView>
 
-class QGraphicsPixmapItem;
-
 namespace Vivy
 {
 class TimingView final : public QGraphicsView {
diff --git a/src/Utils.hh b/src/Utils.hh
index 1ed7a7df..cfe0d3ed 100644
--- a/src/Utils.hh
+++ b/src/Utils.hh
@@ -54,4 +54,17 @@ to_underlying(E e) noexcept
 bool detectDocumentType(const QFileInfo &, DocumentType *);
 }
 
+/* All forward delcarations are placed here */
+
+class QMenu;
+class QAction;
+class QTabWidget;
+class QGraphicsPixmapItem;
+
+namespace Vivy
+{
+class VivyApplication;
+class MainWindow;
+}
+
 #endif // VIVY_UTILS_H
diff --git a/src/VivyApplication.hh b/src/VivyApplication.hh
index a9c86f1a..16939df7 100644
--- a/src/VivyApplication.hh
+++ b/src/VivyApplication.hh
@@ -14,7 +14,6 @@
 
 namespace Vivy
 {
-class MainWindow;
 
 class VivyApplication : public QApplication {
     Q_OBJECT
-- 
GitLab