From 4bde76442a4f66f9ff907d8956c9e692b083ddac Mon Sep 17 00:00:00 2001 From: Tobias Duswald Date: Mon, 22 May 2023 16:57:13 +0200 Subject: [PATCH 01/10] Add explicit keyword to random.h constructors --- src/core/util/random.h | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/core/util/random.h b/src/core/util/random.h index 8a4a23c4d..3d3750cd8 100644 --- a/src/core/util/random.h +++ b/src/core/util/random.h @@ -33,7 +33,7 @@ template class DistributionRng { public: DistributionRng() = default; - DistributionRng(TRootIOCtor*) {} + explicit DistributionRng(TRootIOCtor*) {} virtual ~DistributionRng() = default; /// Draws a sample from the distribution TSample Sample(); @@ -89,7 +89,7 @@ class GausRng : public DistributionRng { // ----------------------------------------------------------------------------- class ExpRng : public DistributionRng { public: - ExpRng(real_t tau); + explicit ExpRng(real_t tau); virtual ~ExpRng(); private: @@ -113,7 +113,7 @@ class LandauRng : public DistributionRng { // ----------------------------------------------------------------------------- class PoissonDRng : public DistributionRng { public: - PoissonDRng(real_t mean); + explicit PoissonDRng(real_t mean); virtual ~PoissonDRng(); private: @@ -137,7 +137,8 @@ class BreitWignerRng : public DistributionRng { // ----------------------------------------------------------------------------- class UserDefinedDistRng1D : public DistributionRng { public: - UserDefinedDistRng1D(TRootIOCtor* ioctor) : DistributionRng(ioctor) {} + explicit UserDefinedDistRng1D(TRootIOCtor* ioctor) + : DistributionRng(ioctor) {} UserDefinedDistRng1D(TF1* function, const char* option); virtual ~UserDefinedDistRng1D(); void Draw(const char* option = ""); @@ -154,7 +155,8 @@ class UserDefinedDistRng1D : public DistributionRng { // ----------------------------------------------------------------------------- class UserDefinedDistRng2D : public DistributionRng { public: - UserDefinedDistRng2D(TRootIOCtor* ioctor) : DistributionRng(ioctor) {} + explicit UserDefinedDistRng2D(TRootIOCtor* ioctor) + : DistributionRng(ioctor) {} UserDefinedDistRng2D(TF2* function, const char* option); virtual ~UserDefinedDistRng2D(); void Draw(const char* option = ""); @@ -172,7 +174,8 @@ class UserDefinedDistRng2D : public DistributionRng { // ----------------------------------------------------------------------------- class UserDefinedDistRng3D : public DistributionRng { public: - UserDefinedDistRng3D(TRootIOCtor* ioctor) : DistributionRng(ioctor) {} + explicit UserDefinedDistRng3D(TRootIOCtor* ioctor) + : DistributionRng(ioctor) {} UserDefinedDistRng3D(TF3* function, const char* option); virtual ~UserDefinedDistRng3D(); void Draw(const char* option = ""); @@ -246,7 +249,7 @@ class BinomialRng : public DistributionRng { // ----------------------------------------------------------------------------- class PoissonRng : public DistributionRng { public: - PoissonRng(real_t mean); + explicit PoissonRng(real_t mean); virtual ~PoissonRng(); private: From 0fd2b349f7d34e95ef2e831af5eea9795a7faeb3 Mon Sep 17 00:00:00 2001 From: Tobias Duswald Date: Mon, 22 May 2023 16:58:46 +0200 Subject: [PATCH 02/10] Add explicit keyword to functor.h constructors --- src/core/functor.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/functor.h b/src/core/functor.h index cb38111bc..1658c708b 100644 --- a/src/core/functor.h +++ b/src/core/functor.h @@ -42,7 +42,7 @@ struct LambdaFunctor final : public Functor { TLambda lambda; - LambdaFunctor(const TLambda& lambda) : lambda(lambda) {} + explicit LambdaFunctor(const TLambda& lambda) : lambda(lambda) {} LambdaFunctor(const LambdaFunctor& other) : lambda(other.lambda) {} virtual ~LambdaFunctor() = default; @@ -57,7 +57,7 @@ struct LambdaFunctor final : public Functor { TLambda lambda; - LambdaFunctor(const TLambda& lambda) : lambda(lambda) {} + explicit LambdaFunctor(const TLambda& lambda) : lambda(lambda) {} LambdaFunctor(const LambdaFunctor& other) : lambda(other.lambda) {} virtual ~LambdaFunctor() = default; From d0778b4a2ecbfcd0b918df747ee983a22f852c2c Mon Sep 17 00:00:00 2001 From: Tobias Duswald Date: Mon, 22 May 2023 16:59:21 +0200 Subject: [PATCH 03/10] Add explicit keyword to UFG constructors --- src/core/environment/uniform_grid_environment.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/environment/uniform_grid_environment.h b/src/core/environment/uniform_grid_environment.h index 6389349f1..b50a0f47b 100644 --- a/src/core/environment/uniform_grid_environment.h +++ b/src/core/environment/uniform_grid_environment.h @@ -614,7 +614,7 @@ class UniformGridEnvironment : public Environment { private: class LoadBalanceInfoUG : public LoadBalanceInfo { public: - LoadBalanceInfoUG(UniformGridEnvironment* grid); + explicit LoadBalanceInfoUG(UniformGridEnvironment* grid); virtual ~LoadBalanceInfoUG(); void Update(); void CallHandleIteratorConsumer( From f20d4912c620e63dfec0fec5ef9ea84cf67643c0 Mon Sep 17 00:00:00 2001 From: Tobias Duswald Date: Mon, 22 May 2023 17:16:46 +0200 Subject: [PATCH 04/10] Add explicit to morton order --- src/core/environment/morton_order.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/environment/morton_order.cc b/src/core/environment/morton_order.cc index 72ca4f837..5ac295eb3 100644 --- a/src/core/environment/morton_order.cc +++ b/src/core/environment/morton_order.cc @@ -22,7 +22,7 @@ namespace bdm { template class Stack { public: - Stack(uint64_t max_elements) { data_.resize(max_elements); } + explicit Stack(uint64_t max_elements) { data_.resize(max_elements); } void Push(const T& el) { data_[++top_] = el; From 6e60eb2628688819ce885d3e349c977f57970b43 Mon Sep 17 00:00:00 2001 From: Tobias Duswald Date: Mon, 22 May 2023 18:09:50 +0200 Subject: [PATCH 05/10] Make AgentUid to uint64_t explicit (TBD) --- src/core/agent/agent_pointer.h | 6 +++--- src/core/agent/agent_uid.h | 2 +- src/core/visualization/paraview/mapped_data_array.h | 2 +- src/core/visualization/root/adaptor.h | 6 ++++-- test/unit/core/agent/agent_uid_test.cc | 4 ++-- test/unit/core/environment/uniform_grid_environment_test.cc | 2 +- test/unit/core/resource_manager_test.cc | 6 ++++-- test/unit/core/resource_manager_test.h | 3 ++- 8 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/core/agent/agent_pointer.h b/src/core/agent/agent_pointer.h index 107739b2c..f115fe727 100644 --- a/src/core/agent/agent_pointer.h +++ b/src/core/agent/agent_pointer.h @@ -90,12 +90,12 @@ class AgentPointer { uint64_t GetUidAsUint64() const { if (*this == nullptr) { - return AgentUid(); + return static_cast(AgentUid()); } if (gAgentPointerMode == AgentPointerMode::kIndirect) { - return d_.uid; + return static_cast(d_.uid); } else { - return d_.agent->GetUid(); + return static_cast(d_.agent->GetUid()); } } diff --git a/src/core/agent/agent_uid.h b/src/core/agent/agent_uid.h index 67f86946d..b9285d1a3 100644 --- a/src/core/agent/agent_uid.h +++ b/src/core/agent/agent_uid.h @@ -90,7 +90,7 @@ class AgentUid { return *this; } - operator uint64_t() const { + explicit operator uint64_t() const { return (static_cast(reused_) << 32) | static_cast(index_); } diff --git a/src/core/visualization/paraview/mapped_data_array.h b/src/core/visualization/paraview/mapped_data_array.h index 56acfe851..354288edd 100644 --- a/src/core/visualization/paraview/mapped_data_array.h +++ b/src/core/visualization/paraview/mapped_data_array.h @@ -93,7 +93,7 @@ struct GetDataMemberForVis { auto* casted_agent = static_cast(agent); auto* data = reinterpret_cast( reinterpret_cast(casted_agent) + dm_offset_); - uint64_t uid = *data; + uint64_t uid = static_cast(*data); auto tid = ThreadInfo::GetInstance()->GetUniversalThreadId(); assert(temp_values_.size() > tid); temp_values_[tid][0] = uid; diff --git a/src/core/visualization/root/adaptor.h b/src/core/visualization/root/adaptor.h index 859e1df2d..a6095263a 100644 --- a/src/core/visualization/root/adaptor.h +++ b/src/core/visualization/root/adaptor.h @@ -139,7 +139,8 @@ class RootAdaptor { /// Adds a sphere object to the volume void AddSphere(const Agent *agent, TGeoVolume *container) { - std::string name = agent->GetTypeName() + std::to_string(agent->GetUid()); + std::string name = agent->GetTypeName() + + std::to_string(static_cast(agent->GetUid())); auto radius = agent->GetDiameter() / 2; auto massLocation = agent->GetPosition(); auto x = massLocation[0]; @@ -154,7 +155,8 @@ class RootAdaptor { /// Adds a cylinder object to the volume void AddCylinder(const Agent *agent, TGeoVolume *container) { if (auto neurite = dynamic_cast(agent)) { - std::string name = agent->GetTypeName() + std::to_string(agent->GetUid()); + std::string name = agent->GetTypeName() + + std::to_string(static_cast(agent->GetUid())); auto radius = neurite->GetDiameter() / 2; auto half_length = neurite->GetLength() / 2; auto massLocation = neurite->GetPosition(); diff --git a/test/unit/core/agent/agent_uid_test.cc b/test/unit/core/agent/agent_uid_test.cc index 11c791738..69f33ea13 100644 --- a/test/unit/core/agent/agent_uid_test.cc +++ b/test/unit/core/agent/agent_uid_test.cc @@ -91,13 +91,13 @@ TEST(AgentUidTest, MinusOperator) { TEST(AgentUidTest, uint64_tOperator) { AgentUid uid(123, 0); - uint64_t idx = uid; + uint64_t idx = static_cast(uid); EXPECT_EQ(idx, 123u); } TEST(AgentUidTest, uint64_tOperator2) { AgentUid uid(123, 2); - uint64_t idx = uid; + uint64_t idx = static_cast(uid); EXPECT_EQ(idx, 8589934715u); // (2 << 32) | 123u); } diff --git a/test/unit/core/environment/uniform_grid_environment_test.cc b/test/unit/core/environment/uniform_grid_environment_test.cc index 3628118fa..4a639f8cb 100644 --- a/test/unit/core/environment/uniform_grid_environment_test.cc +++ b/test/unit/core/environment/uniform_grid_environment_test.cc @@ -407,7 +407,7 @@ struct ZOrderCallback : Functor { box_cnt++; } auto* agent = rm->GetAgent(ah); - zorder[box_cnt].insert(agent->GetUid() - ref_uid); + zorder[box_cnt].insert(agent->GetUid() - static_cast(ref_uid)); cnt++; } }; diff --git a/test/unit/core/resource_manager_test.cc b/test/unit/core/resource_manager_test.cc index 4080c1a23..86846cdfd 100644 --- a/test/unit/core/resource_manager_test.cc +++ b/test/unit/core/resource_manager_test.cc @@ -41,7 +41,8 @@ TEST(ResourceManagerTest, ForEachAgentFilter) { rm->ForEachAgent( [&](Agent* a) { // NOLINT counter++; - switch (a->GetUid() - ref_uid) { + switch (static_cast(a->GetUid()) - + static_cast(ref_uid)) { case 0: EXPECT_EQ(0, dynamic_cast(a)->GetData()); break; @@ -63,7 +64,8 @@ TEST(ResourceManagerTest, ForEachAgentFilter) { rm->ForEachAgent( [&](Agent* a) { // NOLINT counter++; - switch (a->GetUid() - ref_uid) { + switch (static_cast(a->GetUid()) - + static_cast(ref_uid)) { case 1: EXPECT_EQ(1, dynamic_cast(a)->GetData()); break; diff --git a/test/unit/core/resource_manager_test.h b/test/unit/core/resource_manager_test.h index 13cfe5398..7bbbe482b 100644 --- a/test/unit/core/resource_manager_test.h +++ b/test/unit/core/resource_manager_test.h @@ -72,7 +72,8 @@ inline void RunForEachAgentTest() { uint64_t counter = 0; rm->ForEachAgent([&](Agent* element) { // NOLINT counter++; - switch (element->GetUid() - ref_uid) { + switch (static_cast(element->GetUid()) - + static_cast(ref_uid)) { case 0: EXPECT_EQ(12, dynamic_cast(element)->GetData()); break; From 002b7fd88bd1019b59c66a078c23da384e06c307 Mon Sep 17 00:00:00 2001 From: Tobias Duswald Date: Mon, 22 May 2023 18:16:59 +0200 Subject: [PATCH 06/10] Make TStyle conversion operator explicit --- src/core/analysis/style.h | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/core/analysis/style.h b/src/core/analysis/style.h index 40a3006ab..49a636b18 100644 --- a/src/core/analysis/style.h +++ b/src/core/analysis/style.h @@ -31,7 +31,7 @@ class Style : public TNamed, public: Style(); ~Style(); - operator TStyle*() const; + explicit operator TStyle*() const; TStyle* GetTStyle() const; private: @@ -39,24 +39,24 @@ class Style : public TNamed, // The following attributes were copied from TStyle - TAttAxis fXaxis; ///< X axis attributes - TAttAxis fYaxis; ///< Y axis attributes - TAttAxis fZaxis; ///< Z axis attributes - Float_t fBarWidth; ///< Width of bar for graphs - Float_t fBarOffset; ///< Offset of bar for graphs - Int_t fColorModelPS; ///< PostScript color model: 0 = RGB, 1 = CMYK - Int_t fDrawBorder; ///< Flag to draw border(=1) or not (0) - Int_t fOptLogx; ///< True if log scale in X - Int_t fOptLogy; ///< True if log scale in y - Int_t fOptLogz; ///< True if log scale in z - Int_t fOptDate; ///< True if date option is selected - Int_t fOptStat; ///< True if option Stat is selected - Int_t fOptTitle; ///< True if option Title is selected - Int_t fOptFile; ///< True if option File is selected - Int_t fOptFit; ///< True if option Fit is selected - Int_t fShowEventStatus; ///< Show event status panel - Int_t fShowEditor; ///< Show pad editor - Int_t fShowToolBar; ///< Show toolbar + TAttAxis fXaxis; ///< X axis attributes + TAttAxis fYaxis; ///< Y axis attributes + TAttAxis fZaxis; ///< Z axis attributes + Float_t fBarWidth; ///< Width of bar for graphs + Float_t fBarOffset; ///< Offset of bar for graphs + Int_t fColorModelPS; ///< PostScript color model: 0 = RGB, 1 = CMYK + Int_t fDrawBorder; ///< Flag to draw border(=1) or not (0) + Int_t fOptLogx; ///< True if log scale in X + Int_t fOptLogy; ///< True if log scale in y + Int_t fOptLogz; ///< True if log scale in z + Int_t fOptDate; ///< True if date option is selected + Int_t fOptStat; ///< True if option Stat is selected + Int_t fOptTitle; ///< True if option Title is selected + Int_t fOptFile; ///< True if option File is selected + Int_t fOptFit; ///< True if option Fit is selected + Int_t fShowEventStatus; ///< Show event status panel + Int_t fShowEditor; ///< Show pad editor + Int_t fShowToolBar; ///< Show toolbar Int_t fNumberContours; ///< Default number of contours for 2-d plots TAttText fAttDate; ///< Canvas date attribute From 121eb5d7fe2b6c58420cb6af8f2a1901e545c4d6 Mon Sep 17 00:00:00 2001 From: Tobias Duswald Date: Mon, 22 May 2023 18:21:02 +0200 Subject: [PATCH 07/10] Add note to agent pointer (keep implicit conv.) --- src/core/agent/agent_pointer.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/core/agent/agent_pointer.h b/src/core/agent/agent_pointer.h index f115fe727..e5ced8e40 100644 --- a/src/core/agent/agent_pointer.h +++ b/src/core/agent/agent_pointer.h @@ -211,6 +211,9 @@ class AgentPointer { const TAgent& operator*() const { return *(this->operator->()); } + // Note: allow for implicit conversion to bool + /// Allows to use `if (agent_ptr) { ... }`. Returns true if the pointer is not + /// nullptr. operator bool() const { return *this != nullptr; } // NOLINT operator AgentPointer() const { From 83f98c886c88e7caf131a43923f1484ef392c356 Mon Sep 17 00:00:00 2001 From: Tobias Duswald Date: Mon, 22 May 2023 18:46:53 +0200 Subject: [PATCH 08/10] Format code via Ubuntu --- src/core/analysis/style.h | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/core/analysis/style.h b/src/core/analysis/style.h index 49a636b18..8b3f97cc3 100644 --- a/src/core/analysis/style.h +++ b/src/core/analysis/style.h @@ -39,24 +39,24 @@ class Style : public TNamed, // The following attributes were copied from TStyle - TAttAxis fXaxis; ///< X axis attributes - TAttAxis fYaxis; ///< Y axis attributes - TAttAxis fZaxis; ///< Z axis attributes - Float_t fBarWidth; ///< Width of bar for graphs - Float_t fBarOffset; ///< Offset of bar for graphs - Int_t fColorModelPS; ///< PostScript color model: 0 = RGB, 1 = CMYK - Int_t fDrawBorder; ///< Flag to draw border(=1) or not (0) - Int_t fOptLogx; ///< True if log scale in X - Int_t fOptLogy; ///< True if log scale in y - Int_t fOptLogz; ///< True if log scale in z - Int_t fOptDate; ///< True if date option is selected - Int_t fOptStat; ///< True if option Stat is selected - Int_t fOptTitle; ///< True if option Title is selected - Int_t fOptFile; ///< True if option File is selected - Int_t fOptFit; ///< True if option Fit is selected - Int_t fShowEventStatus; ///< Show event status panel - Int_t fShowEditor; ///< Show pad editor - Int_t fShowToolBar; ///< Show toolbar + TAttAxis fXaxis; ///< X axis attributes + TAttAxis fYaxis; ///< Y axis attributes + TAttAxis fZaxis; ///< Z axis attributes + Float_t fBarWidth; ///< Width of bar for graphs + Float_t fBarOffset; ///< Offset of bar for graphs + Int_t fColorModelPS; ///< PostScript color model: 0 = RGB, 1 = CMYK + Int_t fDrawBorder; ///< Flag to draw border(=1) or not (0) + Int_t fOptLogx; ///< True if log scale in X + Int_t fOptLogy; ///< True if log scale in y + Int_t fOptLogz; ///< True if log scale in z + Int_t fOptDate; ///< True if date option is selected + Int_t fOptStat; ///< True if option Stat is selected + Int_t fOptTitle; ///< True if option Title is selected + Int_t fOptFile; ///< True if option File is selected + Int_t fOptFit; ///< True if option Fit is selected + Int_t fShowEventStatus; ///< Show event status panel + Int_t fShowEditor; ///< Show pad editor + Int_t fShowToolBar; ///< Show toolbar Int_t fNumberContours; ///< Default number of contours for 2-d plots TAttText fAttDate; ///< Canvas date attribute From 936e08e8218fecffc1eb7e5ca168a4d0323b7b4c Mon Sep 17 00:00:00 2001 From: Tobias Duswald Date: Mon, 22 May 2023 19:32:00 +0200 Subject: [PATCH 09/10] Change API of LineGraph to use bdm::Style* instead --- demo/epidemiology/src/evaluate.h | 2 +- src/core/analysis/line_graph.cc | 6 +++--- src/core/analysis/line_graph.h | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/demo/epidemiology/src/evaluate.h b/demo/epidemiology/src/evaluate.h index 9533dd93b..4790821bc 100644 --- a/demo/epidemiology/src/evaluate.h +++ b/demo/epidemiology/src/evaluate.h @@ -62,7 +62,7 @@ inline void PlotResults(const TimeSeries* analytical, const TimeSeries* mean, allts.Add(ind_ts, Concat("i", i++)); } LineGraph lg(&allts, "", "Time [h]", "Population Fraction", plot_legend, - style, 350, 250); + &style, 350, 250); if (analytical) { lg.Add("susceptible-analytical", " ", "L", kBlue, 1.0, kDashed, 2, kBlue, 1.0, 1, 1, 0, 1.0, 0); diff --git a/src/core/analysis/line_graph.cc b/src/core/analysis/line_graph.cc index 1984c624f..f3e7c5f53 100644 --- a/src/core/analysis/line_graph.cc +++ b/src/core/analysis/line_graph.cc @@ -30,9 +30,9 @@ namespace experimental { // ----------------------------------------------------------------------------- LineGraph::LineGraph(const TimeSeries* ts, const std::string& title, const std::string& xaxis_title, - const std::string& yaxis_title, bool legend, TStyle* style, - int width, int height) - : ts_(ts), s_(style) { + const std::string& yaxis_title, bool legend, + const Style* style, int width, int height) + : ts_(ts), s_(style->GetTStyle()) { if (s_) { s_->cd(); } diff --git a/src/core/analysis/line_graph.h b/src/core/analysis/line_graph.h index 71def94dc..93f55ebe8 100644 --- a/src/core/analysis/line_graph.h +++ b/src/core/analysis/line_graph.h @@ -17,6 +17,7 @@ #include #include #include +#include "core/analysis/style.h" #include "core/real_t.h" #include "core/util/root.h" @@ -39,7 +40,7 @@ class LineGraph { LineGraph(const TimeSeries* ts, const std::string& title = "", const std::string& xaxis_title = "", const std::string& yaxis_title = "", bool legend = true, - TStyle* style = nullptr, int width = 700, int height = 500); + const Style* style = nullptr, int width = 700, int height = 500); ~LineGraph(); From f193d2b088af427a76311ce38a41634dc8b097a9 Mon Sep 17 00:00:00 2001 From: Tobias Duswald Date: Mon, 22 May 2023 19:58:51 +0200 Subject: [PATCH 10/10] Avoid nullptr dereferencing --- src/core/analysis/line_graph.cc | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/core/analysis/line_graph.cc b/src/core/analysis/line_graph.cc index f3e7c5f53..fdfeeff44 100644 --- a/src/core/analysis/line_graph.cc +++ b/src/core/analysis/line_graph.cc @@ -32,7 +32,15 @@ LineGraph::LineGraph(const TimeSeries* ts, const std::string& title, const std::string& xaxis_title, const std::string& yaxis_title, bool legend, const Style* style, int width, int height) - : ts_(ts), s_(style->GetTStyle()) { + : ts_(ts) { + if (!ts_) { + Log::Fatal("LineGraph::LineGraph", + "The provided TimeSeries is a nullptr. Operation aborted."); + return; + } + if (style) { + s_ = style->GetTStyle(); + } if (s_) { s_->cd(); }