00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifndef TORRENT_STAT_HPP_INCLUDED
00034 #define TORRENT_STAT_HPP_INCLUDED
00035
00036 #include <algorithm>
00037 #include <vector>
00038 #include <assert.h>
00039
00040 #include "libtorrent/size_type.hpp"
00041 #include "libtorrent/invariant_check.hpp"
00042 #include "libtorrent/config.hpp"
00043
00044 namespace libtorrent
00045 {
00046
00047 class TORRENT_EXPORT stat
00048 {
00049 friend class invariant_access;
00050 enum { history = 10 };
00051 public:
00052
00053 stat()
00054 : m_downloaded_payload(0)
00055 , m_uploaded_payload(0)
00056 , m_downloaded_protocol(0)
00057 , m_uploaded_protocol(0)
00058 , m_total_download_payload(0)
00059 , m_total_upload_payload(0)
00060 , m_total_download_protocol(0)
00061 , m_total_upload_protocol(0)
00062 , m_mean_download_rate(0)
00063 , m_mean_upload_rate(0)
00064 , m_mean_download_payload_rate(0)
00065 , m_mean_upload_payload_rate(0)
00066 {
00067 std::fill(m_download_rate_history, m_download_rate_history+history, 0.f);
00068 std::fill(m_upload_rate_history, m_upload_rate_history+history, 0.f);
00069 std::fill(m_download_payload_rate_history, m_download_payload_rate_history+history, 0.f);
00070 std::fill(m_upload_payload_rate_history, m_upload_payload_rate_history+history, 0.f);
00071 }
00072
00073 void operator+=(const stat& s)
00074 {
00075 INVARIANT_CHECK;
00076
00077 m_downloaded_payload += s.m_downloaded_payload;
00078 m_total_download_payload += s.m_downloaded_payload;
00079 m_downloaded_protocol += s.m_downloaded_protocol;
00080 m_total_download_protocol += s.m_downloaded_protocol;
00081
00082 m_uploaded_payload += s.m_uploaded_payload;
00083 m_total_upload_payload += s.m_uploaded_payload;
00084 m_uploaded_protocol += s.m_uploaded_protocol;
00085 m_total_upload_protocol += s.m_uploaded_protocol;
00086 }
00087
00088 void received_bytes(int bytes_payload, int bytes_protocol)
00089 {
00090 INVARIANT_CHECK;
00091
00092 assert(bytes_payload >= 0);
00093 assert(bytes_protocol >= 0);
00094
00095 m_downloaded_payload += bytes_payload;
00096 m_total_download_payload += bytes_payload;
00097 m_downloaded_protocol += bytes_protocol;
00098 m_total_download_protocol += bytes_protocol;
00099 }
00100
00101 void sent_bytes(int bytes_payload, int bytes_protocol)
00102 {
00103 INVARIANT_CHECK;
00104
00105 assert(bytes_payload >= 0);
00106 assert(bytes_protocol >= 0);
00107
00108 m_uploaded_payload += bytes_payload;
00109 m_total_upload_payload += bytes_payload;
00110 m_uploaded_protocol += bytes_protocol;
00111 m_total_upload_protocol += bytes_protocol;
00112 }
00113
00114
00115 void second_tick(float tick_interval);
00116
00117 float upload_rate() const { return m_mean_upload_rate; }
00118 float download_rate() const { return m_mean_download_rate; }
00119
00120 float upload_payload_rate() const { return m_mean_upload_payload_rate; }
00121 float download_payload_rate() const { return m_mean_download_payload_rate; }
00122
00123 size_type total_payload_upload() const { return m_total_upload_payload; }
00124 size_type total_payload_download() const { return m_total_download_payload; }
00125
00126 size_type total_protocol_upload() const { return m_total_upload_protocol; }
00127 size_type total_protocol_download() const { return m_total_download_protocol; }
00128
00129
00130
00131
00132 void add_stat(size_type downloaded, size_type uploaded)
00133 {
00134 m_total_download_payload += downloaded;
00135 m_total_upload_payload += uploaded;
00136 }
00137
00138 private:
00139
00140 #ifndef NDEBUG
00141 void check_invariant() const
00142 {
00143 assert(m_mean_upload_rate >= 0);
00144 assert(m_mean_download_rate >= 0);
00145 assert(m_mean_upload_payload_rate >= 0);
00146 assert(m_mean_download_payload_rate >= 0);
00147 assert(m_total_upload_payload >= 0);
00148 assert(m_total_download_payload >= 0);
00149 assert(m_total_upload_protocol >= 0);
00150 assert(m_total_download_protocol >= 0);
00151 }
00152 #endif
00153
00154
00155 float m_download_rate_history[history];
00156 float m_upload_rate_history[history];
00157
00158 float m_download_payload_rate_history[history];
00159 float m_upload_payload_rate_history[history];
00160
00161
00162
00163
00164 int m_downloaded_payload;
00165 int m_uploaded_payload;
00166
00167
00168
00169
00170 int m_downloaded_protocol;
00171 int m_uploaded_protocol;
00172
00173
00174
00175 size_type m_total_download_payload;
00176 size_type m_total_upload_payload;
00177
00178
00179
00180 size_type m_total_download_protocol;
00181 size_type m_total_upload_protocol;
00182
00183
00184 float m_mean_download_rate;
00185 float m_mean_upload_rate;
00186
00187 float m_mean_download_payload_rate;
00188 float m_mean_upload_payload_rate;
00189 };
00190
00191 }
00192
00193 #endif // TORRENT_STAT_HPP_INCLUDED