33 : iBackLogLength(iBackLogLength), iInitialStartTime(iStartTime), iTime(iStartTime), iAveragedTime(iStartTime)
36 assert(iBackLogLength);
37 pValues = pAveragedValues =
new ValueType[iBackLogLength];
46 if (pValues != pAveragedValues)
delete [] pAveragedValues;
53 if (!!szDumpFile)
DumpToFile(szDumpFile, fWrapped);
55 iInitialStartTime = iTime = iToTime;
66 if (fWrapped)
return iTime - iBackLogLength;
68 return iTime - iBackLogPos;
82 return pAveragedValues[(iAtTime - iInitialStartTime) % iBackLogLength] * fMultiplier;
90 return pValues[(iAtTime - iInitialStartTime) % iBackLogLength];
98 pAveragedValues[(iAtTime - iInitialStartTime) % iBackLogLength] = iValue;
103 assert(iStartTime < iEndTime);
105 if (!iBackLogPos && !fWrapped)
return 0;
108 for (; ++iStartTime < iEndTime; ++iNum) iSum +=
GetValue(iStartTime);
114 int iPos0 = iBackLogPos ? iBackLogPos-1 : iBackLogPos;
115 ValueType iMinVal = pAveragedValues[iPos0];
116 int i = iPos0;
ValueType *p = pAveragedValues;
117 while (i--) iMinVal = std::min(iMinVal, *p++);
120 i = iBackLogLength - iPos0;
121 while (--i) iMinVal = std::min(iMinVal, *++p);
123 return iMinVal * fMultiplier;
128 int iPos0 = iBackLogPos ? iBackLogPos-1 : iBackLogPos;
129 ValueType iMaxVal = pAveragedValues[iPos0];
130 int i = iPos0;
ValueType *p = pAveragedValues;
131 while (i--) iMaxVal = std::max(iMaxVal, *p++);
134 i = iBackLogLength - iPos0;
135 while (--i) iMaxVal = std::max(iMaxVal, *++p);
137 return iMaxVal * fMultiplier;
143 pValues[iBackLogPos] = iValue;
146 if (++iBackLogPos >= iBackLogLength)
149 if (!!szDumpFile)
DumpToFile(szDumpFile, fWrapped);
158 assert(!!rszFilename);
160 if (!fWrapped && !iBackLogPos)
return false;
163 if (fAppend)
if (!out.
Append(rszFilename.
getData())) fAppend =
false;
173 for (
int iWriteTime =
GetStartTime(); iWriteTime < iEndTime; ++iWriteTime)
175 buf.
Format(
"%d\t%d\n\r", (
int) iWriteTime, (
int)
GetValue(iWriteTime));
184 if (iAveragedTime == iToTime)
return;
187 iAveragedTime = iInitialStartTime;
190 #define FORWARD_AVERAGE
191 #define FORWARD_AVERAGE_FACTOR 4
196 if (pAveragedValues == pValues)
198 if (iAvgRange == 1)
return;
200 pAveragedValues =
new ValueType[iBackLogLength];
203 if (iAveragedTime == iTime)
return;
204 assert(iAveragedTime < iTime);
207 #ifdef FORWARD_AVERAGE
212 for (
int iUpdateTime = std::max(iAveragedTime-iAvgFwRange-1, iStartTime); iUpdateTime < iTime; ++iUpdateTime)
215 for (
int iSumTime = std::max(iUpdateTime - iAvgRange, iStartTime); iSumTime < std::min(iUpdateTime + iAvgFwRange+1, iTime); ++iSumTime)
217 iWeight = (
ValueType) iAvgRange -
Abs(iUpdateTime - iSumTime) + 1;
219 iSumWeight += iWeight;
224 iAveragedTime = iTime;
231 const_iterator i = begin();
if (i == end())
return 0;
233 while (++i != end()) iTime = std::min(iTime, (*i)->GetStartTime());
239 const_iterator i = begin();
if (i == end())
return 0;
241 while (++i != end()) iTime = std::max(iTime, (*i)->GetEndTime());
247 const_iterator i = begin();
if (i == end())
return 0;
249 while (++i != end()) iVal = std::min(iVal, (*i)->GetMinValue());
255 const_iterator i = begin();
if (i == end())
return 0;
257 while (++i != end()) iVal = std::max(iVal, (*i)->GetMaxValue());
264 for (
auto i : *
this) iCount += i->GetSeriesCount();
272 int iCnt = i->GetSeriesCount();
273 if (iIndex <
iCnt)
return i->GetSeries(iIndex);
282 for (
auto i : *
this) i->Update();
287 if ((iCommonAvgTime = iToTime))
288 for (
auto & i : *
this) i->SetAverageTime(iToTime);
293 if ((fMultiplier = fToVal))
294 for (
auto & i : *
this) i->SetMultiplier(fToVal);
347 if (pConn) iPing = pConn->
getLag();
361 if (pPlr->pstatControls)
364 pPlr->ControlCount = 0;
366 if (pPlr->pstatActions)
369 pPlr->ActionCount = 0;
C4Application Application
const char * LoadResStr(const char *id)
#define FORWARD_AVERAGE_FACTOR
bool SEqualNoCase(const char *szStr1, const char *szStr2, int iLen)
bool Inside(T ival, U lbound, V rbound)
void Update() const override
C4Graph::TimeType GetStartTime() const override
void SetAverageTime(int iToTime) override
int GetSeriesCount() const override
C4Graph::ValueType GetMaxValue() const override
C4Graph::TimeType GetEndTime() const override
void AddGraph(C4Graph *pAdd)
C4Graph::ValueType GetMinValue() const override
const C4Graph * GetSeries(int iIndex) const override
void SetMultiplier(ValueType fToVal) override
void SetTitle(const char *szNewTitle)
void SetColorDw(DWORD dwClr)
class C4TableGraph * getStatPing() const
C4Network2IOConnection * getMsgConn() const
C4Network2Client * GetNextClient(C4Network2Client *pClient)
C4Network2ClientList Clients
int getProtORate(C4Network2IOProtocol eProt) const
int getProtIRate(C4Network2IOProtocol eProt) const
~C4Network2Stats() override
C4GraphCollection statPings
void ExecuteControlFrame()
C4GraphCollection statControls
C4GraphCollection statActions
C4Graph * GetGraphByName(const StdStrBuf &rszName, bool &rfIsTemp)
int ObjectCount(C4ID id=C4ID::None) const
void SetAvgValue(TimeType iAtTime, ValueType iValue) const
ValueType GetAtValue(TimeType iAtTime) const
void Reset(TimeType iToTime)
void RecordValue(ValueType iValue)
ValueType GetMedianValue(TimeType iStartTime, TimeType iEndTime) const override
C4TableGraph(int iBackLogLength=DefaultBlockLength, TimeType iStartTime=0)
virtual bool DumpToFile(const StdStrBuf &rszFilename, bool fAppend) const
ValueType GetMaxValue() const override
TimeType GetStartTime() const override
TimeType GetEndTime() const override
ValueType GetValue(TimeType iAtTime) const override
void SetAverageTime(int iToTime) override
void Update() const override
ValueType GetMinValue() const override
bool Create(const char *szFileName, bool fCompressed=false, bool fExecutable=false, bool fMemory=false)
bool WriteString(const char *szStr)
bool Append(const char *szFilename, bool text=false)
void Remove(StdSchedulerProc *pProc)
void Add(StdSchedulerProc *pProc)
const char * getData() const
void Format(const char *szFmt,...) GNUC_FORMAT_ATTRIBUTE_O