aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLoek Le Blansch <loek@pipeframe.xyz>2024-06-13 08:56:03 +0200
committerLoek Le Blansch <loek@pipeframe.xyz>2024-06-13 08:56:03 +0200
commit3e5b602cb7bfb625ac7f7094f9d33409271073fb (patch)
tree120d58df15d8a9d20e5dbba6520926208dc6c801
parent719b962f4d164d3bca08832dffeed448501b0808 (diff)
add NodeOutputVisitor for printing circuit output
-rw-r--r--Circuit.cpp19
-rw-r--r--Circuit.h1
-rw-r--r--Node.cpp1
-rw-r--r--Node.h6
-rw-r--r--NodeInput.cpp10
-rw-r--r--NodeInput.h2
-rw-r--r--NodeOutput.h4
-rw-r--r--NodeOutputVisitor.cpp8
-rw-r--r--NodeOutputVisitor.h17
-rw-r--r--NodeVisitor.h11
-rw-r--r--main.cpp4
-rw-r--r--prut.h9
12 files changed, 78 insertions, 14 deletions
diff --git a/Circuit.cpp b/Circuit.cpp
index 62dfae4..e89fcb1 100644
--- a/Circuit.cpp
+++ b/Circuit.cpp
@@ -1,9 +1,14 @@
+#include <format>
+
#include "Circuit.h"
#include "Exception.h"
#include "NodeFactory.h"
+#include "NodeOutputVisitor.h"
#include "prut.h"
+using std::format;
+
void Circuit::create(string label, vector<string> nodes) {
if (nodes.size() == 1 && NodeFactory::has_type(nodes[0]))
return new_node(label, nodes[0]);
@@ -60,3 +65,17 @@ Circuit::~Circuit() {
delete n;
}
+string Circuit::result() {
+ string output;
+
+ for (auto & n : nodes) {
+ NodeOutputVisitor visitor;
+ n.second->accept(visitor);
+ if (!visitor.output_node) continue;
+
+ output += std::format("{}: {}\n", n.first, std::to_string(visitor.level));
+ }
+
+ return output;
+}
+
diff --git a/Circuit.h b/Circuit.h
index 0cc08c6..f261cd8 100644
--- a/Circuit.h
+++ b/Circuit.h
@@ -20,6 +20,7 @@ public:
virtual void new_node(string label, string type);
virtual void new_net(string src, vector<string> dests);
virtual void sim();
+ virtual string result();
private:
std::map<string, Node *> nodes = {};
diff --git a/Node.cpp b/Node.cpp
index a65a636..e837d06 100644
--- a/Node.cpp
+++ b/Node.cpp
@@ -3,6 +3,7 @@
#include "Node.h"
#include "NodeFactory.h"
#include "Net.h"
+#include "Exception.h"
#include "prut.h"
diff --git a/Node.h b/Node.h
index 9fbea6f..46a06e4 100644
--- a/Node.h
+++ b/Node.h
@@ -5,7 +5,7 @@
#include "Observer.h"
#include "Net.h"
-#include "Exception.h"
+#include "NodeVisitor.h"
using std::string;
using std::vector;
@@ -32,5 +32,9 @@ protected:
protected:
int min_inputs = -1;
int max_inputs = -1;
+
+public:
+ virtual void accept(NodeVisitor & visitor) { visitor.visit(*this); }
+ friend NodeVisitor;
};
diff --git a/NodeInput.cpp b/NodeInput.cpp
index 6ee0db4..41d5352 100644
--- a/NodeInput.cpp
+++ b/NodeInput.cpp
@@ -12,16 +12,10 @@ NodeInput::NodeInput() {
NodeInputLow * NodeInputLow::clone() const {
return new NodeInputLow(this);
}
-SignalLevel NodeInputLow::level() {
- prutprint("LOW");
- return LOW;
-}
+SignalLevel NodeInputLow::level() { return LOW; }
NodeInputHigh * NodeInputHigh::clone() const {
return new NodeInputHigh(this);
}
-SignalLevel NodeInputHigh::level() {
- prutprint("HIGH");
- return HIGH;
-}
+SignalLevel NodeInputHigh::level() { return HIGH; }
diff --git a/NodeInput.h b/NodeInput.h
index 4bd7b59..9b87f3b 100644
--- a/NodeInput.h
+++ b/NodeInput.h
@@ -20,7 +20,6 @@ public:
protected:
SignalLevel level();
using NodeInput::NodeInput;
- // NodeInputLow(const char * type) : NodeInput(type) {}
private:
NodeInputLow(const NodeInputLow *) : NodeInput() {}
@@ -35,7 +34,6 @@ public:
protected:
SignalLevel level();
using NodeInput::NodeInput;
- // NodeInputHigh(const char * type) : NodeInput(type) {}
private:
NodeInputHigh(const NodeInputHigh *) : NodeInput() {}
diff --git a/NodeOutput.h b/NodeOutput.h
index 3b60335..cd25055 100644
--- a/NodeOutput.h
+++ b/NodeOutput.h
@@ -14,4 +14,8 @@ private:
NodeOutput(const char * type);
constexpr static const char * type = "probe";
static NodeOutput instance;
+
+public:
+ virtual void accept(NodeVisitor & visitor) { visitor.visit(*this); }
};
+
diff --git a/NodeOutputVisitor.cpp b/NodeOutputVisitor.cpp
new file mode 100644
index 0000000..ca00fd4
--- /dev/null
+++ b/NodeOutputVisitor.cpp
@@ -0,0 +1,8 @@
+#include "NodeOutputVisitor.h"
+
+void NodeOutputVisitor::visit(Node & node) { }
+void NodeOutputVisitor::visit(NodeOutput & node) {
+ level = node.level(); // TODO: dit klopt niet
+ output_node = true;
+}
+
diff --git a/NodeOutputVisitor.h b/NodeOutputVisitor.h
new file mode 100644
index 0000000..710711c
--- /dev/null
+++ b/NodeOutputVisitor.h
@@ -0,0 +1,17 @@
+#pragma once
+
+#include "NodeVisitor.h"
+#include "NodeOutput.h"
+
+class NodeOutputVisitor : public NodeVisitor {
+public:
+ NodeOutputVisitor() = default;
+ virtual ~NodeOutputVisitor() = default;
+
+ virtual void visit(Node & node);
+ virtual void visit(NodeOutput & node);
+
+ bool output_node = false;
+ SignalLevel level = UNDEFINED;
+};
+
diff --git a/NodeVisitor.h b/NodeVisitor.h
new file mode 100644
index 0000000..f98a8ba
--- /dev/null
+++ b/NodeVisitor.h
@@ -0,0 +1,11 @@
+#pragma once
+
+class Node;
+class NodeOutput;
+
+class NodeVisitor {
+public:
+ virtual void visit(NodeOutput & node) = 0;
+ virtual void visit(Node & node) = 0;
+};
+
diff --git a/main.cpp b/main.cpp
index f92af8a..fd528f5 100644
--- a/main.cpp
+++ b/main.cpp
@@ -35,8 +35,8 @@ int main(int argc, char** argv) {
return EXIT_FAILURE;
}
- // cout << "Circuit output: " << circuit.getOutput() << endl;
- // cout << circuit.result();
+ // print results
+ cout << circuit.result();
return EXIT_SUCCESS;
}
diff --git a/prut.h b/prut.h
index a41c01c..2bd2ba0 100644
--- a/prut.h
+++ b/prut.h
@@ -1,6 +1,13 @@
#pragma once
-#define prutprintf(fmt, ...) printf("\x1b[37m%s (%s:%d):\x1b[0m " fmt "\n", __PRETTY_FUNCTION__, __FILE_NAME__, __LINE__, __VA_ARGS__)
+// Disable prutprint
+#define prutprintf(fmt, ...)
+
+// Short version "file:line: message"
+// #define prutprintf(fmt, ...) printf("\x1b[37m%s:%d:\x1b[0m " fmt "\n", __FILE_NAME__, __LINE__, __VA_ARGS__)
+
+// Long version "function (file:line): message"
+// #define prutprintf(fmt, ...) printf("\x1b[37m%s (%s:%d):\x1b[0m " fmt "\n", __PRETTY_FUNCTION__, __FILE_NAME__, __LINE__, __VA_ARGS__)
#define prutprint(s) prutprintf("%s", s)