From 1d38d6e3b9089a6392cd620776abbc8a1e9a8304 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Radovan=20=C4=8Cerven=C3=BD?= <radovan.cerveny@gmail.com>
Date: Wed, 3 Feb 2016 06:38:00 +0100
Subject: [PATCH] implemented ostream operators for measurement structs and
 types

---
 .../src/measurements/MeasurementEngine.cpp    | 25 ++----------
 .../src/measurements/MeasurementEngine.hpp    | 10 +----
 .../src/measurements/MeasurementFrame.cpp     | 23 +++++++++++
 .../src/measurements/MeasurementFrames.hpp    | 15 +++-----
 .../src/measurements/MeasurementResults.cpp   | 35 +++++++++++++++++
 .../src/measurements/MeasurementResults.hpp   | 26 +++++++++++++
 .../src/measurements/MeasurementTypes.cpp     | 38 +++++++++++++++++++
 .../src/measurements/MeasurementTypes.hpp     | 23 ++++++++++-
 .../src/measurements/MemoryDataFrame.cpp      |  8 ++--
 alib2algo/src/measurements/TimeDataFrame.cpp  |  8 ++--
 alib2algo/src/measurements/measurements.hpp   |  8 ++--
 .../measurements/MeasurementsTest.cpp         |  6 +--
 12 files changed, 167 insertions(+), 58 deletions(-)
 create mode 100644 alib2algo/src/measurements/MeasurementFrame.cpp
 create mode 100644 alib2algo/src/measurements/MeasurementResults.cpp
 create mode 100644 alib2algo/src/measurements/MeasurementResults.hpp
 create mode 100644 alib2algo/src/measurements/MeasurementTypes.cpp

diff --git a/alib2algo/src/measurements/MeasurementEngine.cpp b/alib2algo/src/measurements/MeasurementEngine.cpp
index 444de100d6..fbbfe7eca1 100644
--- a/alib2algo/src/measurements/MeasurementEngine.cpp
+++ b/alib2algo/src/measurements/MeasurementEngine.cpp
@@ -44,31 +44,14 @@ void MeasurementEngine::reset_measurements ( ) {
 	frame_idx_stack.push_back ( 0 );
 }
 
+MeasurementResults MeasurementEngine::get_results ( ) const {
+	return MeasurementResults ( frames );
+}
+
 void MeasurementEngine::memory_hint ( MemoryHint mh ) {
 	if ( ( frame_idx_stack.size ( ) == 0 ) || ( frames[frame_idx_stack.back ( )].type == measurements::Type::ROOT ) ) return;
 
 	MemoryDataFrame::hint ( frame_idx_stack.back ( ), frames, std::move ( mh ) );
 }
 
-void MeasurementEngine::print_as_list ( std::ostream & os, unsigned idx ) {
-	MeasurementFrame & frame = frames[idx];
-
-	if ( frame.type != measurements::Type::ROOT ) {
-		os << std::make_tuple ( frame.name, frame.type, frame.parent_idx, frame.time.to_string ( ), frame.memory.to_string ( ) );
-
-		if ( idx != frames.size ( ) - 1 )
-			os << ", ";
-	}
-
-	for ( unsigned sub_idx : frame.sub_idxs )
-		print_as_list ( os, sub_idx );
-}
-
-void MeasurementEngine::print_as_list ( std::ostream & os ) {
-	print_as_list ( os, 0 );
-}
-
-void MeasurementEngine::print_as_tree ( std::ostream & ) {
-}
-
 }
diff --git a/alib2algo/src/measurements/MeasurementEngine.hpp b/alib2algo/src/measurements/MeasurementEngine.hpp
index e90a54600f..f0f75c6748 100644
--- a/alib2algo/src/measurements/MeasurementEngine.hpp
+++ b/alib2algo/src/measurements/MeasurementEngine.hpp
@@ -5,9 +5,9 @@
 #ifndef MEASUREMENT_ENGINE_HPP_
 #define MEASUREMENT_ENGINE_HPP_
 
-#include <ostream>
 #include "MeasurementTypes.hpp"
 #include "MeasurementFrames.hpp"
