Skip to content

Commit 394062d

Browse files
committed
Add floor and ceil nodes.
1 parent b917d22 commit 394062d

9 files changed

Lines changed: 156 additions & 66 deletions

File tree

Sources/BuiltInNodes/BI_UnaryFunctionNodes.cpp

Lines changed: 51 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ namespace BI
88
{
99

1010
SERIALIZATION_INFO (UnaryFunctionNode, 1);
11-
DYNAMIC_SERIALIZATION_INFO (AbsoluteValueNode, 1, "{125E8E5E-F1CB-4AE4-8EA9-53343ACD193B}");
11+
DYNAMIC_SERIALIZATION_INFO (AbsoluteNode, 1, "{125E8E5E-F1CB-4AE4-8EA9-53343ACD193B}");
12+
DYNAMIC_SERIALIZATION_INFO (CeilNode, 1, "{60B0DFF2-2718-46A1-B7D5-AA614BF21FDD}");
13+
DYNAMIC_SERIALIZATION_INFO (FloorNode, 1, "{0DB3D5E3-8B32-43A4-82D2-F5B816AB5CC1}");
1214

1315
UnaryFunctionNode::UnaryFunctionNode () :
1416
UnaryFunctionNode (NE::LocString (), NUIE::Point ())
@@ -93,26 +95,70 @@ NE::ValuePtr UnaryFunctionNode::DoSingleOperation (const NE::ValueConstPtr& aVal
9395
return NE::ValuePtr (new NE::DoubleValue (result));
9496
}
9597

96-
AbsoluteValueNode::AbsoluteValueNode () :
98+
AbsoluteNode::AbsoluteNode () :
9799
UnaryFunctionNode ()
98100
{
99101

100102
}
101103

102-
AbsoluteValueNode::AbsoluteValueNode (const NE::LocString& name, const NUIE::Point& position) :
104+
AbsoluteNode::AbsoluteNode (const NE::LocString& name, const NUIE::Point& position) :
103105
UnaryFunctionNode (name, position)
104106
{
105107

106108
}
107109

108-
AbsoluteValueNode::~AbsoluteValueNode ()
110+
AbsoluteNode::~AbsoluteNode ()
109111
{
110112

111113
}
112114

113-
double AbsoluteValueNode::DoOperation (double a) const
115+
double AbsoluteNode::DoOperation (double a) const
114116
{
115117
return std::abs (a);
116118
}
117119

120+
FloorNode::FloorNode () :
121+
UnaryFunctionNode ()
122+
{
123+
124+
}
125+
126+
FloorNode::FloorNode (const NE::LocString& name, const NUIE::Point& position) :
127+
UnaryFunctionNode (name, position)
128+
{
129+
130+
}
131+
132+
FloorNode::~FloorNode ()
133+
{
134+
135+
}
136+
137+
double FloorNode::DoOperation (double a) const
138+
{
139+
return std::floor (a);
140+
}
141+
142+
CeilNode::CeilNode () :
143+
UnaryFunctionNode ()
144+
{
145+
146+
}
147+
148+
CeilNode::CeilNode (const NE::LocString& name, const NUIE::Point& position) :
149+
UnaryFunctionNode (name, position)
150+
{
151+
152+
}
153+
154+
CeilNode::~CeilNode ()
155+
{
156+
157+
}
158+
159+
double CeilNode::DoOperation (double a) const
160+
{
161+
return std::ceil (a);
162+
}
163+
118164
}

Sources/BuiltInNodes/BI_UnaryFunctionNodes.hpp

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,40 @@ class UnaryFunctionNode : public BasicUINode
3131
virtual double DoOperation (double a) const = 0;
3232
};
3333

