53 lines
1.0 KiB
C++
53 lines
1.0 KiB
C++
#ifndef HELPERS_H_
|
|
#define HELPERS_H_
|
|
|
|
#include <deque>
|
|
#include <iterator>
|
|
|
|
using std::deque;
|
|
|
|
template <typename T>
|
|
int sign(const T& value) {
|
|
return value < 0 ? -1 : (value > 0 ? 1 : 0);
|
|
}
|
|
|
|
template <typename T, class iter>
|
|
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 <typename T>
|
|
class buffer : public deque<T>
|
|
{
|
|
using deque<T>::deque;
|
|
std::size_t limit;
|
|
|
|
public:
|
|
buffer(std::size_t limit) : limit(limit), deque<T>(limit) {};
|
|
buffer(std::size_t limit, const T& value) : limit(limit), deque<T>(limit, value) {};
|
|
|
|
void add(const T& value)
|
|
{
|
|
if (this->size() >= limit) {
|
|
this->pop_back();
|
|
}
|
|
|
|
push_front(value);
|
|
}
|
|
};
|
|
|
|
#endif
|