107 lines
3.2 KiB
C++
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*/
|