From 2817b56d0d9cc04f5befefff7d644c4b9983bfbd Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Tue, 12 Sep 2017 12:54:53 +0200
Subject: [PATCH] move stream selection to global data

---
 alib2cli/src/ast/statements/ResultPrintStatement.h |  5 +++--
 alib2cli/src/environment/Environment.h             | 14 ++------------
 alib2common/src/global/GlobalData.cpp              |  8 ++++++++
 alib2common/src/global/GlobalData.h                | 13 +++++++++++++
 4 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/alib2cli/src/ast/statements/ResultPrintStatement.h b/alib2cli/src/ast/statements/ResultPrintStatement.h
index 87f637b5a5..1eb472a503 100644
--- a/alib2cli/src/ast/statements/ResultPrintStatement.h
+++ b/alib2cli/src/ast/statements/ResultPrintStatement.h
@@ -2,6 +2,7 @@
 #define _CLI_RESULT_PRINT_STATEMENT_H_
 
 #include <ast/Statement.h>
+#include <global/GlobalData.h>
 
 namespace cli {
 
@@ -10,8 +11,8 @@ public:
 	ResultPrintStatement ( ) {
 	}
 
-	virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > & prev, Environment & environment ) const override {
-		std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::Registry::getValuePrinterAbstraction ( prev->getReturnType ( ), environment.getOutput ( ) );
+	virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > & prev, Environment & ) const override {
+		std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::Registry::getValuePrinterAbstraction ( prev->getReturnType ( ), common::Streams::out );
 
 		if ( res->numberOfParams ( ) == 0 )
 			return res;
diff --git a/alib2cli/src/environment/Environment.h b/alib2cli/src/environment/Environment.h
index e72970fc9b..6edac91dd3 100644
--- a/alib2cli/src/environment/Environment.h
+++ b/alib2cli/src/environment/Environment.h
@@ -11,13 +11,11 @@ class Environment {
 	ext::map < std::string, std::shared_ptr < abstraction::OperationAbstraction > > m_variables;
 
 	std::unique_ptr < Environment > m_upper;
-
-	std::reference_wrapper < std::ostream > m_output;
 public:
-	Environment ( ) : m_output ( std::cout ) {
+	Environment ( ) {
 	}
 
-	Environment ( std::unique_ptr < Environment > upper ) : m_upper ( std::move ( upper ) ), m_output ( std::cout ) {
+	Environment ( std::unique_ptr < Environment > upper ) : m_upper ( std::move ( upper ) ) {
 	}
 
 	std::string getBinding ( const std::string & name ) const {
@@ -60,14 +58,6 @@ public:
 		return m_variables.erase ( name );
 	}
 
-	void setOutput ( std::ostream & output ) {
-		m_output = output;
-	}
-
-	std::ostream & getOutput ( ) const {
-		return m_output;
-	}
-
 };
 
 } /* namespace cli */
diff --git a/alib2common/src/global/GlobalData.cpp b/alib2common/src/global/GlobalData.cpp
index bde73e30ab..977b577610 100644
--- a/alib2common/src/global/GlobalData.cpp
+++ b/alib2common/src/global/GlobalData.cpp
@@ -8,6 +8,8 @@
 #include "GlobalData.h"
 #include <cstdlib>
 
+#include <iostream>
+
 namespace common {
 
 bool GlobalData::verbose = false;
@@ -20,4 +22,10 @@ int GlobalData::argc = 0;
 
 char * * GlobalData::argv = NULL;
 
+std::reference_wrapper < std::istream > Streams::in = std::cin;
+std::reference_wrapper < std::ostream > Streams::out = std::cout;
+std::reference_wrapper < std::ostream > Streams::err = std::cerr;
+std::reference_wrapper < std::ostream > Streams::log = std::clog;
+std::reference_wrapper < std::ostream > Streams::measure = ext::cmeasure;
+
 } /* common */
diff --git a/alib2common/src/global/GlobalData.h b/alib2common/src/global/GlobalData.h
index a0d51368ed..d08654d778 100644
--- a/alib2common/src/global/GlobalData.h
+++ b/alib2common/src/global/GlobalData.h
@@ -8,6 +8,10 @@
 #ifndef _GLOBAL_DATAH_
 #define _GLOBAL_DATAH_
 
+#include <functional>
+#include <istream>
+#include <ostream>
+
 namespace common {
 
 class GlobalData {
@@ -20,6 +24,15 @@ public:
 	static char * * argv;
 };
 
+class Streams {
+public:
+	static std::reference_wrapper < std::istream > in;
+	static std::reference_wrapper < std::ostream > out;
+	static std::reference_wrapper < std::ostream > err;
+	static std::reference_wrapper < std::ostream > log;
+	static std::reference_wrapper < std::ostream > measure;
+};
+
 } /* common */
 
 #endif /* _GLOBAL_DATAH_ */
-- 
GitLab