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