Skip to content

Commit baa9bc9

Browse files
committed
Node manager functions to connect and disconnect multiple connections at the same time.
1 parent c056282 commit baa9bc9

5 files changed

Lines changed: 507 additions & 13 deletions

File tree

Sources/NodeEngine/NE_ConnectionManager.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ bool ConnectionManager::IsOutputSlotConnectedToInputSlot (const OutputSlotConstP
7070

7171
bool ConnectionManager::CanConnectOutputSlotToInputSlot (const InputSlotConstPtr& inputSlot) const
7272
{
73-
if (inputSlot == nullptr) {
73+
if (DBGERROR (inputSlot == nullptr)) {
7474
return false;
7575
}
7676

@@ -101,7 +101,7 @@ bool ConnectionManager::CanConnectOutputSlotToInputSlot (const InputSlotConstPtr
101101

102102
bool ConnectionManager::CanConnectOutputSlotToInputSlot (const OutputSlotConstPtr& outputSlot, const InputSlotConstPtr& inputSlot) const
103103
{
104-
if (outputSlot == nullptr || inputSlot == nullptr) {
104+
if (DBGERROR (outputSlot == nullptr || inputSlot == nullptr)) {
105105
return false;
106106
}
107107

Sources/NodeEngine/NE_NodeManager.cpp

Lines changed: 144 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,19 @@ namespace NE
1111

1212
SERIALIZATION_INFO (NodeManager, 2);
1313

14+
template <class SlotType>
15+
static bool HasDuplicates (const std::vector<SlotType>& slots)
16+
{
17+
std::unordered_set<SlotType> slotSet;
18+
for (const SlotType& slot : slots) {
19+
if (slotSet.find (slot) != slotSet.end ()) {
20+
return true;
21+
}
22+
slotSet.insert (slot);
23+
}
24+
return false;
25+
}
26+
1427
class NodeManagerNodeEvaluator : public NodeEvaluator
1528
{
1629
public:
@@ -249,22 +262,152 @@ bool NodeManager::CanConnectOutputSlotToInputSlot (const OutputSlotConstPtr& out
249262
return true;
250263
}
251264

265+
bool NodeManager::CanConnectOutputSlotsToInputSlot (const std::vector<OutputSlotConstPtr>& outputSlots, const InputSlotConstPtr& inputSlot) const
266+
{
267+
if (DBGERROR (outputSlots.empty () || inputSlot == nullptr)) {
268+
return false;
269+
}
270+
271+
if (HasDuplicates (outputSlots)) {
272+
return false;
273+
}
274+
275+
if (outputSlots.size () > 1 && inputSlot->GetOutputSlotConnectionMode () != OutputSlotConnectionMode::Multiple) {
276+
return false;
277+
}
278+
279+
for (const OutputSlotConstPtr& outputSlot : outputSlots) {
280+
if (!CanConnectOutputSlotToInputSlot (outputSlot, inputSlot)) {
281+
return false;
282+
}
283+
}
284+
285+
return true;
286+
}
287+
288+
bool NodeManager::CanConnectOutputSlotToInputSlots (const OutputSlotConstPtr& outputSlot, const std::vector<InputSlotConstPtr>& inputSlots) const
289+
{
290+
if (DBGERROR (outputSlot == nullptr || inputSlots.empty ())) {
291+
return false;
292+
}
293+
294+
if (HasDuplicates (inputSlots)) {
295+
return false;
296+
}
297+
298+
for (const InputSlotConstPtr& inputSlot : inputSlots) {
299+
if (!CanConnectOutputSlotToInputSlot (outputSlot, inputSlot)) {
300+
return false;
301+
}
302+
}
303+
304+
return true;
305+
}
306+
252307
bool NodeManager::ConnectOutputSlotToInputSlot (const OutputSlotConstPtr& outputSlot, const InputSlotConstPtr& inputSlot)
253308
{
254-
if (!CanConnectOutputSlotToInputSlot (outputSlot, inputSlot)) {
309+
if (DBGERROR (!CanConnectOutputSlotToInputSlot (outputSlot, inputSlot))) {
255310
return false;
256311
}
257312

258313
InvalidateNodeValue (GetNode (inputSlot->GetOwnerNodeId ()));
259314
return connectionManager.ConnectOutputSlotToInputSlot (outputSlot, inputSlot);
260315
}
261316

317+
bool NodeManager::ConnectOutputSlotsToInputSlot (const std::vector<OutputSlotConstPtr>& outputSlots, const InputSlotConstPtr& inputSlot)
318+
{
319+
if (DBGERROR (!CanConnectOutputSlotsToInputSlot (outputSlots, inputSlot))) {
320+
return false;
321+
}
322+
323+
for (const OutputSlotConstPtr& outputSlot : outputSlots) {
324+
if (DBGERROR (!ConnectOutputSlotToInputSlot (outputSlot, inputSlot))) {
325+
return false;
326+
}
327+
}
328+
329+
return true;
330+
}
331+
332+
bool NodeManager::ConnectOutputSlotToInputSlots (const OutputSlotConstPtr& outputSlot, const std::vector<InputSlotConstPtr>& inputSlots)
333+
{
334+
if (DBGERROR (!CanConnectOutputSlotToInputSlots (outputSlot, inputSlots))) {
335+
return false;
336+
}
337+
338+
for (const InputSlotConstPtr& inputSlot : inputSlots) {
339+
if (DBGERROR (!ConnectOutputSlotToInputSlot (outputSlot, inputSlot))) {
340+
return false;
341+
}
342+
}
343+
344+
return true;
345+
}
346+
262347
bool NodeManager::DisconnectOutputSlotFromInputSlot (const OutputSlotConstPtr& outputSlot, const InputSlotConstPtr& inputSlot)
263348
{
349+
if (DBGERROR (outputSlot == nullptr || inputSlot == nullptr)) {
350+
return false;
351+
}
352+
353+
if (DBGERROR (!IsOutputSlotConnectedToInputSlot (outputSlot, inputSlot))) {
354+
return false;
355+
}
356+
264357
InvalidateNodeValue (GetNode (inputSlot->GetOwnerNodeId ()));
265358
return connectionManager.DisconnectOutputSlotFromInputSlot (outputSlot, inputSlot);
266359
}
267360

361+
bool NodeManager::DisconnectOutputSlotsFromInputSlot (const std::vector<OutputSlotConstPtr>& outputSlots, const InputSlotConstPtr& inputSlot)
362+
{
363+
if (DBGERROR (outputSlots.empty () || inputSlot == nullptr)) {
364+
return false;
365+
}
366+
367+
if (DBGERROR (HasDuplicates (outputSlots))) {
368+
return false;
369+
}
370+
371+
for (const OutputSlotConstPtr& outputSlot : outputSlots) {
372+
if (DBGERROR (!IsOutputSlotConnectedToInputSlot (outputSlot, inputSlot))) {
373+
return false;
374+
}
375+
}
376+
377+
for (const OutputSlotConstPtr& outputSlot : outputSlots) {
378+
if (DBGERROR (!DisconnectOutputSlotFromInputSlot (outputSlot, inputSlot))) {
379+
return false;
380+
}
381+
}
382+
383+
return true;
384+
}
385+
386+
bool NodeManager::DisconnectOutputSlotFromInputSlots (const OutputSlotConstPtr& outputSlot, const std::vector<InputSlotConstPtr>& inputSlots)
387+
{
388+
if (DBGERROR (outputSlot == nullptr || inputSlots.empty ())) {
389+
return false;
390+
}
391+
392+
if (DBGERROR (HasDuplicates (inputSlots))) {
393+
return false;
394+
}
395+
396+
for (const InputSlotConstPtr& inputSlot : inputSlots) {
397+
if (DBGERROR (!IsOutputSlotConnectedToInputSlot (outputSlot, inputSlot))) {
398+
return false;
399+
}
400+
}
401+
402+
for (const InputSlotConstPtr& inputSlot : inputSlots) {
403+
if (DBGERROR (!DisconnectOutputSlotFromInputSlot (outputSlot, inputSlot))) {
404+
return false;
405+
}
406+
}
407+
408+
return true;
409+
}
410+
268411
bool NodeManager::DisconnectAllInputSlotsFromOutputSlot (const OutputSlotConstPtr& outputSlot)
269412
{
270413
InvalidateNodeValue (GetNode (outputSlot->GetOwnerNodeId ()));

Sources/NodeEngine/NE_NodeManager.hpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,15 @@ class NodeManager
5757
bool IsOutputSlotConnectedToInputSlot (const OutputSlotConstPtr& outputSlot, const InputSlotConstPtr& inputSlot) const;
5858
bool CanConnectOutputSlotToInputSlot (const InputSlotConstPtr& inputSlot) const;
5959
bool CanConnectOutputSlotToInputSlot (const OutputSlotConstPtr& outputSlot, const InputSlotConstPtr& inputSlot) const;
60-
60+
bool CanConnectOutputSlotsToInputSlot (const std::vector<OutputSlotConstPtr>& outputSlots, const InputSlotConstPtr& inputSlot) const;
61+
bool CanConnectOutputSlotToInputSlots (const OutputSlotConstPtr& outputSlot, const std::vector<InputSlotConstPtr>& inputSlots) const;
62+
6163
bool ConnectOutputSlotToInputSlot (const OutputSlotConstPtr& outputSlot, const InputSlotConstPtr& inputSlot);
64+
bool ConnectOutputSlotsToInputSlot (const std::vector<OutputSlotConstPtr>& outputSlots, const InputSlotConstPtr& inputSlot);
65+
bool ConnectOutputSlotToInputSlots (const OutputSlotConstPtr& outputSlot, const std::vector<InputSlotConstPtr>& inputSlots);
6266
bool DisconnectOutputSlotFromInputSlot (const OutputSlotConstPtr& outputSlot, const InputSlotConstPtr& inputSlot);
67+
bool DisconnectOutputSlotsFromInputSlot (const std::vector<OutputSlotConstPtr>& outputSlots, const InputSlotConstPtr& inputSlot);
68+
bool DisconnectOutputSlotFromInputSlots (const OutputSlotConstPtr& outputSlot, const std::vector<InputSlotConstPtr>& inputSlots);
6369
bool DisconnectAllInputSlotsFromOutputSlot (const OutputSlotConstPtr& outputSlot);
6470
bool DisconnectAllOutputSlotsFromInputSlot (const InputSlotConstPtr& inputSlot);
6571

Sources/NodeEngineTest/NodeConnectionTest.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ TEST (SingleInputSlotConnectionTest)
261261
manager.AddNode (additionNode);
262262

263263
ASSERT (manager.ConnectOutputSlotToInputSlot (firstNode->GetOutputSlot (SlotId ("out")), additionNode->GetInputSlot (SlotId ("first"))));
264-
ASSERT (!manager.ConnectOutputSlotToInputSlot (firstNode->GetOutputSlot (SlotId ("out")), additionNode->GetInputSlot (SlotId ("first"))));
264+
ASSERT (!manager.CanConnectOutputSlotToInputSlot (firstNode->GetOutputSlot (SlotId ("out")), additionNode->GetInputSlot (SlotId ("first"))));
265265
ASSERT (manager.ConnectOutputSlotToInputSlot (secondNode->GetOutputSlot (SlotId ("out")), additionNode->GetInputSlot (SlotId ("first"))));
266266
}
267267

@@ -278,9 +278,9 @@ TEST (MultiInputSlotConnectionTest)
278278
manager.AddNode (additionNode);
279279

280280
ASSERT (manager.ConnectOutputSlotToInputSlot (firstNode->GetOutputSlot (SlotId ("out")), additionNode->GetInputSlot (SlotId ("in"))));
281-
ASSERT (!manager.ConnectOutputSlotToInputSlot (firstNode->GetOutputSlot (SlotId ("out")), additionNode->GetInputSlot (SlotId ("in"))));
281+
ASSERT (!manager.CanConnectOutputSlotToInputSlot (firstNode->GetOutputSlot (SlotId ("out")), additionNode->GetInputSlot (SlotId ("in"))));
282282
ASSERT (manager.ConnectOutputSlotToInputSlot (secondNode->GetOutputSlot (SlotId ("out")), additionNode->GetInputSlot (SlotId ("in"))));
283-
ASSERT (!manager.ConnectOutputSlotToInputSlot (firstNode->GetOutputSlot (SlotId ("out")), additionNode->GetInputSlot (SlotId ("in"))));
283+
ASSERT (!manager.CanConnectOutputSlotToInputSlot (firstNode->GetOutputSlot (SlotId ("out")), additionNode->GetInputSlot (SlotId ("in"))));
284284

285285
ASSERT (manager.HasConnectedInputSlots (firstNode->GetOutputSlot (SlotId ("out"))));
286286
ASSERT (manager.GetConnectedInputSlotCount (firstNode->GetOutputSlot (SlotId ("out"))) == 1);
@@ -388,8 +388,8 @@ TEST (DisabledNodeTest)
388388

389389
ASSERT (!manager.CanConnectOutputSlotToInputSlot (firstNode->GetOutputSlot (SlotId ("out")), additionNode->GetInputSlot (SlotId ("first"))));
390390
ASSERT (!manager.CanConnectOutputSlotToInputSlot (secondNode->GetOutputSlot (SlotId ("out")), additionNode->GetInputSlot (SlotId ("second"))));
391-
ASSERT (!manager.ConnectOutputSlotToInputSlot (firstNode->GetOutputSlot (SlotId ("out")), additionNode->GetInputSlot (SlotId ("first"))));
392-
ASSERT (!manager.ConnectOutputSlotToInputSlot (secondNode->GetOutputSlot (SlotId ("out")), additionNode->GetInputSlot (SlotId ("second"))));
391+
ASSERT (!manager.CanConnectOutputSlotToInputSlot (firstNode->GetOutputSlot (SlotId ("out")), additionNode->GetInputSlot (SlotId ("first"))));
392+
ASSERT (!manager.CanConnectOutputSlotToInputSlot (secondNode->GetOutputSlot (SlotId ("out")), additionNode->GetInputSlot (SlotId ("second"))));
393393

394394
ValueConstPtr result = additionNode->Evaluate (NE::EmptyEvaluationEnv);
395395
ASSERT (result != nullptr);
@@ -543,7 +543,7 @@ TEST (SlotConnectionFailedTest2)
543543
NodePtr node2 = manager.AddNode (NodePtr (new AdderInputOutputNode ()));
544544

545545
ASSERT (manager.ConnectOutputSlotToInputSlot (node1->GetOutputSlot (SlotId ("out1")), node2->GetInputSlot (SlotId ("in"))));
546-
ASSERT (!manager.ConnectOutputSlotToInputSlot (node1->GetOutputSlot (SlotId ("out1")), node2->GetInputSlot (SlotId ("in"))));
546+
ASSERT (!manager.CanConnectOutputSlotToInputSlot (node1->GetOutputSlot (SlotId ("out1")), node2->GetInputSlot (SlotId ("in"))));
547547
}
548548

549549
TEST (DeleteNodeTest)
@@ -647,7 +647,7 @@ TEST (CycleDetectionTest1)
647647
{
648648
NodeManager manager;
649649
NodePtr node = manager.AddNode (NodePtr (new AdderInputOutputNode (1)));
650-
ASSERT (!manager.ConnectOutputSlotToInputSlot (node->GetOutputSlot (SlotId ("out")), node->GetInputSlot (SlotId ("in"))));
650+
ASSERT (!manager.CanConnectOutputSlotToInputSlot (node->GetOutputSlot (SlotId ("out")), node->GetInputSlot (SlotId ("in"))));
651651
}
652652

653653
TEST (CycleDetectionTest2)
@@ -658,7 +658,7 @@ TEST (CycleDetectionTest2)
658658
NodePtr node2 = manager.AddNode (NodePtr (new AdderInputOutputNode (1)));
659659

660660
ASSERT (manager.ConnectOutputSlotToInputSlot (node1->GetOutputSlot (SlotId ("out")), node2->GetInputSlot (SlotId ("in"))));
661-
ASSERT (!manager.ConnectOutputSlotToInputSlot (node2->GetOutputSlot (SlotId ("out")), node1->GetInputSlot (SlotId ("in"))));
661+
ASSERT (!manager.CanConnectOutputSlotToInputSlot (node2->GetOutputSlot (SlotId ("out")), node1->GetInputSlot (SlotId ("in"))));
662662
}
663663

664664
TEST (CycleDetectionTest3)
@@ -671,7 +671,7 @@ TEST (CycleDetectionTest3)
671671

672672
ASSERT (manager.ConnectOutputSlotToInputSlot (node1->GetOutputSlot (SlotId ("out")), node2->GetInputSlot (SlotId ("in"))));
673673
ASSERT (manager.ConnectOutputSlotToInputSlot (node2->GetOutputSlot (SlotId ("out")), node3->GetInputSlot (SlotId ("in"))));
674-
ASSERT (!manager.ConnectOutputSlotToInputSlot (node3->GetOutputSlot (SlotId ("out")), node1->GetInputSlot (SlotId ("in"))));
674+
ASSERT (!manager.CanConnectOutputSlotToInputSlot (node3->GetOutputSlot (SlotId ("out")), node1->GetInputSlot (SlotId ("in"))));
675675
}
676676

677677
TEST (HasConnectionTest)

0 commit comments

Comments
 (0)