xo-expression2/include/xo/simulator/SourceTimestamp.hpp

107 lines
3.2 KiB
C++

/* file SourceTimestamp.hpp
*
* author: Roland Conybeare, Sep 2022
*/
#pragma once
#include "xo/reactor/ReactorSource.hpp"
namespace xo {
namespace sim {
/* remember a timestamp for a simulation source;
* use to insert a source into simulation heap.
* don't want to use SimulationSource.t0, so that we can
* promise heap invariants without reying on
* any behavior of SimulationSource.
*
* Note: Need to resolve ties between different sources,
* if they coincide on timestamp of next event.
* For now use SimulationSource address
*/
class SourceTimestamp {
public:
using ReactorSource = xo::reactor::ReactorSource;
using utc_nanos = xo::time::utc_nanos;
public:
SourceTimestamp(utc_nanos t0,
ReactorSource * src)
: t0_(t0), src_(src) {}
static int32_t compare(SourceTimestamp const & x,
SourceTimestamp const & y) {
using xo::time::utc_nanos;
using xo::time::nanos;
nanos dt = x.t0_ - y.t0_;
if(dt < nanos(0))
return -1;
else if(dt > nanos(0))
return +1;
/* timestamps are equal */
std::ptrdiff_t dptr = (x.src() - y.src());
return dptr;
} /*compare*/
utc_nanos t0() const { return t0_; }
ReactorSource * src() const { return src_; }
void display(std::ostream & os) const;
std::string display_string() const;
private:
/* timestamp for this source */
utc_nanos t0_;
/* simulation source
* promise:
* - src.t0() >= .t0 || src.is_exhausted
*/
ReactorSource * src_ = nullptr;
}; /*SourceTimestamp*/
inline bool operator==(SourceTimestamp const & x,
SourceTimestamp const & y)
{
return SourceTimestamp::compare(x, y) == 0;
} /*operator==*/
inline bool operator<(SourceTimestamp const & x,
SourceTimestamp const & y)
{
return SourceTimestamp::compare(x, y) < 0;
} /*operator<*/
inline bool operator<=(SourceTimestamp const & x,
SourceTimestamp const & y)
{
return SourceTimestamp::compare(x, y) <= 0;
} /*operator<=*/
inline bool operator>(SourceTimestamp const & x,
SourceTimestamp const & y)
{
return SourceTimestamp::compare(x, y) > 0;
} /*operator>*/
inline bool operator>=(SourceTimestamp const & x,
SourceTimestamp const & y)
{
return SourceTimestamp::compare(x, y) >= 0;
} /*operator>=*/
inline std::ostream &
operator<<(std::ostream & os,
SourceTimestamp const & x)
{
x.display(os);
return os;
} /*operator<<*/
} /*namespace sim*/
} /*namespace xo*/
/* end SourceTimestamp.hpp*/