Program Listing for File logical_time.cc

Return to documentation for file (lib/logical_time.cc)

/*
 * Copyright (C) 2019 TU Dresden
 * All rights reserved.
 *
 * Authors:
 *   Christian Menard
 */

#include "reactor-cpp/logical_time.hh"

#include "reactor-cpp/assert.hh"

namespace reactor {

auto operator==(const Tag& lhs, const Tag& rhs) noexcept -> bool {
  return lhs.time_point() == rhs.time_point() && lhs.micro_step() == rhs.micro_step();
}

auto operator<(const Tag& lhs, const Tag& rhs) noexcept -> bool {
  return lhs.time_point() < rhs.time_point() ||
         (lhs.time_point() == rhs.time_point() && lhs.micro_step() < rhs.micro_step());
}

auto Tag::from_physical_time(TimePoint time_point) noexcept -> Tag { return Tag{time_point, 0}; }

auto Tag::from_logical_time(const LogicalTime& logical_time) noexcept -> Tag {
  return Tag{logical_time.time_point(), logical_time.micro_step()};
}

auto Tag::delay(Duration offset) const noexcept -> Tag {
  if (offset == Duration::zero()) {
    return Tag{this->time_point_, this->micro_step_ + 1};
  }
  return Tag{this->time_point_ + offset, 0};
}

void LogicalTime::advance_to(const Tag& tag) {
  reactor_assert(*this < tag);
  time_point_ = tag.time_point();
  micro_step_ = tag.micro_step();
}

auto operator==(const LogicalTime& logical_time, const Tag& tag) noexcept -> bool {
  return logical_time.time_point() == tag.time_point() && logical_time.micro_step() == tag.micro_step();
}

auto operator<(const LogicalTime& logical_time, const Tag& tag) noexcept -> bool {
  return logical_time.time_point() < tag.time_point() ||
         (logical_time.time_point() == tag.time_point() && logical_time.micro_step() < tag.micro_step());
}

auto operator>(const LogicalTime& logical_time, const Tag& tag) noexcept -> bool {
  return logical_time.time_point() > tag.time_point() ||
         (logical_time.time_point() == tag.time_point() && logical_time.micro_step() > tag.micro_step());
}

} // namespace reactor