From 03a20b9b940da7c7dfc8d2aadf41b5896e62b3db Mon Sep 17 00:00:00 2001
From: Dale Glass <dale@daleglass.net>
Date: Thu, 27 Apr 2023 00:42:25 +0200
Subject: [PATCH] Fix the build on GCC 13.0

This adds #include <cstdlib> in a couple places. It also fixes a huge
amount of warnings due to "concept" becoming a keyword in C++20
---
 .../src/TemporaryPairwiseCollisionFilter.h    |  2 +-
 libraries/shared/src/CPUIdent.h               |  1 +
 libraries/task/src/task/Task.h                | 56 +++++++++----------
 3 files changed, 30 insertions(+), 29 deletions(-)

diff --git a/libraries/physics/src/TemporaryPairwiseCollisionFilter.h b/libraries/physics/src/TemporaryPairwiseCollisionFilter.h
index 4c3f52ba1b..e772e5f821 100644
--- a/libraries/physics/src/TemporaryPairwiseCollisionFilter.h
+++ b/libraries/physics/src/TemporaryPairwiseCollisionFilter.h
@@ -14,7 +14,7 @@
 
 #include <unordered_map>
 #include <btBulletDynamicsCommon.h>
-
+#include <cstdint>
 class TemporaryPairwiseCollisionFilter {
 public:
     using LastContactMap = std::unordered_map<const btCollisionObject*, uint32_t>;
diff --git a/libraries/shared/src/CPUIdent.h b/libraries/shared/src/CPUIdent.h
index d7bf03002b..6ec5188261 100644
--- a/libraries/shared/src/CPUIdent.h
+++ b/libraries/shared/src/CPUIdent.h
@@ -22,6 +22,7 @@
 #include <bitset>
 #include <array>
 #include <string>
+#include <cstdint>
 
 class CPUIdent
 {
diff --git a/libraries/task/src/task/Task.h b/libraries/task/src/task/Task.h
index 0ee458f3ea..e79542dc40 100644
--- a/libraries/task/src/task/Task.h
+++ b/libraries/task/src/task/Task.h
@@ -71,7 +71,7 @@ public:
 
     JobConcept(const std::string& name, QConfigPointer config) : _config(config), _name(name) { config->_jobConcept = this; }
     virtual ~JobConcept() = default;
-    
+
     const std::string& getName() const { return _name; }
 
     virtual const Varying getInput() const { return Varying(); }
@@ -165,7 +165,7 @@ public:
             // Capture this
             Concept::_config->_jobConcept = this;
         }
-        
+
         void applyConfiguration() override {
             TimeProfiler probe(("configure::" + JobConcept::getName()));
 
@@ -185,40 +185,40 @@ public:
     template <class T, class I, class O, class C = Config> using ModelIO = Model<T, C, I, O>;
 
     Job() {}
-    Job(const ConceptPointer& concept) : _concept(concept) {}
+    Job(const ConceptPointer& conceptPtr) : _conceptPtr(conceptPtr) {}
     virtual ~Job() = default;
 
-    const std::string& getName() const { return _concept->getName(); }
-    const Varying getInput() const { return _concept->getInput(); }
-    const Varying getOutput() const { return _concept->getOutput(); }
+    const std::string& getName() const { return _conceptPtr->getName(); }
+    const Varying getInput() const { return _conceptPtr->getInput(); }
+    const Varying getOutput() const { return _conceptPtr->getOutput(); }
 
-    QConfigPointer& getConfiguration() const { return _concept->getConfiguration(); }
-    void applyConfiguration() { return _concept->applyConfiguration(); }
+    QConfigPointer& getConfiguration() const { return _conceptPtr->getConfiguration(); }
+    void applyConfiguration() { return _conceptPtr->applyConfiguration(); }
 
-    template <class I> void feedInput(const I& in) { _concept->editInput().template edit<I>() = in; }
-    template <class I, class S> void feedInput(int index, const S& inS) { (_concept->editInput().template editN<I>(index)).template edit<S>() = inS; }
+    template <class I> void feedInput(const I& in) { _conceptPtr->editInput().template edit<I>() = in; }
+    template <class I, class S> void feedInput(int index, const S& inS) { (_conceptPtr->editInput().template editN<I>(index)).template edit<S>() = inS; }
 
     template <class T> T& edit() {
-        auto concept = std::static_pointer_cast<typename T::JobModel>(_concept);
-        assert(concept);
-        return concept->_data;
+        auto conceptPtr = std::static_pointer_cast<typename T::JobModel>(_conceptPtr);
+        assert(conceptPtr);
+        return conceptPtr->_data;
     }
 
     template <class T> const T& get() const {
-        auto concept = std::static_pointer_cast<typename T::JobModel>(_concept);
-        assert(concept);
-        return concept->_data;
+        auto conceptPtr = std::static_pointer_cast<typename T::JobModel>(_conceptPtr);
+        assert(conceptPtr);
+        return conceptPtr->_data;
     }
 
     virtual void run(const ContextPointer& jobContext) {
         TimeProfiler probe(getName());
         auto startTime = std::chrono::high_resolution_clock::now();
-        _concept->run(jobContext);
-        _concept->setCPURunTime((std::chrono::high_resolution_clock::now() - startTime));
+        _conceptPtr->run(jobContext);
+        _conceptPtr->setCPURunTime((std::chrono::high_resolution_clock::now() - startTime));
     }
 
 protected:
-    ConceptPointer _concept;
+    ConceptPointer _conceptPtr;
 };
 
 
@@ -242,7 +242,7 @@ public:
     using ConceptPointer = typename JobType::ConceptPointer;
     using Jobs = std::vector<JobType>;
 
-    Task(ConceptPointer concept) : JobType(concept) {}
+    Task(ConceptPointer conceptPtr) : JobType(conceptPtr) {}
 
     class TaskConcept : public Concept {
     public:
@@ -347,15 +347,15 @@ public:
 
     // Create a new job in the Task's queue; returns the job's output
     template <class T, class... A> const Varying addJob(std::string name, const Varying& input, A&&... args) {
-        return std::static_pointer_cast<TaskConcept>(JobType::_concept)->template addJob<T>(name, input, std::forward<A>(args)...);
+        return std::static_pointer_cast<TaskConcept>(JobType::_conceptPtr)->template addJob<T>(name, input, std::forward<A>(args)...);
     }
     template <class T, class... A> const Varying addJob(std::string name, A&&... args) {
         const auto input = Varying(typename T::JobModel::Input());
-        return std::static_pointer_cast<TaskConcept>(JobType::_concept)->template addJob<T>(name, input, std::forward<A>(args)...);
+        return std::static_pointer_cast<TaskConcept>(JobType::_conceptPtr)->template addJob<T>(name, input, std::forward<A>(args)...);
     }
 
     std::shared_ptr<Config> getConfiguration() {
-        return std::static_pointer_cast<Config>(JobType::_concept->getConfiguration());
+        return std::static_pointer_cast<Config>(JobType::_conceptPtr->getConfiguration());
     }
 };
 
@@ -380,7 +380,7 @@ public:
     using ConceptPointer = typename JobType::ConceptPointer;
     using Branches = std::unordered_map<uint8_t, JobType>;
 
-    Switch(ConceptPointer concept) : JobType(concept) {}
+    Switch(ConceptPointer conceptPtr) : JobType(conceptPtr) {}
 
     class SwitchConcept : public Concept {
     public:
@@ -485,15 +485,15 @@ public:
 
     // Create a new job in the Switches' branches; returns the job's output
     template <class T, class... A> const Varying addBranch(std::string name, uint8_t index, const Varying& input, A&&... args) {
-        return std::static_pointer_cast<SwitchConcept>(JobType::_concept)->template addBranch<T>(name, index, input, std::forward<A>(args)...);
+        return std::static_pointer_cast<SwitchConcept>(JobType::_conceptPtr)->template addBranch<T>(name, index, input, std::forward<A>(args)...);
     }
     template <class T, class... A> const Varying addBranch(std::string name, uint8_t index, A&&... args) {
         const auto input = Varying(typename T::JobModel::Input());
-        return std::static_pointer_cast<SwitchConcept>(JobType::_concept)->template addBranch<T>(name, index, input, std::forward<A>(args)...);
+        return std::static_pointer_cast<SwitchConcept>(JobType::_conceptPtr)->template addBranch<T>(name, index, input, std::forward<A>(args)...);
     }
 
     std::shared_ptr<Config> getConfiguration() {
-        return std::static_pointer_cast<Config>(JobType::_concept->getConfiguration());
+        return std::static_pointer_cast<Config>(JobType::_conceptPtr->getConfiguration());
     }
 };
 
@@ -507,7 +507,7 @@ public:
     using TaskType = Task<JC, TP>;
     using ConceptPointer = typename TaskType::ConceptPointer;
 
-    Engine(const ConceptPointer& concept, const ContextPointer& context) : TaskType(concept), _context(context) {}
+    Engine(const ConceptPointer& conceptPtr, const ContextPointer& context) : TaskType(conceptPtr), _context(context) {}
     ~Engine() = default;
 
     void reset(const ContextPointer& context) { _context = context; }