#ifndef USER_TRAFF_H
#define USER_TRAFF_H
+#include "resetable.h"
+#include "const.h"
+
#include <iostream>
#include <vector>
-
-#include "const.h"
-#include "os_int.h"
+#include <cstdint>
enum TRAFF_DIRECTION {TRAFF_UPLOAD, TRAFF_DOWNLOAD};
friend std::ostream & operator<< (std::ostream & o, const DIR_TRAFF & traff);
public:
- //-------------------------------------------------------------------------
- DIR_TRAFF();
- DIR_TRAFF(const DIR_TRAFF & ts);
- DIR_TRAFF & operator=(const DIR_TRAFF & ts);
- ~DIR_TRAFF();
- uint64_t operator[](int idx) const;
- uint64_t & operator[](int idx);
- DIR_TRAFF operator+(const DIR_TRAFF & ts);
+ typedef std::vector<uint64_t> ContainerType;
+ typedef ContainerType::size_type IndexType;
-private:
- std::vector<uint64_t> traff;
-};
-//-----------------------------------------------------------------------------
+ DIR_TRAFF() : traff(DIR_NUM) {}
+ const uint64_t & operator[](IndexType idx) const { return traff[idx]; }
+ uint64_t & operator[](IndexType idx) { return traff[idx]; }
+ IndexType size() const { return traff.size(); }
-//-----------------------------------------------------------------------------
-inline DIR_TRAFF::DIR_TRAFF()
- : traff(DIR_NUM, 0)
-{
-}
-//-----------------------------------------------------------------------------
-inline DIR_TRAFF::DIR_TRAFF(const DIR_TRAFF & ts)
- : traff(ts.traff)
-{
-}
-//-----------------------------------------------------------------------------
-inline DIR_TRAFF::~DIR_TRAFF()
-{
-}
-//-----------------------------------------------------------------------------
-inline DIR_TRAFF & DIR_TRAFF::operator=(const DIR_TRAFF & ts)
-{
-traff = ts.traff;
-return *this;
-}
-//-----------------------------------------------------------------------------
-inline uint64_t & DIR_TRAFF::operator[](int idx)
-{
-return traff[idx];
-}
-//-----------------------------------------------------------------------------
-inline uint64_t DIR_TRAFF::operator[](int idx) const
-{
-return traff[idx];
-}
-//-----------------------------------------------------------------------------
-inline DIR_TRAFF DIR_TRAFF::operator+(const DIR_TRAFF & ts)
-{
-for (int i = 0; i < DIR_NUM; i++)
+ void Reset()
{
- traff[i] = traff[i] + ts.traff[i];
+ for (IndexType i = 0; i < traff.size(); ++i)
+ traff[i] = 0;
}
-return *this;
-}
+
+private:
+ ContainerType traff;
+};
+
//-----------------------------------------------------------------------------
-inline std::ostream & operator<<(std::ostream & o, const DIR_TRAFF & traff)
+inline
+std::ostream & operator<<(std::ostream & o, const DIR_TRAFF & traff)
{
bool first = true;
-for (size_t i = 0; i < DIR_NUM; ++i)
+for (DIR_TRAFF::IndexType i = 0; i < traff.size(); ++i)
{
if (first)
first = false;
}
return o;
}
-//-----------------------------------------------------------------------------
+
+class DIR_TRAFF_RES
+{
+public:
+ typedef RESETABLE<uint64_t> value_type;
+ typedef RESETABLE<uint64_t> ValueType;
+ typedef std::vector<ValueType> ContainerType;
+ typedef ContainerType::size_type IndexType;
+
+ DIR_TRAFF_RES() : traff(DIR_NUM) {}
+ explicit DIR_TRAFF_RES(const DIR_TRAFF & ts)
+ : traff(ts.size())
+ {
+ for (IndexType i = 0; i < ts.size(); ++i)
+ traff[i] = ts[i];
+ }
+ DIR_TRAFF_RES & operator=(const DIR_TRAFF & ts)
+ {
+ for (IndexType i = 0; i < ts.size(); ++i)
+ traff[i] = ts[i];
+ return *this;
+ }
+ const ValueType & operator[](IndexType idx) const { return traff[idx]; }
+ ValueType & operator[](IndexType idx) { return traff[idx]; }
+ IndexType size() const { return traff.size(); }
+ DIR_TRAFF GetData() const
+ {
+ DIR_TRAFF res;
+ for (IndexType i = 0; i < traff.size(); ++i)
+ if (!traff[i].empty())
+ res[i] = traff[i].data();
+ return res;
+ }
+
+private:
+ ContainerType traff;
+};
+
#endif