feat: remove static members from singleton, convert to thread safe
This commit is contained in:
@@ -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)
|
static enzo::nt::NetworkManager instance;
|
||||||
{
|
return instance;
|
||||||
instancePtr_ = new enzo::nt::NetworkManager();
|
|
||||||
}
|
|
||||||
return instancePtr_;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
enzo::nt::GeometryOperator& enzo::nt::NetworkManager::getGeoOperator(nt::OpId opId)
|
enzo::nt::GeometryOperator& enzo::nt::NetworkManager::getGeoOperator(nt::OpId opId)
|
||||||
{
|
{
|
||||||
std::cout << "gop size middle getter: " << gopStore_.size() <<"\n"; // <- size 0
|
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");
|
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)
|
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
|
std::cout << "gop size middle: " << gopStore_.size() <<"\n"; // <- size: 1
|
||||||
enzo::nt::GeometryOperator& displayOp = getGeoOperator(opId);
|
enzo::nt::GeometryOperator& displayOp = getGeoOperator(opId);
|
||||||
getInstance()->updateDisplay(displayOp.getOutputGeo(0));
|
updateDisplay(displayOp.getOutputGeo(0));
|
||||||
std::cout << "gop size after: " << gopStore_.size() <<"\n";
|
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()
|
void enzo::nt::NetworkManager::_reset()
|
||||||
{
|
{
|
||||||
std::cout << "resetting network manager\n";
|
std::cout << "resetting network manager\n";
|
||||||
delete instancePtr_;
|
|
||||||
instancePtr_ = nullptr;
|
|
||||||
|
|
||||||
gopStore_.clear();
|
gopStore_.clear();
|
||||||
maxOpId_=0;
|
maxOpId_=0;
|
||||||
@@ -117,6 +113,5 @@ void enzo::nt::NetworkManager::_reset()
|
|||||||
}
|
}
|
||||||
#endif
|
#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_;
|
|
||||||
|
|
||||||
|
|||||||
@@ -15,36 +15,39 @@ public:
|
|||||||
// delete copy constructor
|
// delete copy constructor
|
||||||
NetworkManager(const NetworkManager& obj) = delete;
|
NetworkManager(const NetworkManager& obj) = delete;
|
||||||
|
|
||||||
static NetworkManager* getInstance();
|
static NetworkManager& getInstance();
|
||||||
|
|
||||||
// functions
|
// functions
|
||||||
static OpId addOperator(nt::opConstructor ctorFunc);
|
OpId addOperator(nt::opConstructor ctorFunc);
|
||||||
static std::optional<OpId> getDisplayOp();
|
std::optional<OpId> getDisplayOp();
|
||||||
static bool isValidOp(nt::OpId opId);
|
bool isValidOp(nt::OpId opId);
|
||||||
static GeometryOperator& getGeoOperator(nt::OpId opId);
|
GeometryOperator& getGeoOperator(nt::OpId opId);
|
||||||
static void setDisplayOp(OpId opId);
|
void setDisplayOp(OpId opId);
|
||||||
|
|
||||||
#ifdef UNIT_TEST
|
#ifdef UNIT_TEST
|
||||||
static void _reset();
|
void _reset();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static NetworkManager* instancePtr_;
|
|
||||||
NetworkManager() {};
|
NetworkManager() {};
|
||||||
|
|
||||||
// functions
|
// functions
|
||||||
static void cookOp(enzo::nt::OpId opId);
|
void cookOp(enzo::nt::OpId opId);
|
||||||
static std::vector<enzo::nt::OpId> getDependencyGraph(enzo::nt::OpId opId);
|
std::vector<enzo::nt::OpId> getDependencyGraph(enzo::nt::OpId opId);
|
||||||
|
|
||||||
// variables
|
// variables
|
||||||
// store for geometry operators
|
// 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
|
// 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
|
// operator selected for displaying in the viewport
|
||||||
inline static std::optional<OpId> displayOp_=std::nullopt;
|
std::optional<OpId> displayOp_=std::nullopt;
|
||||||
signals:
|
signals:
|
||||||
void updateDisplay(enzo::geo::Geometry& geometry);
|
void updateDisplay(enzo::geo::Geometry& geometry);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
inline enzo::nt::NetworkManager& nm() {
|
||||||
|
return enzo::nt::NetworkManager::getInstance();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,8 +22,9 @@ const enzo::geo::Geometry& enzo::nt::GeometryOpDef::getInputGeoView(unsigned int
|
|||||||
|
|
||||||
enzo::geo::Geometry enzo::nt::GeometryOpDef::cloneInputGeo(unsigned int inputIndex)
|
enzo::geo::Geometry enzo::nt::GeometryOpDef::cloneInputGeo(unsigned int inputIndex)
|
||||||
{
|
{
|
||||||
|
auto& nm = nt::nm();
|
||||||
// TODO: implement
|
// 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();
|
std::vector<std::shared_ptr<const nt::GeometryConnection>> inputConnections = selfOp.getInputConnections();
|
||||||
if(inputConnections.size()==0)
|
if(inputConnections.size()==0)
|
||||||
{
|
{
|
||||||
@@ -31,7 +32,7 @@ enzo::geo::Geometry enzo::nt::GeometryOpDef::cloneInputGeo(unsigned int inputInd
|
|||||||
return enzo::geo::Geometry();
|
return enzo::geo::Geometry();
|
||||||
}
|
}
|
||||||
std::shared_ptr<const nt::GeometryConnection> inputConnection = inputConnections.at(inputIndex);
|
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)
|
void enzo::nt::GeometryOpDef::setOutputGeometry(unsigned int outputIndex, enzo::geo::Geometry geometry)
|
||||||
|
|||||||
@@ -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)
|
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& nm = nt::nm();
|
||||||
auto& outputOp = nt::NetworkManager::getGeoOperator(outputOpId);
|
|
||||||
|
auto& inputOp = nm.getGeoOperator(inputOpId);
|
||||||
|
auto& outputOp = nm.getGeoOperator(outputOpId);
|
||||||
|
|
||||||
auto newConnection = std::make_shared<nt::GeometryConnection>(inputOpId, inputIndex, outputOpId, outputIndex);
|
auto newConnection = std::make_shared<nt::GeometryConnection>(inputOpId, inputIndex, outputOpId, outputIndex);
|
||||||
|
|
||||||
|
|||||||
@@ -44,6 +44,6 @@ EnzoUI::EnzoUI()
|
|||||||
mainLayout_->addWidget(viewportSplitter_);
|
mainLayout_->addWidget(viewportSplitter_);
|
||||||
|
|
||||||
// connect signals
|
// connect signals
|
||||||
connect(enzo::nt::NetworkManager::getInstance(), &enzo::nt::NetworkManager::updateDisplay, viewport, &Viewport::geometryChanged);
|
connect(&enzo::nt::nm(), &enzo::nt::NetworkManager::updateDisplay, viewport, &Viewport::geometryChanged);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -310,7 +310,7 @@ void Network::keyPressEvent(QKeyEvent *event)
|
|||||||
|
|
||||||
NodeGraphic* Network::createNode(nt::opConstructor ctorFunc)
|
NodeGraphic* Network::createNode(nt::opConstructor ctorFunc)
|
||||||
{
|
{
|
||||||
if(nt::OpId id = nt::NetworkManager::addOperator(ctorFunc))
|
if(nt::OpId id = enzo::nt::nm().addOperator(ctorFunc))
|
||||||
{
|
{
|
||||||
NodeGraphic* newNode = new NodeGraphic(id);
|
NodeGraphic* newNode = new NodeGraphic(id);
|
||||||
scene_->addItem(newNode);
|
scene_->addItem(newNode);
|
||||||
@@ -376,15 +376,15 @@ void Network::mouseReleaseEvent(QMouseEvent *event)
|
|||||||
QLineF(event->pos(), leftMouseStart).length()<5.0f
|
QLineF(event->pos(), leftMouseStart).length()<5.0f
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
enzo::nt::NetworkManager* nm = enzo::nt::NetworkManager::getInstance();
|
enzo::nt::NetworkManager& nm = enzo::nt::nm();
|
||||||
NodeGraphic* clickedNode = static_cast<NodeGraphic*>(itemOfType<NodeGraphic>(hoverItems));
|
NodeGraphic* clickedNode = static_cast<NodeGraphic*>(itemOfType<NodeGraphic>(hoverItems));
|
||||||
enzo::nt::OpId opId = clickedNode->getOpId();
|
enzo::nt::OpId opId = clickedNode->getOpId();
|
||||||
if(auto prevDisplayOpId = nt::NetworkManager::getDisplayOp(); prevDisplayOpId)
|
if(auto prevDisplayOpId = nm.getDisplayOp(); prevDisplayOpId)
|
||||||
{
|
{
|
||||||
NodeGraphic* prevDisplayNode = nodeStore_.at(*prevDisplayOpId);
|
NodeGraphic* prevDisplayNode = nodeStore_.at(*prevDisplayOpId);
|
||||||
prevDisplayNode->setDisplayFlag(false);
|
prevDisplayNode->setDisplayFlag(false);
|
||||||
}
|
}
|
||||||
enzo::nt::NetworkManager::setDisplayOp(opId);
|
nm.setDisplayOp(opId);
|
||||||
static_cast<DisplayFlagButton*>(clickedDisplayFlag)->setEnabled(true);
|
static_cast<DisplayFlagButton*>(clickedDisplayFlag)->setEnabled(true);
|
||||||
}
|
}
|
||||||
if(state_==State::MOVING_NODE)
|
if(state_==State::MOVING_NODE)
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ void NodeGraphic::initFlagButtons()
|
|||||||
|
|
||||||
void NodeGraphic::initSockets()
|
void NodeGraphic::initSockets()
|
||||||
{
|
{
|
||||||
enzo::nt::GeometryOperator& op = enzo::nt::NetworkManager::getGeoOperator(opId_);
|
enzo::nt::GeometryOperator& op = enzo::nt::nm().getGeoOperator(opId_);
|
||||||
for(int i=0, max=op.getMaxInputs(); i<max; ++i)
|
for(int i=0, max=op.getMaxInputs(); i<max; ++i)
|
||||||
{
|
{
|
||||||
auto* socketInput = new SocketGraphic(enzo::nt::SocketIOType::Input, opId_, i, this);
|
auto* socketInput = new SocketGraphic(enzo::nt::SocketIOType::Input, opId_, i, this);
|
||||||
@@ -202,7 +202,7 @@ void NodeGraphic::updatePositions()
|
|||||||
|
|
||||||
QPointF NodeGraphic::getSocketPosition(int socketIndex, enzo::nt::SocketIOType socketType)
|
QPointF NodeGraphic::getSocketPosition(int socketIndex, enzo::nt::SocketIOType socketType)
|
||||||
{
|
{
|
||||||
enzo::nt::GeometryOperator& op = enzo::nt::NetworkManager::getGeoOperator(opId_);
|
enzo::nt::GeometryOperator& op = enzo::nt::nm().getGeoOperator(opId_);
|
||||||
int maxSocketNumber = socketType==enzo::nt::SocketIOType::Input ? op.getMaxInputs() : op.getMaxOutputs();
|
int maxSocketNumber = socketType==enzo::nt::SocketIOType::Input ? op.getMaxInputs() : op.getMaxOutputs();
|
||||||
float socketSpread = socketSize_*1.5*maxSocketNumber;
|
float socketSpread = socketSize_*1.5*maxSocketNumber;
|
||||||
|
|
||||||
|
|||||||
@@ -11,11 +11,11 @@ struct NMReset
|
|||||||
{
|
{
|
||||||
NMReset()
|
NMReset()
|
||||||
{
|
{
|
||||||
enzo::nt::NetworkManager::_reset();
|
enzo::nt::nm()._reset();
|
||||||
}
|
}
|
||||||
~NMReset()
|
~NMReset()
|
||||||
{
|
{
|
||||||
enzo::nt::NetworkManager::_reset();
|
enzo::nt::nm()._reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
@@ -23,7 +23,10 @@ struct NMReset
|
|||||||
TEST_CASE_METHOD(NMReset, "Network Manager")
|
TEST_CASE_METHOD(NMReset, "Network Manager")
|
||||||
{
|
{
|
||||||
using namespace enzo;
|
using namespace enzo;
|
||||||
nt::OpId startOp = nt::NetworkManager::addOperator(&GOP_test::ctor);
|
|
||||||
|
auto& nm = nt::nm();
|
||||||
|
|
||||||
|
nt::OpId startOp = nm.addOperator(&GOP_test::ctor);
|
||||||
nt::OpId prevOp = startOp;
|
nt::OpId prevOp = startOp;
|
||||||
std::vector<nt::OpId> prevOps;
|
std::vector<nt::OpId> prevOps;
|
||||||
|
|
||||||
@@ -31,7 +34,7 @@ TEST_CASE_METHOD(NMReset, "Network Manager")
|
|||||||
{
|
{
|
||||||
for(int i=0; i<4; ++i)
|
for(int i=0; i<4; ++i)
|
||||||
{
|
{
|
||||||
nt::OpId newOp = nt::NetworkManager::addOperator(&GOP_test::ctor);
|
nt::OpId newOp = nm.addOperator(&GOP_test::ctor);
|
||||||
prevOps.push_back(newOp);
|
prevOps.push_back(newOp);
|
||||||
nt::connectOperators(newOp, i, prevOp, 0);
|
nt::connectOperators(newOp, i, prevOp, 0);
|
||||||
}
|
}
|
||||||
@@ -41,7 +44,7 @@ TEST_CASE_METHOD(NMReset, "Network Manager")
|
|||||||
for(int i=0; i<size(prevOpsBuffer); ++i)
|
for(int i=0; i<size(prevOpsBuffer); ++i)
|
||||||
{
|
{
|
||||||
prevOps.clear();
|
prevOps.clear();
|
||||||
nt::OpId newOp = nt::NetworkManager::addOperator(GOP_test::ctor);
|
nt::OpId newOp = nm.addOperator(GOP_test::ctor);
|
||||||
prevOps.push_back(newOp);
|
prevOps.push_back(newOp);
|
||||||
nt::connectOperators(newOp, 0, prevOpsBuffer[i], 0);
|
nt::connectOperators(newOp, 0, prevOpsBuffer[i], 0);
|
||||||
|
|
||||||
@@ -50,10 +53,9 @@ TEST_CASE_METHOD(NMReset, "Network Manager")
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nt::NetworkManager* nm = nt::NetworkManager::getInstance();
|
|
||||||
BENCHMARK("Cook 100 Ops")
|
BENCHMARK("Cook 100 Ops")
|
||||||
{
|
{
|
||||||
nm->setDisplayOp(startOp);
|
nm.setDisplayOp(startOp);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -11,11 +11,11 @@ struct NMReset
|
|||||||
{
|
{
|
||||||
NMReset()
|
NMReset()
|
||||||
{
|
{
|
||||||
enzo::nt::NetworkManager::_reset();
|
enzo::nt::nm()._reset();
|
||||||
}
|
}
|
||||||
~NMReset()
|
~NMReset()
|
||||||
{
|
{
|
||||||
enzo::nt::NetworkManager::_reset();
|
enzo::nt::nm()._reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
@@ -23,32 +23,38 @@ struct NMReset
|
|||||||
TEST_CASE_METHOD(NMReset, "network fixture separation start")
|
TEST_CASE_METHOD(NMReset, "network fixture separation start")
|
||||||
{
|
{
|
||||||
using namespace enzo;
|
using namespace enzo;
|
||||||
nt::OpId newOpId = nt::NetworkManager::addOperator(GOP_test::ctor);
|
auto& nm = nt::nm();
|
||||||
|
|
||||||
|
nt::OpId newOpId = nm.addOperator(GOP_test::ctor);
|
||||||
REQUIRE(newOpId==1);
|
REQUIRE(newOpId==1);
|
||||||
REQUIRE(nt::NetworkManager::isValidOp(1));
|
REQUIRE(nm.isValidOp(1));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE_METHOD(NMReset, "network fixture separation end")
|
TEST_CASE_METHOD(NMReset, "network fixture separation end")
|
||||||
{
|
{
|
||||||
using namespace enzo;
|
using namespace enzo;
|
||||||
REQUIRE_FALSE(nt::NetworkManager::isValidOp(1));
|
auto& nm = nt::nm();
|
||||||
|
|
||||||
|
REQUIRE_FALSE(nm.isValidOp(1));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE_METHOD(NMReset, "network")
|
TEST_CASE_METHOD(NMReset, "network")
|
||||||
{
|
{
|
||||||
using namespace enzo;
|
using namespace enzo;
|
||||||
nt::OpId newOpId = nt::NetworkManager::addOperator(GOP_test::ctor);
|
auto& nm = nt::nm();
|
||||||
nt::OpId newOpId2 = nt::NetworkManager::addOperator(GOP_test::ctor);
|
|
||||||
|
|
||||||
REQUIRE(nt::NetworkManager::isValidOp(newOpId));
|
nt::OpId newOpId = nm.addOperator(GOP_test::ctor);
|
||||||
if(nt::NetworkManager::isValidOp(newOpId))
|
nt::OpId newOpId2 = nm.addOperator(GOP_test::ctor);
|
||||||
|
|
||||||
|
REQUIRE(nm.isValidOp(newOpId));
|
||||||
|
if(nm.isValidOp(newOpId))
|
||||||
{
|
{
|
||||||
auto newConnection = std::make_shared<nt::GeometryConnection>(newOpId, 1, newOpId2, 3);
|
auto newConnection = std::make_shared<nt::GeometryConnection>(newOpId, 1, newOpId2, 3);
|
||||||
|
|
||||||
auto& inputOp = nt::NetworkManager::getGeoOperator(newOpId);
|
auto& inputOp = nm.getGeoOperator(newOpId);
|
||||||
auto& outputOp = nt::NetworkManager::getGeoOperator(newOpId2);
|
auto& outputOp = nm.getGeoOperator(newOpId2);
|
||||||
|
|
||||||
// set output on the upper operator
|
// set output on the upper operator
|
||||||
outputOp.addOutputConnection(newConnection);
|
outputOp.addOutputConnection(newConnection);
|
||||||
@@ -62,14 +68,16 @@ TEST_CASE_METHOD(NMReset, "network")
|
|||||||
TEST_CASE_METHOD(NMReset, "reset")
|
TEST_CASE_METHOD(NMReset, "reset")
|
||||||
{
|
{
|
||||||
using namespace enzo;
|
using namespace enzo;
|
||||||
nt::OpId newOpId = nt::NetworkManager::addOperator(GOP_test::ctor);
|
auto& nm = nt::nm();
|
||||||
|
|
||||||
nt::NetworkManager::_reset();
|
nt::OpId newOpId = nm.addOperator(GOP_test::ctor);
|
||||||
|
|
||||||
REQUIRE_FALSE(nt::NetworkManager::isValidOp(newOpId));
|
nm._reset();
|
||||||
|
|
||||||
nt::OpId newOpId2 = nt::NetworkManager::addOperator(GOP_test::ctor);
|
REQUIRE_FALSE(nm.isValidOp(newOpId));
|
||||||
REQUIRE(nt::NetworkManager::isValidOp(newOpId2));
|
|
||||||
|
nt::OpId newOpId2 = nm.addOperator(GOP_test::ctor);
|
||||||
|
REQUIRE(nm.isValidOp(newOpId2));
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user