-
Martin Christoph Hierholzer authoredMartin Christoph Hierholzer authored
VariableNetworkNodeDumpingVisitor.h 2.17 KiB
#pragma once
#include "Visitor.h"
#include <functional> // for std::reference_wrapper
#include <list>
#include <ostream>
namespace ChimeraTK {
// Forward declarations
class VariableNetworkNode;
/**
* @brief A helper class to replace the output stream temporarily
*
* This is a helper class that is used in the Graphviz dumper to be able to dump
* the nodes to a stringstream instead of directly to the file.
*
* Ideally, the pushStream()/popStream() functions should be called in pairs but
* popStream() will do nothing if the stack is empty.
*/
class PushableStream {
public:
PushableStream(std::ostream& stream) : _streamStack{stream} {}
virtual ~PushableStream() {}
void pushStream(std::ostream& stream) { _streamStack.push_back(stream); }
std::ostream& stream() { return _streamStack.back().get(); }
void popStream() {
if(_streamStack.size() == 1) return;
_streamStack.pop_back();
}
private:
std::list<std::reference_wrapper<std::ostream>> _streamStack;
};
/**
* @brief The VariableNetworkNodeDumpingVisitor class
*
* This class is serving as one of the base classes for the Graphviz dumper as
* well as the textual dumper providing detailed information about a node.
*/
class VariableNetworkNodeDumpingVisitor : public Visitor<VariableNetworkNode>, public PushableStream {
public:
/**
* @brief VariableNetworkNodeDumpingVisitor::VariableNetworkNodeDumpingVisitor
* @param stream instance of std::ostream to write to
* @param separator the separator to use
*
* Separator is used to be able to use the function in the Graphviz and
* textual connection dumper. We are using newlines for Graphviz, and space
* for textual
*/
VariableNetworkNodeDumpingVisitor(std::ostream& stream, const std::string& separator);
virtual ~VariableNetworkNodeDumpingVisitor() {}
/**
* @brief dispatch
* @param t Node to visit
*
* Visitor function for VariableNetworkNode. Will dump a verbose description
* of the node
*/
void dispatch(const VariableNetworkNode& t);
private:
std::string _separator;
};
} // namespace ChimeraTK