#pragma once
#include "../Include.h"
#include "TickEntry.h"
#include "Helper.h"
struct SlidingWindowData
{
int64_t mMean = 0;
int64_t mMedian = 0;
int64_t mLow = 0;
int64_t mHigh = 0;
inline std::string toStr() const
{
return std::to_string(mMean) + ',' + std::to_string(mMedian) + ',' + std::to_string(mLow) + ',' + std::to_string(mHigh);
}
};
class SlidingWindow
{
public:
explicit SlidingWindow();
explicit SlidingWindow(int64_t, size_t, size_t, int64_t, int64_t);
std::pair<bool, SlidingWindowData> push(const TickEntry&);
std::pair<TickEntry, SlidingWindowData> getTail();
std::pair<TickEntry, SlidingWindowData> getHead();
std::vector<TickEntry> getWindow();
size_t getSize();
size_t getCapacity();
private:
void pop();
bool grow();
int64_t getMedianIdx(int64_t px);
int64_t getMedian();
int64_t getLow();
int64_t getHigh();
private:
std::vector<TickEntry> mWindow;
std::vector<int64_t> mMedianBuffer;
boost::circular_buffer<TickEntry> mLoBuffer;
boost::circular_buffer<TickEntry> mHiBuffer;
SlidingWindowData mSlidingWindowData;
int64_t mWindowSize;
int64_t mMeanSum;
int64_t mMedianBasePx;
int64_t mMedianOffset;
int64_t mMedianBufferCapacity;
int64_t mMediamBufferTickSize;
size_t mCapacity;
size_t mMaxCapacity;
size_t mHead;
size_t mTail;
};