← source index

src/SlidingWindow.h

61 lines  ·  1.4 K  ·  cpp
#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;
};