AM Daemon ライブラリリファレンス
Clock.h
[詳解]
1 /// @file
2 /// @brief クロックカウント値とその時間差分計算処理を提供するクラス Clock のヘッダ。
3 ///
4 /// Copyright(C)SEGA
5 
6 #ifndef AMDAEMON_UTIL_CLOCK_H
7 #define AMDAEMON_UTIL_CLOCK_H
8 
9 #include "amdaemon/env.h"
10 #include "amdaemon/util/TimeSpan.h"
11 
12 #include <functional>
13 #include <cstdint>
14 
15 namespace amdaemon
16 {
17 namespace util
18 {
19 /// @addtogroup g_util
20 /// @{
21 
22  /// クロックカウント値とその時間差分計算処理を提供するクラス。
23  class Clock
24  {
25  public:
26  // 前方宣言
27  struct FailMessageHolder;
28 
29  /// 内部値の表現型。
30  typedef std::int64_t value_type;
31 
32  /// @brief コンストラクタ。
33  ///
34  /// Windows環境である場合、高分解能パフォーマンスカウンタが用いられる。
35  Clock();
36 
37  /// @brief コンストラクタ。
38  /// @param[in] forceStdClock 必ず標準関数 std::clock を用いるならば true 。
39  ///
40  /// Windows環境かつ引数 forceStdClock に false を指定した場合、
41  /// 高分解能パフォーマンスカウンタが用いられる。
42  explicit Clock(bool forceStdClock);
43 
44  // 下記は暗黙の定義を用いる。
45  //Clock(Clock&) = default;
46  //‾Clock() = default;
47  //Clock& operator=(Clock&) = default;
48 
49  /// @brief 現在のクロックカウント値を取得する。
50  /// @return 現在のクロックカウント値。
51  ///
52  /// @exception Exception
53  /// 取得処理に失敗した場合。通常、失敗することはない。
54  value_type get() const;
55 
56  /// @brief 現在のクロックカウント値を取得する。
57  /// @param[out] result 現在のクロックカウント値の設定先。
58  /// @retval true 取得処理に成功した場合。
59  /// @retval false 取得処理に失敗した場合。
60  ///
61  /// 通常、メンバ関数 #get が失敗することはないため、敢えてこの関数を使う必要はない。
62  bool tryGet(value_type& result) const;
63 
64  /// @brief 1秒あたりのクロックカウント数を取得する。
65  /// @return 1秒あたりのクロックカウント数。
66  value_type getCountPerSecond() const
67  {
68  return _countPerSecond;
69  }
70 
71  /// @brief クロックカウントの現在値と前回値との時間差分を TimeSpan 値と比較する。
72  /// @param[in] prevCount クロックカウントの前回値。
73  /// @param[in] span 比較対象の TimeSpan 値。
74  /// @retval -1 TimeSpan 値の方が大きい場合。
75  /// @retval 0 TimeSpan 値と等しい場合。
76  /// @retval +1 TimeSpan 値の方が小さい場合。
77  ///
78  /// @exception Exception
79  /// 現在値の取得処理に失敗した場合。通常、失敗することはない。
80  ///
81  /// 現在値はメンバ関数 #get によって取得される。
82  ///
83  /// 現在値と前回値との時間差分が
84  /// TimeSpan 値として表せない範囲であっても大小比較することができる。
85  int compareSpan(value_type prevCount, const TimeSpan& span) const;
86 
87  /// @brief クロックカウントの現在値と前回値との時間差分を TimeSpan 値と比較する。
88  /// @param[in] currentCount クロックカウントの現在値。
89  /// @param[in] prevCount クロックカウントの前回値。
90  /// @param[in] span 比較対象の TimeSpan 値。
91  /// @retval -1 TimeSpan 値の方が大きい場合。
92  /// @retval 0 TimeSpan 値と等しい場合。
93  /// @retval +1 TimeSpan 値の方が小さい場合。
94  ///
95  /// 現在値と前回値との時間差分が
96  /// TimeSpan 値として表せない範囲であっても大小比較することができる。
97  int compareSpan(
98  value_type currentCount,
99  value_type prevCount,
100  const TimeSpan& span) const;
101 
102  /// @brief クロックカウントの現在値と前回値との時間差分値を算出する。
103  /// @param[in] prevCount クロックカウントの前回値。
104  /// @return 時間差分値。
105  ///
106  /// @exception Exception
107  /// - 現在値の取得処理に失敗した場合。通常、失敗することはない。
108  /// - 時間差分値に変換した値が表現可能範囲に収まらない場合。
109  ///
110  /// 他の TimeSpan 値との比較を行いたいだけの場合、メンバ関数
111  /// compareSpan(value_type, const TimeSpan&) const
112  /// の利用を推奨する。
113  ///
114  /// 現在値はメンバ関数 #get によって取得される。
115  ///
116  /// Windows環境で高分解能パフォーマンスカウンタを用いている場合、
117  /// 環境によっては31日強の差分で表現可能な上限値に達する。
118  TimeSpan calcSpan(value_type prevCount) const;
119 
120  /// @brief クロックカウントの現在値と前回値との時間差分値を算出する。
121  /// @param[in] currentCount クロックカウントの現在値。
122  /// @param[in] prevCount クロックカウントの前回値。
123  /// @return 時間差分値。
124  ///
125  /// @exception Exception
126  /// 時間差分値に変換した値が表現可能範囲に収まらない場合。
127  ///
128  /// 他の TimeSpan 値との比較を行いたいだけの場合、メンバ関数
129  /// compareSpan(value_type, value_type, const TimeSpan&) const
130  /// の利用を推奨する。
131  ///
132  /// Windows環境で高分解能パフォーマンスカウンタを用いている場合、
133  /// 環境によっては31日強の差分で表現可能な上限値に達する。
134  TimeSpan calcSpan(value_type currentCount, value_type prevCount) const;
135 
136  /// @brief クロックカウントの現在値と前回値との時間差分値を算出する。
137  /// @param[in] prevCount クロックカウントの前回値。
138  /// @param[out] result 時間差分値の設定先。
139  /// @retval true 算出に成功した場合。
140  /// @retval false 時間差分値に変換した値が表現可能範囲に収まらない場合。
141  ///
142  /// 他の TimeSpan 値との比較を行いたいだけの場合、メンバ関数
143  /// compareSpan(value_type, const TimeSpan&) const
144  /// の利用を推奨する。
145  ///
146  /// 現在値はメンバ関数 #tryGet によって取得される。
147  ///
148  /// Windows環境で高分解能パフォーマンスカウンタを用いている場合、
149  /// 環境によっては31日強の差分で表現可能な上限値に達する。
150  bool tryCalcSpan(value_type prevCount, TimeSpan& result) const;
151 
152  /// @brief クロックカウントの現在値と前回値との時間差分値を算出する。
153  /// @param[in] currentCount クロックカウントの現在値。
154  /// @param[in] prevCount クロックカウントの前回値。
155  /// @param[out] result 時間差分値の設定先。
156  /// @retval true 算出に成功した場合。
157  /// @retval false 時間差分値に変換した値が表現可能範囲に収まらない場合。
158  ///
159  /// 他の TimeSpan 値との比較を行いたいだけの場合、メンバ関数
160  /// compareSpan(value_type, value_type, const TimeSpan&) const
161  /// の利用を推奨する。
162  ///
163  /// Windows環境で高分解能パフォーマンスカウンタを用いている場合、
164  /// 環境によっては31日強の差分で表現可能な上限値に達する。
165  bool tryCalcSpan(
166  value_type currentCount,
167  value_type prevCount,
168  TimeSpan& result) const;
169 
170  private:
171  /// クロックカウント値取得関数。
172  std::function<bool (value_type&, FailMessageHolder*)> _getter;
173 
174  value_type _countPerSecond; ///< 1秒あたりのクロックカウント数。
175  };
176 
177 /// @}
178 } // namespace util
179 } // namespace amdaemon
180 
181 #endif // AMDAEMON_UTIL_CLOCK_H
std::int64_t value_type
内部値の表現型。
Definition: Clock.h:27
bool tryCalcSpan(value_type prevCount, TimeSpan &result) const
クロックカウントの現在値と前回値との時間差分値を算出する。
Clock()
コンストラクタ。
Daemonライブラリの環境定義を行うヘッダ。
クロックカウント値とその時間差分計算処理を提供するクラス。
Definition: Clock.h:23
AM Daemon ライブラリクラス群の基底名前空間。
Definition: Log.h:13
TimeSpan calcSpan(value_type prevCount) const
クロックカウントの現在値と前回値との時間差分値を算出する。
value_type getCountPerSecond() const
1秒あたりのクロックカウント数を取得する。
Definition: Clock.h:66
int compareSpan(value_type prevCount, const TimeSpan &span) const
クロックカウントの現在値と前回値との時間差分を TimeSpan 値と比較する。
bool tryGet(value_type &result) const
現在のクロックカウント値を取得する。
マイクロ秒精度の時間間隔を表す構造体 TimeSpan のヘッダ。
マイクロ秒精度の時間間隔を表す構造体。
Definition: TimeSpan.h:29