diff --git a/common/lib/window.cpp b/common/include/villas/dsp/window.hpp similarity index 57% rename from common/lib/window.cpp rename to common/include/villas/dsp/window.hpp index a9cae8120..579103170 100644 --- a/common/lib/window.cpp +++ b/common/include/villas/dsp/window.hpp @@ -1,5 +1,6 @@ /** A sliding/moving window. * + * @file * @author Steffen Vogel * @copyright 2014-2019, Institute for Automation of Complex Power Systems, EONERC * @license GNU General Public License (version 3) @@ -20,42 +21,62 @@ * along with this program. If not, see . *********************************************************************************/ -#include +#pragma once -#include #include -int window_init(struct window *w, size_t steps, double init) -{ - size_t len = LOG2_CEIL(steps); +namespace villas { +namespace dsp { - /* Allocate memory for ciruclar history buffer */ - w->data = (double *) alloc(len * sizeof(double)); - if (!w->data) - return -1; +template +class Window { - for (size_t i = 0; i < len; i++) - w->data[i] = init; +public: + typedef typename std::vector::size_type size_type; - w->steps = steps; - w->pos = len; - w->mask = len - 1; +protected: + std::vector data; - return 0; -} + T init; -int window_destroy(struct window *w) -{ - free(w->data); + size_type steps; + size_type mask; + size_type pos; - return 0; -} +public: -double window_update(struct window *w, double in) -{ - double out = w->data[(w->pos - w->steps) & w->mask]; + Window(size_type steps = 0, T i = 0) : + init(i) + { + size_type len = LOG2_CEIL(steps); - w->data[w->pos++ & w->mask] = in; + /* Allocate memory for ciruclar history buffer */ + data = std::vector(len, i); - return out; -} + steps = steps; + pos = len; + mask = len - 1; + } + + T update(T in) + { + T out = data[(pos - steps) & mask]; + + data[pos++ & mask] = in; + + return out; + } + + size_type getPos() const + { + return steps; + } + + T operator[](int i) const + { + return data[(pos + i) & mask]; + } +}; + +} // namespace dsp +} // namespace villas diff --git a/common/include/villas/window.h b/common/include/villas/window.h deleted file mode 100644 index d4836b8f9..000000000 --- a/common/include/villas/window.h +++ /dev/null @@ -1,48 +0,0 @@ -/** A sliding/moving window. - * - * @file - * @author Steffen Vogel - * @copyright 2014-2019, Institute for Automation of Complex Power Systems, EONERC - * @license GNU General Public License (version 3) - * - * VILLAScommon - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - *********************************************************************************/ - -#pragma once - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -struct window { - double *data; - - size_t steps; - size_t mask; - size_t pos; -}; - -int window_init(struct window *w, size_t steps, double init); - -int window_destroy(struct window *w); - -double window_update(struct window *w, double in); - -#ifdef __cplusplus -} -#endif diff --git a/common/lib/CMakeLists.txt b/common/lib/CMakeLists.txt index 41900d160..8307e8516 100644 --- a/common/lib/CMakeLists.txt +++ b/common/lib/CMakeLists.txt @@ -46,7 +46,6 @@ add_library(villas-common SHARED version.cpp copyright.cpp common.cpp - window.cpp ) execute_process(