From 3e5b602cb7bfb625ac7f7094f9d33409271073fb Mon Sep 17 00:00:00 2001 From: Loek Le Blansch Date: Thu, 13 Jun 2024 08:56:03 +0200 Subject: add NodeOutputVisitor for printing circuit output --- Circuit.cpp | 19 +++++++++++++++++++ Circuit.h | 1 + Node.cpp | 1 + Node.h | 6 +++++- NodeInput.cpp | 10 ++-------- NodeInput.h | 2 -- NodeOutput.h | 4 ++++ NodeOutputVisitor.cpp | 8 ++++++++ NodeOutputVisitor.h | 17 +++++++++++++++++ NodeVisitor.h | 11 +++++++++++ main.cpp | 4 ++-- prut.h | 9 ++++++++- 12 files changed, 78 insertions(+), 14 deletions(-) create mode 100644 NodeOutputVisitor.cpp create mode 100644 NodeOutputVisitor.h create mode 100644 NodeVisitor.h diff --git a/Circuit.cpp b/Circuit.cpp index 62dfae4..e89fcb1 100644 --- a/Circuit.cpp +++ b/Circuit.cpp @@ -1,9 +1,14 @@ +#include + #include "Circuit.h" #include "Exception.h" #include "NodeFactory.h" +#include "NodeOutputVisitor.h" #include "prut.h" +using std::format; + void Circuit::create(string label, vector 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 dests); virtual void sim(); + virtual string result(); private: std::map 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) -- cgit v1.2.3