From ab3c697a5e2a963d7f33b7e33f0375a7116fa3fc Mon Sep 17 00:00:00 2001 From: "Paul P.H. Wilson" Date: Mon, 15 Apr 2024 20:02:58 -0500 Subject: [PATCH] try singleton pattern for unpackaged --- src/context.cc | 11 +++++++---- src/package.cc | 31 +++++++++++++++++++++---------- src/package.h | 16 +++++++++------- 3 files changed, 37 insertions(+), 21 deletions(-) diff --git a/src/context.cc b/src/context.cc index 1e56b9af4a..33a6468fa9 100644 --- a/src/context.cc +++ b/src/context.cc @@ -85,10 +85,7 @@ Context::Context(Timer* ti, Recorder* rec) trans_id_(0), si_(0) { rng_ = new RandomNumberGenerator(); - if (packages_.count("unpackaged") == 0) { - packages_["unpackaged"] = Package::CreateUnpackaged(); - } -} + } Context::~Context() { if (solver_ != NULL) { @@ -207,6 +204,9 @@ Package::Ptr Context::AddPackage(std::string name, double fill_min, double fill_ } Package::Ptr Context::GetPackageByName(std::string name) { + if (name == Package::unpackaged_name()) { + return Package::unpackaged(); + } if (packages_.count(name) == 0) { throw KeyError("Invalid package name " + name); } @@ -214,6 +214,9 @@ Package::Ptr Context::GetPackageByName(std::string name) { } Package::Ptr Context::GetPackageById(int id) { + if (id == Package::unpackaged_id()) { + return Package::unpackaged(); + } if (id < 0) { throw ValueError("Invalid package id " + std::to_string(id)); } diff --git a/src/package.cc b/src/package.cc index 784db1c9b4..eff5c6b1d4 100644 --- a/src/package.cc +++ b/src/package.cc @@ -17,9 +17,16 @@ Package::Ptr Package::Create(std::string name, double fill_min, double fill_max, return p; } -Package::Ptr Package::CreateUnpackaged() { - Ptr p(new Package(unpackaged_id_, unpackaged_name_)); - return p; +// singleton pattern: +// if the static member is not yet set, create a new object +// otherwise return the object that already exists +Package::Ptr unpackaged() { + + if !unpackaged_ { + unpackaged_ = new Package(unpackaged_name_); + } + + return unpackaged_; } double Package::GetFillMass(double qty) { @@ -45,12 +52,16 @@ double Package::GetFillMass(double qty) { return fill_mass; } -Package::Package() : id_(next_package_id_++), fill_min_(0), fill_max_(std::numeric_limits::max()) { - name_ = "unnamed"; -} - -Package::Package(std::string name, double fill_min, double fill_max, std::string strategy) : name_(name), id_(next_package_id_++), fill_min_(fill_min), fill_max_(fill_max), strategy_(strategy) {} - -Package::Package(int id, std::string name) : id_(id), name_(name), fill_min_(0), fill_max_(std::numeric_limits::max()) {} +Package::Package(std::string name, double fill_min, double fill_max, std::string strategy) : + name_(name), fill_min_(fill_min), fill_max_(fill_max), strategy_(strategy) { + if (name == unpackaged_name_) { + if (unpackaged_) { + throw ValueError("can't create a package with name " + unpackaged_name_); + } + id_ = unpackaged_id_; + } else { + id = next_package_id_++; + } + } } // namespace cyclus diff --git a/src/package.h b/src/package.h index 1aba7a80d2..53a813321b 100644 --- a/src/package.h +++ b/src/package.h @@ -54,16 +54,18 @@ class Package { // returns the unpackaged package name static std::string unpackaged_name() { return unpackaged_name_; } - protected: - Package(); - Package(std::string name, double fill_min, double fill_max, std::string strategy); - // creates the unpackaged type. Id is always 1. - static Package::Ptr CreateUnpackaged(); - Package(int id, std::string name); + // returns the unpackaged singleton object + static Ptr unpackaged(); private: + Package(std::string name, + double fill_min = 0, + double fill_max = std::numeric_limits::max(), + std::string strategy = "first"); + static const int unpackaged_id_ = 1; - static const std::string unpackaged_name_ = "unpackaged"; + static const char* unpackaged_name_ = "unpackaged"; + static Ptr unpackaged_ = NULL; static int next_package_id_; std::string name_;