From 4a795dce29c41f9fef0a051b7a42119d2d967901 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Radovan=20=C4=8Cerven=C3=BD?= <radovan.cerveny@gmail.com>
Date: Mon, 1 Feb 2016 20:14:56 +0100
Subject: [PATCH] memory hint structure and interface for memory tracking

---
 .../src/measurements/MeasurementEngine.cpp    |  4 +++
 .../src/measurements/MeasurementEngine.hpp    |  4 ++-
 ...urementFrame.hpp => MeasurementFrames.hpp} | 25 +++++++++++++------
 .../src/measurements/MemoryDataFrame.cpp      |  8 ++++--
 alib2algo/src/measurements/TimeDataFrame.cpp  |  2 +-
 alib2algo/src/measurements/measurements.hpp   |  4 +++
 6 files changed, 36 insertions(+), 11 deletions(-)
 rename alib2algo/src/measurements/{MeasurementFrame.hpp => MeasurementFrames.hpp} (86%)

diff --git a/alib2algo/src/measurements/MeasurementEngine.cpp b/alib2algo/src/measurements/MeasurementEngine.cpp
index 8b837ab78c..9b9dd2f53a 100644
--- a/alib2algo/src/measurements/MeasurementEngine.cpp
+++ b/alib2algo/src/measurements/MeasurementEngine.cpp
@@ -37,6 +37,10 @@ void MeasurementEngine::pop_measurement_frame ( ) {
 	MemoryDataFrame::update ( current_idx, frames );
 }
 
+void MeasurementEngine::memory_hint ( MemoryHint mh ) {
+	MemoryDataFrame::hint ( frame_idx_stack.back ( ), frames, std::move ( mh ) );
+}
+
 void MeasurementEngine::print_as_list ( std::ostream & os, unsigned idx ) {
 	MeasurementFrame & frame = frames[idx];
 
diff --git a/alib2algo/src/measurements/MeasurementEngine.hpp b/alib2algo/src/measurements/MeasurementEngine.hpp
index 3ba730e679..69590f048f 100644
--- a/alib2algo/src/measurements/MeasurementEngine.hpp
+++ b/alib2algo/src/measurements/MeasurementEngine.hpp
@@ -7,7 +7,7 @@
 
 #include <ostream>
 #include "MeasurementTypes.hpp"
-#include "MeasurementFrame.hpp"
+#include "MeasurementFrames.hpp"
 
 namespace measurements {
 
@@ -23,6 +23,8 @@ public:
 	void push_measurement_frame ( std::string, measurements::Type );
 	void pop_measurement_frame ( );
 
+	void memory_hint ( MemoryHint );
+
 	void print_as_list ( std::ostream & );
 	void print_as_tree ( std::ostream & );
 
diff --git a/alib2algo/src/measurements/MeasurementFrame.hpp b/alib2algo/src/measurements/MeasurementFrames.hpp
similarity index 86%
rename from alib2algo/src/measurements/MeasurementFrame.hpp
rename to alib2algo/src/measurements/MeasurementFrames.hpp
index 20b9e2c21f..d66eac39d1 100644
--- a/alib2algo/src/measurements/MeasurementFrame.hpp
+++ b/alib2algo/src/measurements/MeasurementFrames.hpp
@@ -6,28 +6,39 @@
 #define MEASUREMENT_FRAME_HPP_
 
 #include <chrono>
+#include <sstream>
 #include "MeasurementTypes.hpp"
 
 namespace measurements {
 
 struct MeasurementFrame;
 
-struct TimeDataFrame {
-	std::chrono::time_point < std::chrono::high_resolution_clock > start;
+struct MemoryHint {
+	enum class Type {
+		NEW, DELETE
+	};
 
-	std::chrono::microseconds duration;
-	std::chrono::microseconds real_duration;
+	Type   type;
+	size_t size;
+};
+
+struct MemoryDataFrame {
+	unsigned current_heap_usage;
+	unsigned high_watermark;
 
 	std::string to_string ( );
 	// void		to_xml ( );
 
 	static void init ( unsigned, std::vector < MeasurementFrame > & );
 	static void update ( unsigned, std::vector < MeasurementFrame > & );
+	static void hint ( unsigned, std::vector < MeasurementFrame > &, MemoryHint );
 };
 
-struct MemoryDataFrame {
-	unsigned current_heap_usage;
-	unsigned high_watermark;
+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 ( );
diff --git a/alib2algo/src/measurements/MemoryDataFrame.cpp b/alib2algo/src/measurements/MemoryDataFrame.cpp
index 3c5ba5d8cc..cded19e229 100644
--- a/alib2algo/src/measurements/MemoryDataFrame.cpp
+++ b/alib2algo/src/measurements/MemoryDataFrame.cpp
@@ -2,8 +2,7 @@
  * Author: Radovan Cerveny
  */
 
-#include <sstream>
-#include "MeasurementFrame.hpp"
+#include "MeasurementFrames.hpp"
 
 using namespace std::chrono;
 
@@ -19,6 +18,11 @@ void MemoryDataFrame::update ( unsigned frame_idx, std::vector < MeasurementFram
 	MeasurementFrame & parent_frame = frames[current_frame.parent_idx];
 }
 
+void MemoryDataFrame::hint ( unsigned frame_idx, std::vector < MeasurementFrame > & frames, MemoryHint hint ) {
+	MeasurementFrame & current_frame = frames[frame_idx];
+	frame_idx = hint.size = 0;
+}
+
 std::string MemoryDataFrame::to_string ( ) {
 	std::stringstream ss;
 
diff --git a/alib2algo/src/measurements/TimeDataFrame.cpp b/alib2algo/src/measurements/TimeDataFrame.cpp
index a7e1c438df..209c6b665e 100644
--- a/alib2algo/src/measurements/TimeDataFrame.cpp
+++ b/alib2algo/src/measurements/TimeDataFrame.cpp
@@ -3,7 +3,7 @@
  */
 
 #include <sstream>
-#include "MeasurementFrame.hpp"
+#include "MeasurementFrames.hpp"
 
 using namespace std::chrono;
 
diff --git a/alib2algo/src/measurements/measurements.hpp b/alib2algo/src/measurements/measurements.hpp
index f21cdef6cb..ccd80db859 100644
--- a/alib2algo/src/measurements/measurements.hpp
+++ b/alib2algo/src/measurements/measurements.hpp
@@ -17,6 +17,10 @@ void end ( ) {
 	MeasurementEngine::INSTANCE.pop_measurement_frame ( );
 }
 
+void memory_hint ( MemoryHint mh ) {
+	MeasurementEngine::INSTANCE.memory_hint ( std::move ( mh ) );
+}
+
 void print_as_list ( std::ostream & os ) {
 	MeasurementEngine::INSTANCE.print_as_list ( os );
 }
-- 
GitLab