summaryrefslogtreecommitdiffstats
path: root/ml/BitRateWindow.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ml/BitRateWindow.cc')
-rw-r--r--ml/BitRateWindow.cc75
1 files changed, 75 insertions, 0 deletions
diff --git a/ml/BitRateWindow.cc b/ml/BitRateWindow.cc
new file mode 100644
index 00000000..c4c994c4
--- /dev/null
+++ b/ml/BitRateWindow.cc
@@ -0,0 +1,75 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "BitRateWindow.h"
+
+using namespace ml;
+
+std::pair<BitRateWindow::Edge, size_t> BitRateWindow::insert(bool Bit) {
+ Edge E;
+
+ BBC.insert(Bit);
+ switch (CurrState) {
+ case State::NotFilled: {
+ if (BBC.isFilled()) {
+ if (BBC.numSetBits() < SetBitsThreshold) {
+ CurrState = State::BelowThreshold;
+ } else {
+ CurrState = State::AboveThreshold;
+ }
+ } else {
+ CurrState = State::NotFilled;
+ }
+
+ E = {State::NotFilled, CurrState};
+ break;
+ } case State::BelowThreshold: {
+ if (BBC.numSetBits() >= SetBitsThreshold) {
+ CurrState = State::AboveThreshold;
+ }
+
+ E = {State::BelowThreshold, CurrState};
+ break;
+ } case State::AboveThreshold: {
+ if ((BBC.numSetBits() < SetBitsThreshold) ||
+ (CurrLength == MaxLength)) {
+ CurrState = State::Idle;
+ }
+
+ E = {State::AboveThreshold, CurrState};
+ break;
+ } case State::Idle: {
+ if (CurrLength == IdleLength) {
+ CurrState = State::NotFilled;
+ }
+
+ E = {State::Idle, CurrState};
+ break;
+ }
+ }
+
+ Action A = EdgeActions[E];
+ size_t L = (this->*A)(E.first, Bit);
+ return {E, L};
+}
+
+void BitRateWindow::print(std::ostream &OS) const {
+ switch (CurrState) {
+ case State::NotFilled:
+ OS << "NotFilled";
+ break;
+ case State::BelowThreshold:
+ OS << "BelowThreshold";
+ break;
+ case State::AboveThreshold:
+ OS << "AboveThreshold";
+ break;
+ case State::Idle:
+ OS << "Idle";
+ break;
+ default:
+ OS << "UnknownState";
+ break;
+ }
+
+ OS << ": " << BBC << " (Current Length: " << CurrLength << ")";
+}