1 /* 2 * Bittorrent Client using Qt and libtorrent. 3 * Copyright (C) 2015 Vladimir Golovnev <glassez@yandex.ru> 4 * Copyright (C) 2011 Christophe Dumez <chris@qbittorrent.org> 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public License 8 * as published by the Free Software Foundation; either version 2 9 * of the License, or (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 19 * 20 * In addition, as a special exception, the copyright holders give permission to 21 * link this program with the OpenSSL project's "OpenSSL" library (or with 22 * modified versions of it that use the same license as the "OpenSSL" library), 23 * and distribute the linked executables. You must obey the GNU General Public 24 * License in all respects for all of the code used other than "OpenSSL". If you 25 * modify file(s), you may extend this exception to your version of the file(s), 26 * but you are not obligated to do so. If you do not wish to do so, delete this 27 * exception statement from your version. 28 */ 29 30 #pragma once 31 32 #ifndef Q_MOC_RUN 33 #include <boost/circular_buffer.hpp> 34 #endif 35 36 #include <QtGlobal> 37 38 template<typename T> 39 struct Sample 40 { SampleSample41 Sample() 42 : download() 43 , upload() 44 { 45 } 46 SampleSample47 Sample(T dl, T ul) 48 : download(dl) 49 , upload(ul) 50 { 51 } 52 53 Sample<T> &operator+=(const Sample<T> &other) 54 { 55 download += other.download; 56 upload += other.upload; 57 return *this; 58 } 59 60 Sample<T> &operator-=(const Sample<T> &other) 61 { 62 download -= other.download; 63 upload -= other.upload; 64 return *this; 65 } 66 67 T download; 68 T upload; 69 }; 70 71 typedef Sample<qlonglong> SpeedSample; 72 typedef Sample<qreal> SpeedSampleAvg; 73 74 class SpeedMonitor 75 { 76 public: 77 SpeedMonitor(); 78 79 void addSample(const SpeedSample &sample); 80 SpeedSampleAvg average() const; 81 void reset(); 82 83 private: 84 static const int MAX_SAMPLES = 30; 85 boost::circular_buffer<SpeedSample> m_speedSamples; 86 SpeedSample m_sum; 87 }; 88