#ifndef HELPERS_H_ #define HELPERS_H_ #include #include using std::deque; template int sign(const T& value) { return value < 0 ? -1 : (value > 0 ? 1 : 0); } template T ema(iter begin, iter end) { const std::size_t N = std::distance(begin, end); const T a = T(1) - T(2) / T(N + 1); T b = T(1); T nominator = 0, denominator = 0; for(iter it = begin; it < end; it++) { nominator += *it * b; denominator += b; b *= a; } return nominator / denominator; } template class buffer : public deque { using deque::deque; std::size_t limit; public: buffer(std::size_t limit) : limit(limit), deque(limit) {}; buffer(std::size_t limit, const T& value) : limit(limit), deque(limit, value) {}; void add(const T& value) { if (this->size() >= limit) { this->pop_back(); } push_front(value); } }; #endif