Skip to content

Commit 79facca

Browse files
committed
Allow null values in flat enumeration.
1 parent ac169dc commit 79facca

File tree

2 files changed

+32
-20
lines changed

2 files changed

+32
-20
lines changed

Sources/NodeEngine/NE_Value.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,10 @@ IListValueConstPtr CreateListValue (const ValueConstPtr& value)
202202

203203
void FlatEnumerate (const ValueConstPtr& value, const std::function<void (const ValueConstPtr&)>& processor)
204204
{
205+
if (value == nullptr) {
206+
processor (value);
207+
return;
208+
}
205209
IListValueConstPtr listValue = CreateListValue (value);
206210
listValue->Enumerate ([&] (const ValueConstPtr& innerValue) {
207211
if (Value::IsType<SingleValue> (innerValue)) {

Sources/NodeEngineTest/ListValueNodeTest.cpp

+28-20
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,6 @@ using namespace NE;
1111
namespace ListValueNodeTest
1212
{
1313

14-
class MultiInputSlot : public InputSlot
15-
{
16-
public:
17-
MultiInputSlot (const SlotId& id, const ValuePtr& defaultValue) :
18-
InputSlot (id, defaultValue, OutputSlotConnectionMode::Multiple)
19-
{
20-
}
21-
22-
~MultiInputSlot ()
23-
{
24-
25-
}
26-
};
27-
2814
class IntegerInputNode : public SerializableTestNode
2915
{
3016
public:
@@ -59,7 +45,7 @@ class ListMakerNode : public SerializableTestNode
5945

6046
virtual void Initialize () override
6147
{
62-
RegisterInputSlot (InputSlotPtr (new MultiInputSlot (SlotId ("in"), ValuePtr (new IntValue (0)))));
48+
RegisterInputSlot (InputSlotPtr (new InputSlot (SlotId ("in"), nullptr, OutputSlotConnectionMode::Multiple)));
6349
RegisterOutputSlot (OutputSlotPtr (new OutputSlot (SlotId ("out"))));
6450
}
6551

@@ -87,16 +73,38 @@ class ListSummer : public SerializableTestNode
8773
virtual ValueConstPtr Calculate (NE::EvaluationEnv& env) const override
8874
{
8975
NE::ValueConstPtr val = EvaluateSingleInputSlot (SlotId ("in"), env);
90-
const ListValue* input = Value::Cast<ListValue> (val.get ());
9176
int result = 0;
92-
input->Enumerate ([&] (const ValueConstPtr& value) {
93-
result += IntValue::Get (value);
94-
});
77+
if (IsComplexType<NumberValue> (val)) {
78+
NE::FlatEnumerate (val, [&] (const NE::ValueConstPtr& value) {
79+
result += IntValue::Get (value);
80+
});
81+
}
9582
return ValueConstPtr (new IntValue (result));
9683
}
9784
};
9885

99-
TEST (ListValueNodeTest)
86+
TEST (ListValueNodeTest_Node)
87+
{
88+
NodeManager manager;
89+
90+
NodePtr listMakerNode = manager.AddNode (NodePtr (new ListMakerNode ()));
91+
NodePtr listSummerNode = manager.AddNode (NodePtr (new ListSummer ()));
92+
93+
ASSERT (manager.ConnectOutputSlotToInputSlot (listMakerNode->GetOutputSlot (SlotId ("out")), listSummerNode->GetInputSlot (SlotId ("in"))));
94+
95+
{
96+
ValueConstPtr result = listMakerNode->Evaluate (NE::EmptyEvaluationEnv);
97+
ASSERT (Value::IsType<ListValue> (result));
98+
}
99+
100+
{
101+
ValueConstPtr result = listSummerNode->Evaluate (NE::EmptyEvaluationEnv);
102+
ASSERT (Value::IsType<IntValue> (result));
103+
ASSERT (IntValue::Get (result) == 0);
104+
}
105+
}
106+
107+
TEST (ListValueNodeTest_WithConnections)
100108
{
101109
NodeManager manager;
102110

0 commit comments

Comments
 (0)