feat: remove static members from singleton, convert to thread safe

This commit is contained in:
parker
2025-07-14 16:36:44 +01:00
parent 4dfae16942
commit a1d4d77be4
9 changed files with 71 additions and 60 deletions

View File

@@ -21,23 +21,21 @@ enzo::nt::OpId enzo::nt::NetworkManager::addOperator(nt::opConstructor ctorFunc)
}
enzo::nt::NetworkManager* enzo::nt::NetworkManager::getInstance()
enzo::nt::NetworkManager& enzo::nt::NetworkManager::getInstance()
{
if(instancePtr_==nullptr)
{
instancePtr_ = new enzo::nt::NetworkManager();
}
return instancePtr_;
static enzo::nt::NetworkManager instance;
return instance;
}
enzo::nt::GeometryOperator& enzo::nt::NetworkManager::getGeoOperator(nt::OpId opId)
{
std::cout << "gop size middle getter: " << gopStore_.size() <<"\n"; // <- size 0
if(opId>gopStore_.size())
auto it = gopStore_.find(opId);
if(it == gopStore_.end())
{
throw std::out_of_range("OpId: " + std::to_string(opId) + " > max opId: " + std::to_string(maxOpId_) + "\n");
}
return *gopStore_.at(opId);
return *it->second;
}
bool enzo::nt::NetworkManager::isValidOp(nt::OpId opId)
@@ -64,7 +62,7 @@ void enzo::nt::NetworkManager::setDisplayOp(OpId opId)
}
std::cout << "gop size middle: " << gopStore_.size() <<"\n"; // <- size: 1
enzo::nt::GeometryOperator& displayOp = getGeoOperator(opId);
getInstance()->updateDisplay(displayOp.getOutputGeo(0));
updateDisplay(displayOp.getOutputGeo(0));
std::cout << "gop size after: " << gopStore_.size() <<"\n";
}
@@ -108,8 +106,6 @@ std::optional<enzo::nt::OpId> enzo::nt::NetworkManager::getDisplayOp()
void enzo::nt::NetworkManager::_reset()
{
std::cout << "resetting network manager\n";
delete instancePtr_;
instancePtr_ = nullptr;
gopStore_.clear();
maxOpId_=0;
@@ -117,6 +113,5 @@ void enzo::nt::NetworkManager::_reset()
}
#endif
enzo::nt::NetworkManager* enzo::nt::NetworkManager::instancePtr_ = nullptr;
std::unordered_map<enzo::nt::OpId, std::unique_ptr<enzo::nt::GeometryOperator>> enzo::nt::NetworkManager::gopStore_;
// std::unordered_map<enzo::nt::OpId, std::unique_ptr<enzo::nt::GeometryOperator>> enzo::nt::NetworkManager::gopStore_;

View File

@@ -15,36 +15,39 @@ public:
// delete copy constructor
NetworkManager(const NetworkManager& obj) = delete;
static NetworkManager* getInstance();
static NetworkManager& getInstance();
// functions
static OpId addOperator(nt::opConstructor ctorFunc);
static std::optional<OpId> getDisplayOp();
static bool isValidOp(nt::OpId opId);
static GeometryOperator& getGeoOperator(nt::OpId opId);
static void setDisplayOp(OpId opId);
OpId addOperator(nt::opConstructor ctorFunc);
std::optional<OpId> getDisplayOp();
bool isValidOp(nt::OpId opId);
GeometryOperator& getGeoOperator(nt::OpId opId);
void setDisplayOp(OpId opId);
#ifdef UNIT_TEST
static void _reset();
void _reset();
#endif
private:
static NetworkManager* instancePtr_;
NetworkManager() {};
// functions
static void cookOp(enzo::nt::OpId opId);
static std::vector<enzo::nt::OpId> getDependencyGraph(enzo::nt::OpId opId);
void cookOp(enzo::nt::OpId opId);
std::vector<enzo::nt::OpId> getDependencyGraph(enzo::nt::OpId opId);
// variables
// store for geometry operators
static std::unordered_map<enzo::nt::OpId, std::unique_ptr<enzo::nt::GeometryOperator>> gopStore_;
std::unordered_map<enzo::nt::OpId, std::unique_ptr<enzo::nt::GeometryOperator>> gopStore_;
// the highest operator id currently stored
inline static enzo::nt::OpId maxOpId_=0;
enzo::nt::OpId maxOpId_=0;
// operator selected for displaying in the viewport
inline static std::optional<OpId> displayOp_=std::nullopt;
std::optional<OpId> displayOp_=std::nullopt;
signals:
void updateDisplay(enzo::geo::Geometry& geometry);
};
inline enzo::nt::NetworkManager& nm() {
return enzo::nt::NetworkManager::getInstance();
}
}

View File

@@ -22,8 +22,9 @@ const enzo::geo::Geometry& enzo::nt::GeometryOpDef::getInputGeoView(unsigned int
enzo::geo::Geometry enzo::nt::GeometryOpDef::cloneInputGeo(unsigned int inputIndex)
{
auto& nm = nt::nm();
// TODO: implement
enzo::nt::GeometryOperator& selfOp = nt::NetworkManager::getGeoOperator(opId_);
enzo::nt::GeometryOperator& selfOp = nm.getGeoOperator(opId_);
std::vector<std::shared_ptr<const nt::GeometryConnection>> inputConnections = selfOp.getInputConnections();
if(inputConnections.size()==0)
{
@@ -31,7 +32,7 @@ enzo::geo::Geometry enzo::nt::GeometryOpDef::cloneInputGeo(unsigned int inputInd
return enzo::geo::Geometry();
}
std::shared_ptr<const nt::GeometryConnection> inputConnection = inputConnections.at(inputIndex);
return nt::NetworkManager::getGeoOperator(inputConnection->getInputOpId()).getOutputGeo(inputConnection->getInputIndex());
return nm.getGeoOperator(inputConnection->getInputOpId()).getOutputGeo(inputConnection->getInputIndex());
}
void enzo::nt::GeometryOpDef::setOutputGeometry(unsigned int outputIndex, enzo::geo::Geometry geometry)

View File

@@ -9,8 +9,10 @@ using namespace enzo;
void enzo::nt::connectOperators(enzo::nt::OpId inputOpId, unsigned int inputIndex, enzo::nt::OpId outputOpId, unsigned int outputIndex)
{
auto& inputOp = nt::NetworkManager::getGeoOperator(inputOpId);
auto& outputOp = nt::NetworkManager::getGeoOperator(outputOpId);
auto& nm = nt::nm();
auto& inputOp = nm.getGeoOperator(inputOpId);
auto& outputOp = nm.getGeoOperator(outputOpId);
auto newConnection = std::make_shared<nt::GeometryConnection>(inputOpId, inputIndex, outputOpId, outputIndex);