+#include "MeasurementResults.hpp"
 
 namespace measurements {
 
@@ -17,20 +17,14 @@ class MeasurementEngine {
 
 	MeasurementEngine ( );
 
-	void print_as_list ( std::ostream &, unsigned );
-
 public:
 	void push_measurement_frame ( measurements::stealth_string, measurements::Type );
 	void pop_measurement_frame ( );
 	void reset_measurements ( );
+	MeasurementResults get_results ( ) const;
 
 	void memory_hint ( MemoryHint );
 
-	void print_as_list ( std::ostream & );
-	void print_as_tree ( std::ostream & );
-
-	// void print_as_xml ( std::ostream & );
-
 	static MeasurementEngine INSTANCE;
 };
 
diff --git a/alib2algo/src/measurements/MeasurementFrame.cpp b/alib2algo/src/measurements/MeasurementFrame.cpp
new file mode 100644
index 0000000000..974156ecd6
--- /dev/null
+++ b/alib2algo/src/measurements/MeasurementFrame.cpp
@@ -0,0 +1,23 @@
+/*
+ * Author: Radovan Cerveny
+ */
+
+#include <sstream>
+#include "MeasurementFrames.hpp"
+
+namespace measurements {
+
+MeasurementFrame::MeasurementFrame ( measurements::stealth_string name, measurements::Type type, unsigned parent_idx ) : name ( std::move ( name ) ), type ( type ), parent_idx ( parent_idx ), time ( ), memory ( ) {
+}
+
+std::ostream & operator <<( std::ostream & os, const MeasurementFrame & frame ) {
+
+	std::stringstream ss;
+
+	ss << "(TIME: " << frame.time << "), (MEM: " << frame.memory << ")";
+
+	os << std::make_tuple ( frame.name, frame.type, frame.parent_idx, frame.sub_idxs, ss.str ( ) );
+	return os;
+}
+
+}
diff --git a/alib2algo/src/measurements/MeasurementFrames.hpp b/alib2algo/src/measurements/MeasurementFrames.hpp
index 2c17d11e1e..67fda47f24 100644
--- a/alib2algo/src/measurements/MeasurementFrames.hpp
+++ b/alib2algo/src/measurements/MeasurementFrames.hpp
@@ -29,29 +29,25 @@ struct MemoryDataFrame {
 
 	size_t current_heap_usage;
 
-	std::string to_string ( );
-
-	// void		to_xml ( );
-
 	static void init ( unsigned, measurements::stealth_vector < MeasurementFrame > & );
 	static void update ( unsigned, measurements::stealth_vector < MeasurementFrame > & );
 	static void hint ( unsigned, measurements::stealth_vector < MeasurementFrame > &, MemoryHint );
 };
 
+std::ostream & operator <<( std::ostream &, const MemoryDataFrame & );
+
 struct TimeDataFrame {
 	std::chrono::time_point < std::chrono::high_resolution_clock > start;
 
 	std::chrono::microseconds duration;
 	std::chrono::microseconds real_duration;
 
-	std::string to_string ( );
-
-	// void		to_xml ( );
-
 	static void init ( unsigned, measurements::stealth_vector < MeasurementFrame > & );
 	static void update ( unsigned, measurements::stealth_vector < MeasurementFrame > & );
 };
 
+std::ostream & operator <<( std::ostream &, const TimeDataFrame & );
+
 struct MeasurementFrame {
 	measurements::stealth_string name;
 	measurements::Type			 type;
@@ -62,9 +58,10 @@ struct MeasurementFrame {
 	TimeDataFrame	time;
 	MemoryDataFrame memory;
 
-	MeasurementFrame ( measurements::stealth_string name, measurements::Type type, unsigned parent_idx ) : name ( std::move ( name ) ), type ( type ), parent_idx ( parent_idx ), time ( ), memory ( ) { }
+	MeasurementFrame ( measurements::stealth_string, measurements::Type, unsigned );
 };
 
+std::ostream & operator <<( std::ostream &, const MeasurementFrame & );
 }
 
 #endif /* MEASUREMENT_FRAME_HPP_ */
diff --git a/alib2algo/src/measurements/MeasurementResults.cpp b/alib2algo/src/measurements/MeasurementResults.cpp
new file mode 100644
index 0000000000..30438f9711
--- /dev/null
+++ b/alib2algo/src/measurements/MeasurementResults.cpp
@@ -0,0 +1,35 @@
+/*
+ * Author: Radovan Cerveny
+ */
+#include "MeasurementResults.hpp"
+
+namespace measurements {
+
+MeasurementResults::MeasurementResults ( const measurements::stealth_vector < MeasurementFrame > & frames ) : frames ( frames ) {
+}
+
+void MeasurementResults::print_as_list ( std::ostream & os, unsigned idx ) const {
+	const MeasurementFrame & frame = frames[idx];
+
+	if ( frame.type != measurements::Type::ROOT ) {
+		os << frame;
+
+		if ( idx != frames.size ( ) - 1 )
+			os << ", ";
+	}
+
+	for ( unsigned sub_idx : frame.sub_idxs )
+		print_as_list ( os, sub_idx );
+}
+
+void MeasurementResults::print_as_tree ( std::ostream &, unsigned ) const {
+}
+
+std::ostream & operator <<( std::ostream & os, const MeasurementResults & mr ) {
+
+	mr.print_as_list ( os, 0 );
+
+	return os;
+}
+
+}
diff --git a/alib2algo/src/measurements/MeasurementResults.hpp b/alib2algo/src/measurements/MeasurementResults.hpp
new file mode 100644
index 0000000000..dcdac02138
--- /dev/null
+++ b/alib2algo/src/measurements/MeasurementResults.hpp
@@ -0,0 +1,26 @@
+/*
+ * Author: Radovan Cerveny
+ */
+
+#ifndef MEASUREMENT_RESULTS_HPP_
+#define MEASUREMENT_RESULTS_HPP_
+
+#include <ostream>
+#include "MeasurementTypes.hpp"
+#include "MeasurementFrames.hpp"
+
+namespace measurements {
+
+struct MeasurementResults {
+	measurements::stealth_vector < MeasurementFrame > frames;
+
+	MeasurementResults ( const measurements::stealth_vector < MeasurementFrame > & );
+
+	void print_as_list ( std::ostream &, unsigned ) const;
+	void print_as_tree ( std::ostream &, unsigned ) const;
+};
+
+std::ostream & operator <<( std::ostream &, const MeasurementResults & );
+}
+
+#endif /* MEASUREMENT_RESULTS_HPP_ */
diff --git a/alib2algo/src/measurements/MeasurementTypes.cpp b/alib2algo/src/measurements/MeasurementTypes.cpp
new file mode 100644
index 0000000000..152f590931
--- /dev/null
+++ b/alib2algo/src/measurements/MeasurementTypes.cpp
@@ -0,0 +1,38 @@
+/*
+ * Author: Radovan Cerveny
+ */
+#include "MeasurementTypes.hpp"
+
+namespace measurements {
+
+std::ostream & operator <<( std::ostream & os, Type t ) {
+	switch ( t ) {
+	case Type::ROOT:
+		os << "ROOT";
+		break;
+
+	case Type::OVERALL:
+		os << "OVERALL";
+		break;
+
+	case Type::INIT:
+		os << "INIT";
+		break;
+
+	case Type::FINALIZE:
+		os << "FINALIZE";
+		break;
+
+	case Type::MAIN:
+		os << "MAIN";
+		break;
+
+	case Type::AUXILIARY:
+		os << "AUXILIARY";
+		break;
+	}
+
+	return os;
+}
+
+}
diff --git a/alib2algo/src/measurements/MeasurementTypes.hpp b/alib2algo/src/measurements/MeasurementTypes.hpp
index 2cadf27159..62d1982c6d 100644
--- a/alib2algo/src/measurements/MeasurementTypes.hpp
+++ b/alib2algo/src/measurements/MeasurementTypes.hpp
@@ -11,10 +11,12 @@
 
 namespace measurements {
 
-enum Type {
-	ROOT = 0, OVERALL = 1, INIT = 2, FINALIZE = 4, MAIN = 8, AUXILIARY = 16
+enum class Type : unsigned {
+	ROOT = 1, OVERALL = 2, INIT = 4, FINALIZE = 8, MAIN = 16, AUXILIARY = 32
 };
 
+std::ostream & operator <<( std::ostream & os, Type t );
+
 template < typename T, typename ... Args >
 std::unique_ptr < T > make_unique ( Args && ... args ) {
 	return std::unique_ptr < T > ( new T ( std::forward < Args > ( args ) ... ) );
@@ -43,6 +45,23 @@ using stealth_string = std::basic_string < char, std::char_traits < char >, stea
 
 template < typename T >
 using stealth_vector = std::vector < T, stealth_allocator < T > >;
+
+template < typename T >
+std::ostream & operator <<( std::ostream & os, const stealth_vector < T > & vec ) {
+	os << "[";
+
+	bool first = true;
+
+	for ( const T & elem : vec ) {
+		if ( !first ) os << ", ";
+
+		first = false;
+		os << elem;
+	}
+
+	return os << "]";
+}
+
 }
 
 #endif /* MEASUREMENT_TYPES_HPP_ */
diff --git a/alib2algo/src/measurements/MemoryDataFrame.cpp b/alib2algo/src/measurements/MemoryDataFrame.cpp
index d59d15bedb..61a0d9e6ad 100644
--- a/alib2algo/src/measurements/MemoryDataFrame.cpp
+++ b/alib2algo/src/measurements/MemoryDataFrame.cpp
@@ -52,11 +52,9 @@ void MemoryDataFrame::hint ( unsigned frame_idx, measurements::stealth_vector <
 	}
 }
 
-std::string MemoryDataFrame::to_string ( ) {
-	std::stringstream ss;
-
-	ss << start_heap_usage << "shu, " << end_heap_usage << "ehu, " << high_watermark << "hw";
-	return ss.str ( );
+std::ostream & operator <<( std::ostream & os, const MemoryDataFrame & mdf ) {
+	os << mdf.start_heap_usage << "shu, " << mdf.end_heap_usage << "ehu, " << mdf.high_watermark << "hw";
+	return os;
 }
 
 }
diff --git a/alib2algo/src/measurements/TimeDataFrame.cpp b/alib2algo/src/measurements/TimeDataFrame.cpp
index 046bb07f04..47a0ee3f99 100644
--- a/alib2algo/src/measurements/TimeDataFrame.cpp
+++ b/alib2algo/src/measurements/TimeDataFrame.cpp
@@ -26,11 +26,9 @@ void TimeDataFrame::update ( unsigned frame_idx, measurements::stealth_vector <
 	parent_frame.time.real_duration -= current_frame.time.duration;
 }
 
-std::string TimeDataFrame::to_string ( ) {
-	std::stringstream ss;
-
-	ss << duration << ", " << real_duration;
-	return ss.str ( );
+std::ostream & operator <<( std::ostream & os, const TimeDataFrame & tdf ) {
+	os << tdf.duration << ", " << tdf.real_duration;
+	return os;
 }
 
 }
diff --git a/alib2algo/src/measurements/measurements.hpp b/alib2algo/src/measurements/measurements.hpp
index 6d5c162820..ecdf40ad3c 100644
--- a/alib2algo/src/measurements/measurements.hpp
+++ b/alib2algo/src/measurements/measurements.hpp
@@ -21,12 +21,12 @@ void reset ( ) {
 	MeasurementEngine::INSTANCE.reset_measurements ( );
 }
 
-void memory_hint ( MemoryHint mh ) {
-	MeasurementEngine::INSTANCE.memory_hint ( std::move ( mh ) );
+MeasurementResults results ( ) {
+	return MeasurementEngine::INSTANCE.get_results ( );
 }
 
-void print_as_list ( std::ostream & os ) {
-	MeasurementEngine::INSTANCE.print_as_list ( os );
+void memory_hint ( MemoryHint mh ) {
+	MeasurementEngine::INSTANCE.memory_hint ( std::move ( mh ) );
 }
 
 }
diff --git a/alib2algo/test-src/measurements/MeasurementsTest.cpp b/alib2algo/test-src/measurements/MeasurementsTest.cpp
index 28a7d9ca62..accdcc52f1 100644
--- a/alib2algo/test-src/measurements/MeasurementsTest.cpp
+++ b/alib2algo/test-src/measurements/MeasurementsTest.cpp
@@ -38,8 +38,7 @@ void MeasurementsTest::testTimeMeasurements ( ) {
 		measurements::end ( );
 	measurements::end ( );
 
-	measurements::print_as_list ( std::cout );
-	std::cout << std::endl;
+	std::cout << measurements::results() << std::endl;
 }
 
 void MeasurementsTest::testMemoryMeasurements ( ) {
@@ -58,7 +57,6 @@ void MeasurementsTest::testMemoryMeasurements ( ) {
 		delete[] bar;
 	measurements::end ( );
 
-	measurements::print_as_list ( std::cout );
-	std::cout << std::endl;
+	std::cout << measurements::results() << std::endl;
 }
 
-- 
GitLab