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>

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)
      : stream_rate_(stream_rate) {}

  bool finalized() const;
  void Finalize();
  double stream_rate() const;
  void set_stream_rate(double stream_rate);
  void set_stream_rate(const IStreamInfo &info);

 protected:
  double stream_rate_ = 1.0;
  bool finalized_ = false;
};

// 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)
      : IStreamInfo(stream_rate), parameters_(parameters) {}

  const typename DATATYPE::Parameters parameters() const { return parameters_; }

  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());
  }

 protected:
  typename DATATYPE::Parameters parameters_;
};