#ifndef SRC_TIME_STEPPING_UPDATERS_HH
#define SRC_TIME_STEPPING_UPDATERS_HH

template <class RateUpdaterTEMPLATE, class StateUpdaterTEMPLATE>
struct Updaters {
  using RateUpdater = RateUpdaterTEMPLATE;
  using StateUpdater = StateUpdaterTEMPLATE;

  Updaters() {}

  Updaters(std::shared_ptr<RateUpdaterTEMPLATE> rateUpdater,
           std::shared_ptr<StateUpdaterTEMPLATE> stateUpdater)
      : rate_(rateUpdater), state_(stateUpdater) {}

  bool operator==(Updaters const &other) const {
    return other.rate_ == rate_ and other.state_ == state_;
  }

  Updaters<RateUpdater, StateUpdater> clone() const {
    return Updaters<RateUpdater, StateUpdater>(rate_->clone(), state_->clone());
  }

  std::shared_ptr<RateUpdaterTEMPLATE> rate_;
  std::shared_ptr<StateUpdaterTEMPLATE> state_;
};

#endif