Program Listing for File utility_processes.hpp

Return to documentation for file (include/eat/framework/utility_processes.hpp)

#pragma once

#include "process.hpp"

namespace eat::framework {

template <typename T>
class DataSource : public FunctionalAtomicProcess {
 public:
  DataSource(const std::string &name, T value)
      : FunctionalAtomicProcess(name),
        value_(std::move(value)),
        initialised(true),
        out(add_out_port<DataPort<T>>("out")) {}

  explicit DataSource(const std::string &name)
      : FunctionalAtomicProcess(name), initialised(false), out(add_out_port<DataPort<T>>("out")) {}

  void set_value(T value) {
    value_ = std::move(value);
    initialised = true;
  }

  void process() override {
    if (!initialised) throw std::runtime_error("value has not been set");
    out->set_value(std::move(value_));
    initialised = false;
  }

 private:
  T value_;
  bool initialised;

  DataPortPtr<T> out;
};

template <typename T>
class DataSink : public FunctionalAtomicProcess {
 public:
  DataSink(const std::string &name) : FunctionalAtomicProcess(name), in(add_in_port<DataPort<T>>("in")) {}

  T &get_value() {
    if (!initialised) throw std::runtime_error("value has not been set");
    return value_;
  }

  void process() override {
    value_ = std::move(in->get_value());
    initialised = true;
  }

 private:
  T value_;
  bool initialised = false;

  DataPortPtr<T> in;
};

template <typename T>
class NullSink : public FunctionalAtomicProcess {
 public:
  NullSink(const std::string &name) : FunctionalAtomicProcess(name), in(add_in_port<DataPort<T>>("in")) {}

  void process() override {
    T value = std::move(in->get_value());
    (void)value;
  }

 private:
  DataPortPtr<T> in;
};

}  // namespace eat::framework