Index: src/libchcore/TTaskManagerStatsSnapshot.h
===================================================================
diff -u -N -r12a1725bfd04b0f55fd0fda302975fdcd4174943 -ra5f396da5ed5ffb3fcd9fdf22afb5a7fd07e1ab8
--- src/libchcore/TTaskManagerStatsSnapshot.h	(.../TTaskManagerStatsSnapshot.h)	(revision 12a1725bfd04b0f55fd0fda302975fdcd4174943)
+++ src/libchcore/TTaskManagerStatsSnapshot.h	(.../TTaskManagerStatsSnapshot.h)	(revision a5f396da5ed5ffb3fcd9fdf22afb5a7fd07e1ab8)
@@ -24,6 +24,7 @@
 #define __TTASKMANAGERSTATSSNAPSHOT_H__
 
 #include "libchcore.h"
+#include "TTaskStatsSnapshot.h"
 
 BEGIN_CHCORE_NAMESPACE
 
@@ -37,36 +38,55 @@
 
 	void Clear();
 
-	size_t GetProcessedCount() const { return m_stProcessedCount; }
-	void SetProcessedCount(size_t stCount) { m_stProcessedCount = stCount; }
+	void AddTaskStats(const TTaskStatsSnapshotPtr& spStats);
+	size_t GetTaskStatsCount() const;
+	TTaskStatsSnapshotPtr GetTaskStatsAt(size_t stIndex) const;
+	TTaskStatsSnapshotPtr GetTaskStatsForSessionUniqueID(size_t stSessionUniqueID) const;
 
-	size_t GetTotalCount() const { return m_stTotalCount; }
-	void SetTotalCount(size_t stTotalCount) { m_stTotalCount = stTotalCount; }
+	size_t GetRunningTasks() const { return m_stRunningTasks; }
+	void SetRunningTasks(size_t stRunningTasks) { m_stRunningTasks = stRunningTasks; }
 
-	unsigned long long GetProcessedSize() const { return m_ullProcessedSize; }
-	void SetProcessedSize(unsigned long long ullProcessedSize) { m_ullProcessedSize = ullProcessedSize; }
+	unsigned long long GetProcessedCount() const;
+	unsigned long long GetTotalCount() const;
+	unsigned long long GetProcessedSize() const;
+	unsigned long long GetTotalSize() const;
 
-	unsigned long long GetTotalSize() const { return m_ullTotalSize; }
-	void SetTotalSize(unsigned long long ullTotalSize) { m_ullTotalSize = ullTotalSize; }
+	double GetCountSpeed() const;
+	double GetAvgCountSpeed() const;
+	double GetSizeSpeed() const;
+	double GetAvgSizeSpeed() const;
 
-	double GetGlobalProgressInPercent() const { return m_dGlobalProgressInPercent; }
-	void SetGlobalProgressInPercent(double dPercent) { m_dGlobalProgressInPercent = dPercent; }
+	double GetCombinedProgress() const;
 
-	size_t GetRunningTasks() const { return m_stRunningTasks; }
-	void SetRunningTasks(size_t stRunningTasks) { m_stRunningTasks = stRunningTasks; }
+private:
+	void CalculateProgressAndSpeeds() const;
 
 private:
-	size_t m_stProcessedCount;
-	size_t m_stTotalCount;
+	size_t m_stRunningTasks;
 
-	unsigned long long m_ullProcessedSize;
-	unsigned long long m_ullTotalSize;
+#pragma warning(push)
+#pragma warning(disable: 4251)
+	std::vector<TTaskStatsSnapshotPtr> m_vTasksSnapshots;
+#pragma warning(pop)
 
-	double m_dGlobalProgressInPercent;
+	// cache for items calculated on-demand
+	mutable bool m_bCacheFilled;
+	mutable unsigned long long m_ullProcessedCount;
+	mutable unsigned long long m_ullTotalCount;
+	mutable unsigned long long m_ullProcessedSize;
+	mutable unsigned long long m_ullTotalSize;
 
-	size_t m_stRunningTasks;
+	mutable double m_dCountSpeed;
+	mutable double m_dSizeSpeed;
+
+	mutable double m_dAvgCountSpeed;
+	mutable double m_dAvgSizeSpeed;
+
+	mutable double m_dCombinedProgress;
 };
 
+typedef boost::shared_ptr<TTaskManagerStatsSnapshot> TTaskManagerStatsSnapshotPtr;
+
 END_CHCORE_NAMESPACE
 
 #endif