34-
class AbsoluteValueNode : public UnaryFunctionNode
34+
class AbsoluteNode : public UnaryFunctionNode
3535
{
36-
DYNAMIC_SERIALIZABLE (AbsoluteValueNode);
36+
DYNAMIC_SERIALIZABLE (AbsoluteNode);
3737

3838
public:
39-
AbsoluteValueNode ();
40-
AbsoluteValueNode (const NE::LocString& name, const NUIE::Point& position);
41-
virtual ~AbsoluteValueNode ();
39+
AbsoluteNode ();
40+
AbsoluteNode (const NE::LocString& name, const NUIE::Point& position);
41+
virtual ~AbsoluteNode ();
42+
43+
private:
44+
virtual double DoOperation (double a) const override;
45+
};
46+
47+
class FloorNode : public UnaryFunctionNode
48+
{
49+
DYNAMIC_SERIALIZABLE (FloorNode);
50+
51+
public:
52+
FloorNode ();
53+
FloorNode (const NE::LocString& name, const NUIE::Point& position);
54+
virtual ~FloorNode ();
55+
56+
private:
57+
virtual double DoOperation (double a) const override;
58+
};
59+
60+
class CeilNode : public UnaryFunctionNode
61+
{
62+
DYNAMIC_SERIALIZABLE (CeilNode);
63+
64+
public:
65+
CeilNode ();
66+
CeilNode (const NE::LocString& name, const NUIE::Point& position);
67+
virtual ~CeilNode ();
4268

4369
private:
4470
virtual double DoOperation (double a) const override;

Sources/NodeEngineTest/BinaryOperationNodesTest.cpp

Lines changed: 26 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,27 @@ using namespace BI;
1111
namespace BinaryOperationNodesTest
1212
{
1313

14-
TEST (TestAdditionNode)
14+
static double GetBinaryOperationResult (double a, double b, const std::function<UINodePtr ()>& nodeCreator)
1515
{
1616
TestUIEnvironment env;
1717
NodeUIManager uiManager (env);
1818

19-
UINodePtr val1 = uiManager.AddNode (UINodePtr (new DoubleUpDownNode (LocString (L"Value1"), Point (0, 0), 1.0, 1.0)), EmptyEvaluationEnv);
20-
UINodePtr val2 = uiManager.AddNode (UINodePtr (new DoubleUpDownNode (LocString (L"Value1"), Point (0, 0), 2.0, 1.0)), EmptyEvaluationEnv);
21-
UINodePtr op = uiManager.AddNode (UINodePtr (new AdditionNode (LocString (L"Addition"), Point (0, 0))), EmptyEvaluationEnv);
19+
UINodePtr val1 = uiManager.AddNode (UINodePtr (new DoubleUpDownNode (LocString (L"Value1"), Point (0, 0), a, 1.0)), EmptyEvaluationEnv);
20+
UINodePtr val2 = uiManager.AddNode (UINodePtr (new DoubleUpDownNode (LocString (L"Value1"), Point (0, 0), b, 1.0)), EmptyEvaluationEnv);
21+
UINodePtr op = uiManager.AddNode (nodeCreator (), EmptyEvaluationEnv);
2222
uiManager.ConnectOutputSlotToInputSlot (val1->GetUIOutputSlot (SlotId ("out")), op->GetUIInputSlot (SlotId ("a")));
2323
uiManager.ConnectOutputSlotToInputSlot (val2->GetUIOutputSlot (SlotId ("out")), op->GetUIInputSlot (SlotId ("b")));
2424

25-
ValueConstPtr val = op->Evaluate (EmptyEvaluationEnv);
26-
ASSERT (IsSingleType<DoubleValue> (val));
27-
ASSERT (IsEqual (DoubleValue::Get (CreateSingleValue (val)), 3.0));
25+
ValueConstPtr result = op->Evaluate (EmptyEvaluationEnv);
26+
return DoubleValue::Get (result);
27+
}
28+
29+
TEST (TestAdditionNode)
30+
{
31+
double result = GetBinaryOperationResult (2.0, 3.0, [&] () {
32+
return UINodePtr (new AdditionNode (LocString (L"Addition"), Point (0, 0)));
33+
});
34+
ASSERT (IsEqual (result, 5.0));
2835
}
2936

3037
TEST (TestAdditionNodeWithList)
@@ -51,50 +58,26 @@ TEST (TestAdditionNodeWithList)
5158

5259
TEST (TestSubtractionNode)
5360
{
54-
TestUIEnvironment env;
55-
NodeUIManager uiManager (env);
56-
57-
UINodePtr val1 = uiManager.AddNode (UINodePtr (new DoubleUpDownNode (LocString (L"Value1"), Point (0, 0), 1.0, 1.0)), EmptyEvaluationEnv);
58-
UINodePtr val2 = uiManager.AddNode (UINodePtr (new DoubleUpDownNode (LocString (L"Value1"), Point (0, 0), 2.0, 1.0)), EmptyEvaluationEnv);
59-
UINodePtr op = uiManager.AddNode (UINodePtr (new SubtractionNode (LocString (L"Subtraction"), Point (0, 0))), EmptyEvaluationEnv);
60-
uiManager.ConnectOutputSlotToInputSlot (val1->GetUIOutputSlot (SlotId ("out")), op->GetUIInputSlot (SlotId ("a")));
61-
uiManager.ConnectOutputSlotToInputSlot (val2->GetUIOutputSlot (SlotId ("out")), op->GetUIInputSlot (SlotId ("b")));
62-
63-
ValueConstPtr val = op->Evaluate (EmptyEvaluationEnv);
64-
ASSERT (IsSingleType<DoubleValue> (val));
65-
ASSERT (IsEqual (DoubleValue::Get (CreateSingleValue (val)), -1.0));
61+
double result = GetBinaryOperationResult (2.0, 3.0, [&] () {
62+
return UINodePtr (new SubtractionNode (LocString (L"Subtraction"), Point (0, 0)));
63+
});
64+
ASSERT (IsEqual (result, -1.0));
6665
}
6766

6867
TEST (TestMultiplicationNode)
6968
{
70-
TestUIEnvironment env;
71-
NodeUIManager uiManager (env);
72-
73-
UINodePtr val1 = uiManager.AddNode (UINodePtr (new DoubleUpDownNode (LocString (L"Value1"), Point (0, 0), 1.0, 1.0)), EmptyEvaluationEnv);
74-
UINodePtr val2 = uiManager.AddNode (UINodePtr (new DoubleUpDownNode (LocString (L"Value1"), Point (0, 0), 2.0, 1.0)), EmptyEvaluationEnv);
75-
UINodePtr op = uiManager.AddNode (UINodePtr (new MultiplicationNode (LocString (L"Multiplication"), Point (0, 0))), EmptyEvaluationEnv);
76-
uiManager.ConnectOutputSlotToInputSlot (val1->GetUIOutputSlot (SlotId ("out")), op->GetUIInputSlot (SlotId ("a")));
77-
uiManager.ConnectOutputSlotToInputSlot (val2->GetUIOutputSlot (SlotId ("out")), op->GetUIInputSlot (SlotId ("b")));
78-
79-
ValueConstPtr val = op->Evaluate (EmptyEvaluationEnv);
80-
ASSERT (IsSingleType<DoubleValue> (val));
81-
ASSERT (IsEqual (DoubleValue::Get (CreateSingleValue (val)), 2.0));
69+
double result = GetBinaryOperationResult (2.0, 3.0, [&] () {
70+
return UINodePtr (new MultiplicationNode (LocString (L"Multiplication"), Point (0, 0)));
71+
});
72+
ASSERT (IsEqual (result, 6.0));
8273
}
8374

8475
TEST (TestDivisionNode)
8576
{
86-
TestUIEnvironment env;
87-
NodeUIManager uiManager (env);
88-
89-
UINodePtr val1 = uiManager.AddNode (UINodePtr (new DoubleUpDownNode (LocString (L"Value1"), Point (0, 0), 1.0, 1.0)), EmptyEvaluationEnv);
90-
UINodePtr val2 = uiManager.AddNode (UINodePtr (new DoubleUpDownNode (LocString (L"Value1"), Point (0, 0), 2.0, 1.0)), EmptyEvaluationEnv);
91-
UINodePtr op = uiManager.AddNode (UINodePtr (new DivisionNode (LocString (L"Division"), Point (0, 0))), EmptyEvaluationEnv);
92-
uiManager.ConnectOutputSlotToInputSlot (val1->GetUIOutputSlot (SlotId ("out")), op->GetUIInputSlot (SlotId ("a")));
93-
uiManager.ConnectOutputSlotToInputSlot (val2->GetUIOutputSlot (SlotId ("out")), op->GetUIInputSlot (SlotId ("b")));
94-
95-
ValueConstPtr val = op->Evaluate (EmptyEvaluationEnv);
96-
ASSERT (IsSingleType<DoubleValue> (val));
97-
ASSERT (IsEqual (DoubleValue::Get (CreateSingleValue (val)), 0.5));
77+
double result = GetBinaryOperationResult (2.0, 3.0, [&] () {
78+
return UINodePtr (new DivisionNode (LocString (L"Division"), Point (0, 0)));
79+
});
80+
ASSERT (IsEqual (result, 2.0 / 3.0));
9881
}
9982

10083
}

Sources/NodeEngineTest/UnaryFunctionNodesTest.cpp

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,28 +11,35 @@ using namespace BI;
1111
namespace UnaryFunctionNodesTest
1212
{
1313

14-
TEST (TestAbsoluteValueNode)
14+
static double GetUnaryFunctionResult (double a, const std::function<UINodePtr ()>& nodeCreator)
1515
{
1616
TestUIEnvironment env;
1717
NodeUIManager uiManager (env);
1818

19-
UINodePtr val = uiManager.AddNode (UINodePtr (new DoubleUpDownNode (LocString (L"Value"), Point (0, 0), -1.0, 1.0)), EmptyEvaluationEnv);
20-
UINodePtr op = uiManager.AddNode (UINodePtr (new AbsoluteValueNode (LocString (L"AbsoluteValue"), Point (0, 0))), EmptyEvaluationEnv);
19+
UINodePtr val = uiManager.AddNode (UINodePtr (new DoubleUpDownNode (LocString (L"Value"), Point (0, 0), a, 1.0)), EmptyEvaluationEnv);
20+
UINodePtr op = uiManager.AddNode (nodeCreator (), EmptyEvaluationEnv);
2121
uiManager.ConnectOutputSlotToInputSlot (val->GetUIOutputSlot (SlotId ("out")), op->GetUIInputSlot (SlotId ("a")));
2222

23-
ValueConstPtr value = op->Evaluate (EmptyEvaluationEnv);
24-
ASSERT (IsSingleType<DoubleValue> (value));
25-
ASSERT (IsEqual (DoubleValue::Get (value), 1.0));
23+
ValueConstPtr result = op->Evaluate (EmptyEvaluationEnv);
24+
return DoubleValue::Get (result);
2625
}
2726

28-
TEST (TestAbsoluteValueNodeWithList)
27+
TEST (TestAbsoluteNode)
28+
{
29+
double result = GetUnaryFunctionResult (-2.0, [&] () {
30+
return UINodePtr (new AbsoluteNode (LocString (L"AbsoluteValue"), Point (0, 0)));
31+
});
32+
ASSERT (IsEqual (result, 2.0));
33+
}
34+
35+
TEST (TestAbsoluteNodeWithList)
2936
{
3037
TestUIEnvironment env;
3138
NodeUIManager uiManager (env);
3239

3340
UINodePtr val = uiManager.AddNode (UINodePtr (new DoubleUpDownNode (LocString (L"Value"), Point (0, 0), -5.0, 1.0)), EmptyEvaluationEnv);
3441
UINodePtr listVal = uiManager.AddNode (UINodePtr (new DoubleIncrementedNode (LocString (L"Value"), Point (0, 0))), EmptyEvaluationEnv);
35-
UINodePtr op = uiManager.AddNode (UINodePtr (new AbsoluteValueNode (LocString (L"AbsoluteValue"), Point (0, 0))), EmptyEvaluationEnv);
42+
UINodePtr op = uiManager.AddNode (UINodePtr (new AbsoluteNode (LocString (L"AbsoluteValue"), Point (0, 0))), EmptyEvaluationEnv);
3643
uiManager.ConnectOutputSlotToInputSlot (val->GetUIOutputSlot (SlotId ("out")), listVal->GetUIInputSlot (SlotId ("start")));
3744
uiManager.ConnectOutputSlotToInputSlot (listVal->GetUIOutputSlot (SlotId ("out")), op->GetUIInputSlot (SlotId ("a")));
3845

@@ -46,4 +53,20 @@ TEST (TestAbsoluteValueNodeWithList)
4653
ASSERT (values == std::vector<double> ({ 5.0, 4.0, 3.0, 2.0, 1.0, 0.0, 1.0, 2.0, 3.0, 4.0 }));
4754
}
4855

56+
TEST (TestFloorNode)
57+
{
58+
double result = GetUnaryFunctionResult (2.3, [&] () {
59+
return UINodePtr (new FloorNode (LocString (L"Floor"), Point (0, 0)));
60+
});
61+
ASSERT (IsEqual (result, 2.0));
62+
}
63+
64+
TEST (TestCeilNode)
65+
{
66+
double result = GetUnaryFunctionResult (2.3, [&] () {
67+
return UINodePtr (new CeilNode (LocString (L"Ceil"), Point (0, 0)));
68+
});
69+
ASSERT (IsEqual (result, 3.0));
70+
}
71+
4972
}
433 Bytes
Loading
538 Bytes
Loading
515 Bytes
Loading

Sources/WindowsEmbeddingDemo/main.cpp

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -133,19 +133,28 @@ class AppUIEnvironment : public NUIE::NodeUIEnvironment
133133
AddNodeTreeItem (nodeTree, inputNodes, L"Number Distribution", NUIE::IconId (106), [&] (const NUIE::Point& position) {
134134
return NUIE::UINodePtr (new BI::DoubleDistributedNode (NE::LocString (L"Number Distribution"), position));
135135
});
136-
size_t arithmeticNodes = nodeTree.AddGroup (L"Arithmetic Nodes");
137-
AddNodeTreeItem (nodeTree, arithmeticNodes, L"Addition", NUIE::IconId (107), [&] (const NUIE::Point& position) {
136+
size_t mathematicalNodes = nodeTree.AddGroup (L"Mathematical Nodes");
137+
AddNodeTreeItem (nodeTree, mathematicalNodes, L"Addition", NUIE::IconId (107), [&] (const NUIE::Point& position) {
138138
return NUIE::UINodePtr (new BI::AdditionNode (NE::LocString (L"Addition"), position));
139139
});
140-
AddNodeTreeItem (nodeTree, arithmeticNodes, L"Subtraction", NUIE::IconId (108), [&] (const NUIE::Point& position) {
140+
AddNodeTreeItem (nodeTree, mathematicalNodes, L"Subtraction", NUIE::IconId (108), [&] (const NUIE::Point& position) {
141141
return NUIE::UINodePtr (new BI::SubtractionNode (NE::LocString (L"Subtraction"), position));
142142
});
143-
AddNodeTreeItem (nodeTree, arithmeticNodes, L"Multiplication", NUIE::IconId (109), [&] (const NUIE::Point& position) {
143+
AddNodeTreeItem (nodeTree, mathematicalNodes, L"Multiplication", NUIE::IconId (109), [&] (const NUIE::Point& position) {
144144
return NUIE::UINodePtr (new BI::MultiplicationNode (NE::LocString (L"Multiplication"), position));
145145
});
146-
AddNodeTreeItem (nodeTree, arithmeticNodes, L"Division", NUIE::IconId (110), [&] (const NUIE::Point& position) {
146+
AddNodeTreeItem (nodeTree, mathematicalNodes, L"Division", NUIE::IconId (110), [&] (const NUIE::Point& position) {
147147
return NUIE::UINodePtr (new BI::DivisionNode (NE::LocString (L"Division"), position));
148148
});
149+
AddNodeTreeItem (nodeTree, mathematicalNodes, L"Abs", NUIE::IconId (113), [&] (const NUIE::Point& position) {
150+
return NUIE::UINodePtr (new BI::AbsoluteNode (NE::LocString (L"Abs"), position));
151+
});
152+
AddNodeTreeItem (nodeTree, mathematicalNodes, L"Floor", NUIE::IconId (114), [&] (const NUIE::Point& position) {
153+
return NUIE::UINodePtr (new BI::FloorNode (NE::LocString (L"Floor"), position));
154+
});
155+
AddNodeTreeItem (nodeTree, mathematicalNodes, L"Ceil", NUIE::IconId (115), [&] (const NUIE::Point& position) {
156+
return NUIE::UINodePtr (new BI::CeilNode (NE::LocString (L"Ceil"), position));
157+
});
149158
size_t otherNodes = nodeTree.AddGroup (L"Other Nodes");
150159
AddNodeTreeItem (nodeTree, otherNodes, L"List Builder", NUIE::IconId (111), [&] (const NUIE::Point& position) {
151160
return NUIE::UINodePtr (new BI::ListBuilderNode (NE::LocString (L"List Builder"), position));

Sources/WindowsEmbeddingDemo/resources.rc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,6 @@
1010
110 IMAGE "icons/Division.png"
1111
111 IMAGE "icons/ListBuilder.png"
1212
112 IMAGE "icons/Viewer.png"
13+
113 IMAGE "icons/Abs.png"
14+
114 IMAGE "icons/Floor.png"
15+
115 IMAGE "icons/Ceil.png"

0 commit comments

Comments
 (0)