Program Listing for File streaminfo.hpp¶
↰ Return to documentation for file (falcon/streaminfo.hpp)
// ---------------------------------------------------------------------
// This file is part of falcon-core.
//
// Copyright (C) 2015, 2016, 2017 Neuro-Electronics Research Flanders
//
// Falcon-server 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
// (at your option) any later version.
//
// Falcon-server 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 falcon-core. If not, see <http://www.gnu.org/licenses/>.
// ---------------------------------------------------------------------
#pragma once
#include <limits>
#include <stdexcept>
#include <any>
#include "idata.hpp"
const double IRREGULARSTREAM = std::numeric_limits<double>::min();
// Represents the data stream generated by an output port
class IStreamInfo {
public:
IStreamInfo(double stream_rate = IRREGULARSTREAM, std::string datatype = "none", std::string stream_name="data")
: stream_rate_(stream_rate), datatype_(datatype), stream_name_(stream_name) {}
bool finalized() const;
virtual void Finalize() = 0;
double stream_rate() const;
void set_stream_rate(double stream_rate);
void set_stream_rate(const IStreamInfo &info);
std::string datatype() const;
std::string stream_name() const {return stream_name_;};
void set_stream_name(std::string stream_name);
void set_stream_name(const IStreamInfo &info);
void set_stream_parameters(const IStreamInfo &info);
void set_stream_parameters(double stream_rate, std::string stream_name);
template <typename T = typename AnyType::Data>
const T & getDataPrototype() const {
// todo: throw exception when not finalized
return dynamic_cast<const T &>(*prototype_);
}
template <typename T>
const T & parameters() const {
return std::any_cast<const T &>(parameters_);
}
protected:
double stream_rate_ = 1.0;
std::string datatype_ = "none";
std::string stream_name_ = "data";
bool finalized_ = false;
std::unique_ptr<AnyType::Data> prototype_;
std::any parameters_;
};
// Data type specific implementation of stream info
template <typename DATATYPE> class StreamInfo : public IStreamInfo {
public:
StreamInfo(const typename DATATYPE::Parameters ¶meters,
double stream_rate = IRREGULARSTREAM, std::string name="data")
: IStreamInfo(stream_rate, DATATYPE::datatype(), name) {
parameters_ = parameters;
}
const typename DATATYPE::Parameters parameters() const {
return std::any_cast<const typename DATATYPE::Parameters &>(parameters_);
}
void Finalize() override {
finalized_ = true;
auto prototype = std::make_unique<typename DATATYPE::Data>(this->parameters());
prototype_ = std::move(prototype);
}
void set_parameters(const typename DATATYPE::Parameters ¶meters) {
if (finalized()) {
throw std::runtime_error(
"Stream information is finalized. Cannot change parameters.");
}
parameters_ = parameters;
}
void set_parameters(const StreamInfo<DATATYPE> &info) {
set_parameters(info.parameters());
}
};