AM Daemon ライブラリリファレンス
TimeSpan.h
[詳解]
1 /// @file
2 /// @brief マイクロ秒精度の時間間隔を表す構造体 TimeSpan のヘッダ。
3 ///
4 /// Copyright(C)SEGA
5 
6 #ifndef AMDAEMON_UTIL_TIMESPAN_H
7 #define AMDAEMON_UTIL_TIMESPAN_H
8 
9 #include "amdaemon/env.h"
10 
11 #include <chrono>
12 #include <limits>
13 #include <string>
14 #include <cstdint>
15 
16 namespace amdaemon
17 {
18 namespace util
19 {
20 /// @addtogroup g_util
21 /// @{
22 
23  //--------------------
24  // TimeSpan 構造体定義
25  //--------------------
26 
27  /// @brief マイクロ秒精度の時間間隔を表す構造体。
28  /// @note memcpy 可能。
29  struct TimeSpan
30  {
31  /// 内部値の表現型。
32  typedef std::int64_t value_type;
33 
34  /// マイクロ秒数値。
35  value_type value;
36 
37  /// @brief マイクロ秒数値からインスタンスを作成する。
38  /// @param[in] microseconds マイクロ秒数値。
39  /// @return 作成されたインスタンス。
40  static TimeSpan fromMicroseconds(value_type microseconds)
41  {
42  TimeSpan result = { microseconds };
43  return result;
44  }
45 
46  /// @brief ミリ秒数値からインスタンスを作成する。
47  /// @param[in] milliseconds ミリ秒数値。
48  /// @return 作成されたインスタンス。
49  /// @see tryFromMilliseconds
50  ///
51  /// @exception Exception
52  /// マイクロ秒数値に変換した値が表現可能範囲に収まらない場合。
53  static TimeSpan fromMilliseconds(value_type milliseconds)
54  {
55  return multiply(fromMicroseconds(milliseconds), static_cast<value_type>(1000));
56  }
57 
58  /// @brief ミリ秒数値からインスタンスを作成する。
59  /// @param[in] milliseconds ミリ秒数値。
60  /// @param[out] result 作成されたインスタンスの設定先。
61  /// @retval true 作成に成功した場合。
62  /// @retval false マイクロ秒数値に変換した値が表現可能範囲に収まらない場合。
63  /// @see fromMilliseconds
64  static bool tryFromMilliseconds(value_type milliseconds, TimeSpan& result)
65  {
66  return
68  fromMicroseconds(milliseconds),
69  static_cast<value_type>(1000),
70  result);
71  }
72 
73  /// @brief 秒数値からインスタンスを作成する。
74  /// @param[in] seconds 秒数値。
75  /// @return 作成されたインスタンス。
76  /// @see tryFromSeconds
77  ///
78  /// @exception Exception
79  /// マイクロ秒数値に変換した値が表現可能範囲に収まらない場合。
80  static TimeSpan fromSeconds(value_type seconds)
81  {
82  return
83  multiply(
84  fromMicroseconds(seconds),
85  static_cast<value_type>(1000) * 1000);
86  }
87 
88  /// @brief 秒数値からインスタンスを作成する。
89  /// @param[in] seconds 秒数値。
90  /// @param[out] result 作成されたインスタンスの設定先。
91  /// @retval true 作成に成功した場合。
92  /// @retval false マイクロ秒数値に変換した値が表現可能範囲に収まらない場合。
93  /// @see fromSeconds
94  static bool tryFromSeconds(value_type seconds, TimeSpan& result)
95  {
96  return
98  fromMicroseconds(seconds),
99  static_cast<value_type>(1000) * 1000,
100  result);
101  }
102 
103  /// @brief 分数値からインスタンスを作成する。
104  /// @param[in] minutes 分数値。
105  /// @return 作成されたインスタンス。
106  /// @see tryFromMinutes
107  ///
108  /// @exception Exception
109  /// マイクロ秒数値に変換した値が表現可能範囲に収まらない場合。
110  static TimeSpan fromMinutes(value_type minutes)
111  {
112  return
113  multiply(
114  fromMicroseconds(minutes),
115  static_cast<value_type>(1000) * 1000 * 60);
116  }
117 
118  /// @brief 分数値からインスタンスを作成する。
119  /// @param[in] minutes 分数値。
120  /// @param[out] result 作成されたインスタンスの設定先。
121  /// @retval true 作成に成功した場合。
122  /// @retval false マイクロ秒数値に変換した値が表現可能範囲に収まらない場合。
123  /// @see fromMinutes
124  static bool tryFromMinutes(value_type minutes, TimeSpan& result)
125  {
126  return
127  tryMultiply(
128  fromMicroseconds(minutes),
129  static_cast<value_type>(1000) * 1000 * 60,
130  result);
131  }
132 
133  /// @brief 時数値からインスタンスを作成する。
134  /// @param[in] hours 時数値。
135  /// @return 作成されたインスタンス。
136  /// @see tryFromHours
137  ///
138  /// @exception Exception
139  /// マイクロ秒数値に変換した値が表現可能範囲に収まらない場合。
140  static TimeSpan fromHours(value_type hours)
141  {
142  return
143  multiply(
144  fromMicroseconds(hours),
145  static_cast<value_type>(1000) * 1000 * 60 * 60);
146  }
147 
148  /// @brief 時数値からインスタンスを作成する。
149  /// @param[in] hours 時数値。
150  /// @param[out] result 作成されたインスタンスの設定先。
151  /// @retval true 作成に成功した場合。
152  /// @retval false マイクロ秒数値に変換した値が表現可能範囲に収まらない場合。
153  /// @see fromHours
154  static bool tryFromHours(value_type hours, TimeSpan& result)
155  {
156  return
157  tryMultiply(
158  fromMicroseconds(hours),
159  static_cast<value_type>(1000) * 1000 * 60 * 60,
160  result);
161  }
162 
163  /// @brief 日数値からインスタンスを作成する。
164  /// @param[in] days 日数値。
165  /// @return 作成されたインスタンス。
166  /// @see tryFromDays
167  ///
168  /// @exception Exception
169  /// マイクロ秒数値に変換した値が表現可能範囲に収まらない場合。
170  static TimeSpan fromDays(value_type days)
171  {
172  return
173  multiply(
174  fromMicroseconds(days),
175  static_cast<value_type>(1000) * 1000 * 60 * 60 * 24);
176  }
177 
178  /// @brief 日数値からインスタンスを作成する。
179  /// @param[in] days 日数値。
180  /// @param[out] result 作成されたインスタンスの設定先。
181  /// @retval true 作成に成功した場合。
182  /// @retval false マイクロ秒数値に変換した値が表現可能範囲に収まらない場合。
183  /// @see fromDays
184  static bool tryFromDays(value_type days, TimeSpan& result)
185  {
186  return
187  tryMultiply(
188  fromMicroseconds(days),
189  static_cast<value_type>(1000) * 1000 * 60 * 60 * 24,
190  result);
191  }
192 
193  /// @brief 時間間隔値からインスタンスを作成する。
194  /// @tparam TCount 内部カウンタ値の表現型。
195  /// @tparam TPeriod 秒に対する割合を表す有理数型。
196  /// @param[in] duration 時間間隔値。
197  /// @return 作成されたインスタンス。
198  template<class TCount, class TPeriod>
199  static TimeSpan fromDuration(const std::chrono::duration<TCount, TPeriod>& duration)
200  {
201  return
203  std::chrono::duration_cast<std::chrono::microseconds>(duration).count());
204  }
205 
206  /// @brief ゼロ値のインスタンスを作成する。
207  /// @return 作成されたインスタンス。
208  static TimeSpan zero()
209  {
210  TimeSpan result = { 0 };
211  return result;
212  }
213 
214  /// @brief 表現可能な最小値を持つインスタンスを作成する。
215  /// @return 作成されたインスタンス。
216  static TimeSpan min()
217  {
218  return fromMicroseconds(std::numeric_limits<value_type>::min());
219  }
220 
221  /// @brief 表現可能な最大値を持つインスタンスを作成する。
222  /// @return 作成されたインスタンス。
223  static TimeSpan max()
224  {
225  return fromMicroseconds(std::numeric_limits<value_type>::max());
226  }
227 
228  /// @brief 経過時間の計算に利用できるクロック時間からインスタンスを作成する。
229  /// @param[in] forceStdClock 必ず標準関数 std::clock を用いるならば true 。
230  /// @return 作成されたインスタンス。 0 より大きい内部値を持つ。
231  /// @see #tryClock, Clock
232  ///
233  /// @exception Exception
234  /// 内部で乗算した値が表現可能範囲に収まらない場合。
235  ///
236  /// 返される時間値そのものに意味はない。
237  /// この関数で得た2値の差分によって経過時間を求める目的で用いる。
238  ///
239  /// Windows環境かつ引数 forceStdClock に false を指定した場合、
240  /// 高分解能パフォーマンスカウンタが用いられる。
241  ///
242  /// 長期間の連続稼働により表現可能な上限値に達する場合がある。
243  /// 長期間稼働する可能性がある場合、この関数ではなく Clock クラスの利用を推奨する。
244  static TimeSpan clock(bool forceStdClock = false);
245 
246  /// @brief 経過時間の計算に利用できるクロック時間からインスタンスを作成する。
247  /// @param[out] result 作成されたインスタンスの設定先。 0 より大きい内部値を持つ。
248  /// @param[in] forceStdClock 必ず標準関数 std::clock を用いるならば true 。
249  /// @retval true 作成に成功した場合。
250  /// @retval false 内部で乗算した値が表現可能範囲に収まらない場合。
251  /// @see #clock, Clock
252  ///
253  /// 返される時間値そのものに意味はない。
254  /// この関数で得た2値の差分によって経過時間を求める目的で用いる。
255  ///
256  /// Windows環境かつ引数 forceStdClock に false を指定した場合、
257  /// 高分解能パフォーマンスカウンタが用いられる。
258  ///
259  /// 長期間の連続稼働により表現可能な上限値に達する場合がある。
260  /// 長期間稼働する可能性がある場合、この関数ではなく Clock クラスの利用を推奨する。
261  static bool tryClock(TimeSpan& result, bool forceStdClock = false);
262 
263  /// @brief TimeSpan 値の符号を反転させた値を算出する。
264  /// @param[in] span 演算対象。
265  /// @return span の符号を反転させた値。
266  static TimeSpan negate(const TimeSpan& span)
267  {
268  return fromMicroseconds(-span.value);
269  }
270 
271  /// @brief TimeSpan 値の絶対値を算出する。
272  /// @param[in] span 演算対象。
273  /// @return span の絶対値。
274  static TimeSpan abs(const TimeSpan& span)
275  {
276  return span.isMinus() ? negate(span) : span;
277  }
278 
279  /// @brief 2つの TimeSpan 値を加算する。
280  /// @param[in] span1 加算対象1。
281  /// @param[in] span2 加算対象2。
282  /// @return 加算結果値。
283  /// @see tryAdd
284  ///
285  /// @exception Exception
286  /// 演算結果値が表現可能範囲に収まらない場合。
287  static TimeSpan add(const TimeSpan& span1, const TimeSpan& span2);
288 
289  /// @brief 2つの TimeSpan 値を加算する。
290  /// @param[in] span1 加算対象1。
291  /// @param[in] span2 加算対象2。
292  /// @param[out] result 加算結果値の設定先。
293  /// @retval true 加算できた場合。
294  /// @retval false 演算結果値が表現可能範囲に収まらない場合。
295  /// @see add
296  static bool tryAdd(const TimeSpan& span1, const TimeSpan& span2, TimeSpan& result);
297 
298  /// @brief TimeSpan 値から別の TimeSpan 値を減算する。
299  /// @param[in] span1 減算対象。
300  /// @param[in] span2 減算量。
301  /// @return 減算結果値。
302  /// @see trySubtract
303  ///
304  /// @exception Exception
305  /// 演算結果値が表現可能範囲に収まらない場合。
306  static TimeSpan subtract(const TimeSpan& span1, const TimeSpan& span2);
307 
308  /// @brief TimeSpan 値から別の TimeSpan 値を減算する。
309  /// @param[in] span1 減算対象。
310  /// @param[in] span2 減算量。
311  /// @param[out] result 減算結果値の設定先。
312  /// @retval true 減算できた場合。
313  /// @retval false 演算結果値が表現可能範囲に収まらない場合。
314  /// @see subtract
315  static bool trySubtract(
316  const TimeSpan& span1,
317  const TimeSpan& span2,
318  TimeSpan& result);
319 
320  /// @brief TimeSpan 値に整数値を乗算する。
321  /// @param[in] span 乗算対象。
322  /// @param[in] value 乗算値。
323  /// @return 乗算結果値。
324  /// @see tryMultiply
325  ///
326  /// @exception Exception
327  /// 演算結果値が表現可能範囲に収まらない場合。
328  static TimeSpan multiply(const TimeSpan& span, value_type value);
329 
330  /// @brief TimeSpan 値に整数値を乗算する。
331  /// @param[in] span 乗算対象。
332  /// @param[in] value 乗算値。
333  /// @param[out] result 乗算結果値の設定先。
334  /// @retval true 乗算できた場合。
335  /// @retval false 演算結果値が表現可能範囲に収まらない場合。
336  /// @see multiply
337  static bool tryMultiply(const TimeSpan& span, value_type value, TimeSpan& result);
338 
339  /// @brief TimeSpan 値を整数値で除算する。
340  /// @param[in] span 除算対象。
341  /// @param[in] value 除算値。
342  /// @return 除算結果値。
343  ///
344  /// @exception Exception
345  /// 引数 value に 0 を指定した場合。
346  static TimeSpan divide(const TimeSpan& span, value_type value);
347 
348  /// @brief マイクロ秒数値に変換する。
349  /// @return マイクロ秒数値。
350  value_type toMicroseconds() const
351  {
352  return value;
353  }
354 
355  /// @brief ミリ秒数値に変換する。
356  /// @return ミリ秒数値。ミリ秒数未満の値は切り捨てられる。
357  value_type toMilliseconds() const
358  {
359  return value / static_cast<value_type>(1000);
360  }
361 
362  /// @brief 秒数値に変換する。
363  /// @return 秒数値。秒数未満の値は切り捨てられる。
364  value_type toSeconds() const
365  {
366  return value / (static_cast<value_type>(1000) * 1000);
367  }
368 
369  /// @brief 分数値に変換する。
370  /// @return 分数値。分数未満の値は切り捨てられる。
371  value_type toMinutes() const
372  {
373  return value / (static_cast<value_type>(1000) * 1000 * 60);
374  }
375 
376  /// @brief 時数値に変換する。
377  /// @return 時数値。時数未満の値は切り捨てられる。
378  value_type toHours() const
379  {
380  return value / (static_cast<value_type>(1000) * 1000 * 60 * 60);
381  }
382 
383  /// @brief 日数値に変換する。
384  /// @return 日数値。日数未満の値は切り捨てられる。
385  value_type toDays() const
386  {
387  return value / (static_cast<value_type>(1000) * 1000 * 60 * 60 * 24);
388  }
389 
390  /// @brief 時間間隔値に変換する。
391  /// @return 時間間隔値。
392  std::chrono::microseconds toDuration() const
393  {
394  return std::chrono::microseconds(toMicroseconds());
395  }
396 
397  /// @brief マイクロ秒数パート値を取得する。
398  /// @return マイクロ秒数パート値。常に正数を返す。
399  value_type getPartOfMicroseconds() const
400  {
401  return abs(*this).toMicroseconds() % 1000;
402  }
403 
404  /// @brief ミリ秒数パート値を取得する。
405  /// @return ミリ秒数パート値。常に正数を返す。
406  value_type getPartOfMilliseconds() const
407  {
408  return abs(*this).toMilliseconds() % 1000;
409  }
410 
411  /// @brief 秒数パート値を取得する。
412  /// @return 秒数パート値。常に正数を返す。
413  value_type getPartOfSeconds() const
414  {
415  return abs(*this).toSeconds() % 60;
416  }
417 
418  /// @brief 分数パート値を取得する。
419  /// @return 分数パート値。常に正数を返す。
420  value_type getPartOfMinutes() const
421  {
422  return abs(*this).toMinutes() % 60;
423  }
424 
425  /// @brief 時数パート値を取得する。
426  /// @return 時数パート値。常に正数を返す。
427  value_type getPartOfHours() const
428  {
429  return abs(*this).toHours() % 24;
430  }
431 
432  /// @brief 日数パート値を取得する。
433  /// @return 日数パート値。常に正数を返す。
434  value_type getPartOfDays() const
435  {
436  return abs(*this).toDays();
437  }
438 
439  /// @brief ゼロ値であるか否かを取得する。
440  /// @retval true 内部値が 0 である場合。
441  /// @retval false 内部値が 0 以外である場合。
442  bool isZero() const
443  {
444  return (value == 0);
445  }
446 
447  /// @brief 負数であるか否かを取得する。
448  /// @retval true 内部値が 0 未満である場合。
449  /// @retval false 内部値が 0 以上である場合。
450  bool isMinus() const
451  {
452  return (value < 0);
453  }
454 
455  /// @brief パート分割された時間間隔値を取得する。
456  /// @param[out] days 日数パートの設定先。取得しないならば nullptr 。
457  /// @param[out] hours 時数パートの設定先。取得しないならば nullptr 。
458  /// @param[out] minutes 分数パートの設定先。取得しないならば nullptr 。
459  /// @param[out] seconds 秒数パートの設定先。取得しないならば nullptr 。
460  /// @param[out] milliseconds ミリ秒数パートの設定先。取得しないならば nullptr 。
461  /// @param[out] microseconds マイクロ秒数パートの設定先。取得しないならば nullptr 。
462  ///
463  /// 特定のパートに nullptr を指定した場合、非 nullptr を指定したパートに
464  /// nullptr を指定したパート分の値も加算される。
465  ///
466  /// 例えば引数 hours (時数パート)と引数 seconds (秒数パート)のみに非 nullptr を
467  /// 指定した場合、次のように格納される。
468  ///
469  /// - ミリ秒数パート以下の値は切り捨てられる。
470  /// - 引数 seconds のポインタ先には 0 以上 3599 以下の値が格納される。
471  /// 即ち分数パート値を 60 倍した値が本来の秒数パート値に加算される。
472  /// - 引数 hours のポインタ先には時数以上のすべての値の合算値が格納される。
473  /// 即ち日数パート値を 24 倍した値が本来の時数パート値に加算される。
474  void toParts(
475  value_type* days,
476  value_type* hours = nullptr,
477  value_type* minutes = nullptr,
478  value_type* seconds = nullptr,
479  value_type* milliseconds = nullptr,
480  value_type* microseconds = nullptr) const;
481 
482  /// @brief 文字列表現値を作成する。
483  /// @param[in] format フォーマット文字列。
484  /// @return 文字列表現値。
485  ///
486  /// 引数 format には下記のフォーマット文字列と任意の文字列の組み合わせを指定する。
487  /// 大文字と小文字は区別されることに注意。
488  ///
489  /// - "%d" -- 日数パート値。
490  /// - "%h" -- 時数パート値。
491  /// - "%m" -- 分数パート値。
492  /// - "%s" -- 秒数パート値。
493  /// - "%i" -- ミリ秒数パート値。
494  /// - "%u" -- マイクロ秒数パート値。
495  /// - "%+" -- 負数の場合は文字 '-' 、正数あるいはゼロ値の場合は文字 '+' 。
496  /// - "%-" -- 負数の場合は文字 '-' 、正数あるいはゼロ値の場合は空文字列。
497  /// - "%v" -- value 値そのもの。負数の場合は頭に '-' が付く。
498  /// - "%V" -- value の絶対値。
499  /// - "%%" -- 文字 '%' 。
500  ///
501  /// 数値を表すフォーマット文字列は、1文字目の '%' の直後に幅指定を行う事ができる。
502  /// 幅指定は「数字」か、「文字 '0' + 数字」の形式で指定でき、例えば次のようになる。
503  ///
504  /// - "%4s" -- 最小4文字幅になるよう先頭に空白文字が付与される。
505  /// - "%04s" -- 最小4文字幅になるよう先頭に文字 '0' が付与される。
506  ///
507  /// フォーマット文字列中に特定のパートが存在しない場合、
508  /// 存在するパートに存在しないパート分の値も加算して文字列化される。
509  /// "%+", "%-", "%v", "%V", "%%" はこの処理には関与しない。
510  ///
511  /// 例えば "%h%s" のように時数パートと秒数パートのみから構成される
512  /// フォーマット文字列を指定した場合、次のように文字列化される。
513  ///
514  /// - ミリ秒数パート以下の値は挿入されない。
515  /// - "%s" 部分には 0 以上 3599 以下の値が文字列化されて挿入される。
516  /// 即ち分数パート値を 60 倍した値が本来の秒数パート値に加算される。
517  /// これはフォーマット文字列中に分数パートが存在しないためである。
518  /// - "%h" 部分には時数以上のすべての値の合算値が文字列化されて挿入される。
519  /// 即ち日数パート値を 24 倍した値が本来の時数パート値に加算される。
520  /// これはフォーマット文字列中に日数パートが存在しないためである。
521  ///
522  /// 引数 format に nullptr を指定した場合、 "%v" を指定したものとして扱う。
523  std::wstring toString(const wchar_t* format = nullptr) const;
524 
525  /// @brief 加算代入演算子のオーバロード。
526  /// @param[in] r 右辺値。
527  /// @return 自身の参照。
528  ///
529  /// @exception Exception
530  /// 演算結果値が表現可能範囲に収まらない場合。
532  {
533  return (*this = add(*this, r));
534  }
535 
536  /// @brief 減算代入演算子のオーバロード。
537  /// @param[in] r 右辺値。
538  /// @return 自身の参照。
539  ///
540  /// @exception Exception
541  /// 演算結果値が表現可能範囲に収まらない場合。
543  {
544  return (*this = subtract(*this, r));
545  }
546  };
547 
548 /// @}
549 
550  //--------------------
551  // インライン関数定義
552  //--------------------
553 
554  /// @brief 単項プラス演算子のオーバロード。
555  /// @param[in] u 単項値。
556  /// @return u の値そのもの。
557  /// @relatesalso TimeSpan
558  inline TimeSpan operator+(const TimeSpan& u)
559  {
560  return u;
561  }
562 
563  /// @brief 単項マイナス演算子のオーバロード。
564  /// @param[in] u 単項値。
565  /// @return u の符号を反転させた値。
566  /// @relatesalso TimeSpan
567  inline TimeSpan operator-(const TimeSpan& u)
568  {
569  return TimeSpan::negate(u);
570  }
571 
572  /// @brief 加算演算子のオーバロード。
573  /// @param[in] l 左辺値。
574  /// @param[in] r 右辺値。
575  /// @return 演算結果値。
576  /// @relatesalso TimeSpan
577  ///
578  /// @exception Exception
579  /// 演算結果値が表現可能範囲に収まらない場合。
580  inline TimeSpan operator+(const TimeSpan& l, const TimeSpan& r)
581  {
582  return TimeSpan::add(l, r);
583  }
584 
585  /// @brief 減算演算子のオーバロード。
586  /// @param[in] l 左辺値。
587  /// @param[in] r 右辺値。
588  /// @return 演算結果値。
589  /// @relatesalso TimeSpan
590  ///
591  /// @exception Exception
592  /// 演算結果値が表現可能範囲に収まらない場合。
593  inline TimeSpan operator-(const TimeSpan& l, const TimeSpan& r)
594  {
595  return TimeSpan::subtract(l, r);
596  }
597 
598  /// @brief 等価比較演算子のオーバロード。
599  /// @param[in] l 左辺値。
600  /// @param[in] r 右辺値。
601  /// @return 比較結果値。
602  /// @relatesalso TimeSpan
603  inline bool operator==(const TimeSpan& l, const TimeSpan& r)
604  {
605  return (l.value == r.value);
606  }
607 
608  /// @brief 非等価比較演算子のオーバロード。
609  /// @param[in] l 左辺値。
610  /// @param[in] r 右辺値。
611  /// @return 比較結果値。
612  /// @relatesalso TimeSpan
613  inline bool operator!=(const TimeSpan& l, const TimeSpan& r)
614  {
615  return !(l == r);
616  }
617 
618  /// @brief 小なり比較演算子のオーバロード。
619  /// @param[in] l 左辺値。
620  /// @param[in] r 右辺値。
621  /// @return 比較結果値。
622  /// @relatesalso TimeSpan
623  inline bool operator<(const TimeSpan& l, const TimeSpan& r)
624  {
625  return (l.value < r.value);
626  }
627 
628  /// @brief 大なり比較演算子のオーバロード。
629  /// @param[in] l 左辺値。
630  /// @param[in] r 右辺値。
631  /// @return 比較結果値。
632  /// @relatesalso TimeSpan
633  inline bool operator>(const TimeSpan& l, const TimeSpan& r)
634  {
635  return (r < l);
636  }
637 
638  /// @brief 小なり等価比較演算子のオーバロード。
639  /// @param[in] l 左辺値。
640  /// @param[in] r 右辺値。
641  /// @return 比較結果値。
642  /// @relatesalso TimeSpan
643  inline bool operator<=(const TimeSpan& l, const TimeSpan& r)
644  {
645  return !(r < l);
646  }
647 
648  /// @brief 大なり等価比較演算子のオーバロード。
649  /// @param[in] l 左辺値。
650  /// @param[in] r 右辺値。
651  /// @return 比較結果値。
652  /// @relatesalso TimeSpan
653  inline bool operator>=(const TimeSpan& l, const TimeSpan& r)
654  {
655  return !(l < r);
656  }
657 } // namespace util
658 } // namespace amdaemon
659 
660 #endif // AMDAEMON_UTIL_TIMESPAN_H
static bool tryMultiply(const TimeSpan &span, value_type value, TimeSpan &result)
TimeSpan 値に整数値を乗算する。
bool operator<=(const TimeSpan &l, const TimeSpan &r)
小なり等価比較演算子のオーバロード。
Definition: TimeSpan.h:643
static TimeSpan zero()
ゼロ値のインスタンスを作成する。
Definition: TimeSpan.h:208
bool isMinus() const
負数であるか否かを取得する。
Definition: TimeSpan.h:450
static TimeSpan min()
表現可能な最小値を持つインスタンスを作成する。
Definition: TimeSpan.h:216
static TimeSpan fromSeconds(value_type seconds)
秒数値からインスタンスを作成する。
Definition: TimeSpan.h:80
static bool tryAdd(const TimeSpan &span1, const TimeSpan &span2, TimeSpan &result)
2つの TimeSpan 値を加算する。
TimeSpan & operator-=(const TimeSpan &r)
減算代入演算子のオーバロード。
Definition: TimeSpan.h:542
static bool tryFromMinutes(value_type minutes, TimeSpan &result)
分数値からインスタンスを作成する。
Definition: TimeSpan.h:124
Daemonライブラリの環境定義を行うヘッダ。
value_type toMicroseconds() const
マイクロ秒数値に変換する。
Definition: TimeSpan.h:350
static TimeSpan fromMinutes(value_type minutes)
分数値からインスタンスを作成する。
Definition: TimeSpan.h:110
value_type getPartOfMicroseconds() const
マイクロ秒数パート値を取得する。
Definition: TimeSpan.h:399
static TimeSpan negate(const TimeSpan &span)
TimeSpan 値の符号を反転させた値を算出する。
Definition: TimeSpan.h:266
AM Daemon ライブラリクラス群の基底名前空間。
Definition: Log.h:13
static bool trySubtract(const TimeSpan &span1, const TimeSpan &span2, TimeSpan &result)
TimeSpan 値から別の TimeSpan 値を減算する。
TimeSpan operator+(const TimeSpan &u)
単項プラス演算子のオーバロード。
Definition: TimeSpan.h:558
static bool tryFromDays(value_type days, TimeSpan &result)
日数値からインスタンスを作成する。
Definition: TimeSpan.h:184
value_type getPartOfMilliseconds() const
ミリ秒数パート値を取得する。
Definition: TimeSpan.h:406
std::int64_t value_type
内部値の表現型。
Definition: TimeSpan.h:32
bool operator>=(const TimeSpan &l, const TimeSpan &r)
大なり等価比較演算子のオーバロード。
Definition: TimeSpan.h:653
static TimeSpan add(const TimeSpan &span1, const TimeSpan &span2)
2つの TimeSpan 値を加算する。
static TimeSpan multiply(const TimeSpan &span, value_type value)
TimeSpan 値に整数値を乗算する。
value_type value
マイクロ秒数値。
Definition: TimeSpan.h:35
bool operator<(const TimeSpan &l, const TimeSpan &r)
小なり比較演算子のオーバロード。
Definition: TimeSpan.h:623
bool operator>(const TimeSpan &l, const TimeSpan &r)
大なり比較演算子のオーバロード。
Definition: TimeSpan.h:633
static bool tryFromSeconds(value_type seconds, TimeSpan &result)
秒数値からインスタンスを作成する。
Definition: TimeSpan.h:94
std::wstring toString(const wchar_t *format=nullptr) const
文字列表現値を作成する。
static TimeSpan fromHours(value_type hours)
時数値からインスタンスを作成する。
Definition: TimeSpan.h:140
std::chrono::microseconds toDuration() const
時間間隔値に変換する。
Definition: TimeSpan.h:392
static TimeSpan max()
表現可能な最大値を持つインスタンスを作成する。
Definition: TimeSpan.h:223
void toParts(value_type *days, value_type *hours=nullptr, value_type *minutes=nullptr, value_type *seconds=nullptr, value_type *milliseconds=nullptr, value_type *microseconds=nullptr) const
パート分割された時間間隔値を取得する。
value_type getPartOfSeconds() const
秒数パート値を取得する。
Definition: TimeSpan.h:413
static bool tryClock(TimeSpan &result, bool forceStdClock=false)
経過時間の計算に利用できるクロック時間からインスタンスを作成する。
static TimeSpan divide(const TimeSpan &span, value_type value)
TimeSpan 値を整数値で除算する。
value_type toHours() const
時数値に変換する。
Definition: TimeSpan.h:378
static TimeSpan abs(const TimeSpan &span)
TimeSpan 値の絶対値を算出する。
Definition: TimeSpan.h:274
static TimeSpan fromMilliseconds(value_type milliseconds)
ミリ秒数値からインスタンスを作成する。
Definition: TimeSpan.h:53
value_type toMilliseconds() const
ミリ秒数値に変換する。
Definition: TimeSpan.h:357
value_type toMinutes() const
分数値に変換する。
Definition: TimeSpan.h:371
static bool tryFromHours(value_type hours, TimeSpan &result)
時数値からインスタンスを作成する。
Definition: TimeSpan.h:154
value_type getPartOfDays() const
日数パート値を取得する。
Definition: TimeSpan.h:434
bool isZero() const
ゼロ値であるか否かを取得する。
Definition: TimeSpan.h:442
value_type getPartOfMinutes() const
分数パート値を取得する。
Definition: TimeSpan.h:420
static TimeSpan clock(bool forceStdClock=false)
経過時間の計算に利用できるクロック時間からインスタンスを作成する。
bool operator==(const TimeSpan &l, const TimeSpan &r)
等価比較演算子のオーバロード。
Definition: TimeSpan.h:603
static TimeSpan fromDuration(const std::chrono::duration< TCount, TPeriod > &duration)
時間間隔値からインスタンスを作成する。
Definition: TimeSpan.h:199
TimeSpan & operator+=(const TimeSpan &r)
加算代入演算子のオーバロード。
Definition: TimeSpan.h:531
value_type toSeconds() const
秒数値に変換する。
Definition: TimeSpan.h:364
value_type toDays() const
日数値に変換する。
Definition: TimeSpan.h:385
static bool tryFromMilliseconds(value_type milliseconds, TimeSpan &result)
ミリ秒数値からインスタンスを作成する。
Definition: TimeSpan.h:64
TimeSpan operator-(const TimeSpan &u)
単項マイナス演算子のオーバロード。
Definition: TimeSpan.h:567
static TimeSpan fromMicroseconds(value_type microseconds)
マイクロ秒数値からインスタンスを作成する。
Definition: TimeSpan.h:40
bool operator!=(const TimeSpan &l, const TimeSpan &r)
非等価比較演算子のオーバロード。
Definition: TimeSpan.h:613
static TimeSpan fromDays(value_type days)
日数値からインスタンスを作成する。
Definition: TimeSpan.h:170
マイクロ秒精度の時間間隔を表す構造体。
Definition: TimeSpan.h:29
static TimeSpan subtract(const TimeSpan &span1, const TimeSpan &span2)
TimeSpan 値から別の TimeSpan 値を減算する。
value_type getPartOfHours() const
時数パート値を取得する。
Definition: TimeSpan.h:427