31 #ifndef __adevs_time_h_ 32 #define __adevs_time_h_ 39 template <
class T>
inline T adevs_inf();
41 template <
class T>
inline T adevs_zero();
43 template <
class T>
inline T adevs_sentinel();
45 template <
class T>
inline T adevs_epsilon();
59 sd_time(
double t,
int k):t(t),k(k){}
61 double real()
const {
return t; }
62 double integer()
const {
return k; }
72 return (t == t2.t && k == t2.k);
77 return !(*
this == t2);
82 return (t < t2.t || (t == t2.t && k < t2.k));
84 bool operator<=(
const sd_time& t2)
const 86 return (*
this == t2 || *
this < t2);
88 bool operator>(
const sd_time& t2)
const 90 return !(*
this <= t2);
92 bool operator>=(
const sd_time& t2)
const 105 if (t2.t == 0.0) k += t2.k;
106 else { t += t2.t; k = t2.k; }
117 if (t == t2.t) { t = 0.0; k -= t2.k; }
121 friend std::ostream& operator<<(std::ostream& out,
const sd_time& t)
123 out <<
"(" << t.t <<
"," << t.k <<
")";
143 inline int fcmp(
double x1,
double x2,
double epsilon)
162 frexp(fabs(x1) > fabs(x2) ? x1 : x2, &exponent);
173 delta = ldexp(epsilon, exponent);
175 difference = x1 - x2;
177 if (difference > delta)
179 else if (difference < -delta)
223 return (
fcmp(d, rhs, epsilon) < 0);
227 return (
fcmp(d, rhs.d, epsilon) < 0);
231 return (
fcmp(d, rhs.d, epsilon) <= 0);
235 return (
fcmp(d, rhs.d, epsilon) > 0);
239 return (
fcmp(d, rhs.d, epsilon) >= 0);
243 return (
fcmp(d, rhs, epsilon) == 0);
247 return (
fcmp(d, rhs.d, epsilon) == 0);
253 template <>
inline float adevs_inf() {
254 return std::numeric_limits<float>::max(); }
255 template <>
inline long double adevs_inf() {
256 return std::numeric_limits<long double>::max(); }
257 template <>
inline double adevs_inf() {
258 return std::numeric_limits<double>::max(); }
259 template <>
inline int adevs_inf() {
260 return std::numeric_limits<int>::max(); }
261 template <>
inline long adevs_inf() {
262 return std::numeric_limits<long>::max(); }
264 return std::numeric_limits<double>::max(); }
266 return adevs::sd_time(std::numeric_limits<float>::max(),std::numeric_limits<int>::max()); }
268 template <>
inline float adevs_zero() {
return 0.0f; }
269 template <>
inline long double adevs_zero() {
return 0.0L; }
270 template <>
inline double adevs_zero() {
return 0.0; }
271 template <>
inline int adevs_zero() {
return 0; }
272 template <>
inline long adevs_zero() {
return 0; }
276 template <>
inline float adevs_sentinel() {
return -1.0f; }
277 template <>
inline long double adevs_sentinel() {
return -1.0L; }
278 template <>
inline double adevs_sentinel() {
return -1.0; }
279 template <>
inline int adevs_sentinel() {
return -1; }
280 template <>
inline long adevs_sentinel() {
return -1; }
284 template <>
inline float adevs_epsilon() {
return 0.0f; }
285 template <>
inline long double adevs_epsilon() {
return 0.0L; }
286 template <>
inline double adevs_epsilon() {
return 0.0; }
287 template <>
inline int adevs_epsilon() {
return 0; }
288 template <>
inline long adevs_epsilon() {
return 0; }
bool operator==(const sd_time &t2) const
Equivalence.
Definition: adevs_time.h:70
bool operator<(const sd_time &t2) const
Order by t then by c.
Definition: adevs_time.h:80
Definition: adevs_time.h:192
Definition: adevs_fmi.h:57
static double epsilon
Definition: adevs_time.h:202
int fcmp(double x1, double x2, double epsilon)
Definition: adevs_time.h:143
bool operator!=(const sd_time &t2) const
Not equal.
Definition: adevs_time.h:75
sd_time operator+(const sd_time &t2) const
Add and subtract.
Definition: adevs_time.h:97
Definition: adevs_time.h:53