initial implementation
This commit is contained in:
commit
51818852a4
11 changed files with 1181 additions and 0 deletions
107
include/xo/simulator/SourceTimestamp.hpp
Normal file
107
include/xo/simulator/SourceTimestamp.hpp
Normal file
|
|
@ -0,0 +1,107 @@
|
|||
/* 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*/
|
||||
Loading…
Add table
Add a link
Reference in a new issue