From 5a7de406c43ef253c86569d50aa7af4ea53a4eae Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Mon, 11 May 2020 14:18:04 -0500 Subject: [PATCH] Implmementing the templated filter creation method. --- include/openmc/tallies/filter.h | 9 ++++ src/tallies/filter.cpp | 73 ++++++++++++++++++++------------- 2 files changed, 53 insertions(+), 29 deletions(-) diff --git a/include/openmc/tallies/filter.h b/include/openmc/tallies/filter.h index fbafd7e07..cde55fa7b 100644 --- a/include/openmc/tallies/filter.h +++ b/include/openmc/tallies/filter.h @@ -31,6 +31,15 @@ public: Filter(); virtual ~Filter(); + //! Create a new tally filter + // + //! \tparam T Type of the filter + //! \param[in] id Unique ID for the filter. If none is passed, an ID is + //! automatically assigned + //! \return Pointer to the new filter object + template + static T* create(int32_t id = -1); + //! Create a new tally filter // //! \param[in] type Type of the filter diff --git a/src/tallies/filter.cpp b/src/tallies/filter.cpp index afe47fbd0..0c8239ff2 100644 --- a/src/tallies/filter.cpp +++ b/src/tallies/filter.cpp @@ -4,6 +4,8 @@ #include // for strcpy #include +#include + #include "openmc/capi.h" #include "openmc/constants.h" // for MAX_LINE_LEN; #include "openmc/error.h" @@ -67,6 +69,23 @@ Filter::~Filter() model::filter_map.erase(id_); } +template +T* Filter::create(int32_t id) { + static_assert(std::is_base_of::value, + "Type specified is not derived from openmc::Filter."); + + auto filter = std::make_unique(); + + auto ptr_out = filter.get(); + + model::tally_filters.emplace_back(std::move(filter)); + + // Assign ID + model::tally_filters.back()->set_id(id); + + return ptr_out; +} + Filter* Filter::create(pugi::xml_node node) { // Copy filter id @@ -92,59 +111,55 @@ Filter* Filter::create(pugi::xml_node node) Filter* Filter::create(const std::string& type, int32_t id) { if (type == "azimuthal") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "cell") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "cellborn") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "cellfrom") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "cellinstance") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "distribcell") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "delayedgroup") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "energyfunction") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "energy") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "energyout") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "legendre") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "material") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "mesh") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "meshsurface") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "mu") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "particle") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "polar") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "surface") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "spatiallegendre") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "sphericalharmonics") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "universe") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "zernike") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else if (type == "zernikeradial") { - model::tally_filters.push_back(std::make_unique()); + return Filter::create(id); } else { - throw std::runtime_error{"Unknown filter type: " + type}; + throw std::runtime_error{fmt::format("Unknown filter type: {}", type)}; } - - // Assign ID - model::tally_filters.back()->set_id(id); - - return model::tally_filters.back().get(); + return nullptr; } void Filter::set_id(int32_t id)