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 &parameters,
             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 &parameters) {
    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());
  }

};