AM Daemon ライブラリリファレンス
AccessCode.h
[詳解]
1 /// @file
2 /// @brief アクセスコード値構造体 AccessCode のヘッダ。
3 ///
4 /// Copyright(C)SEGA
5 
6 #ifndef AMDAEMON_ACCESSCODE_H
7 #define AMDAEMON_ACCESSCODE_H
8 
9 #include "amdaemon/env.h"
11 
12 #include <string>
13 #include <cstdint>
14 #include <cstddef>
15 #include <cstring>
16 
17 namespace amdaemon
18 {
19 /// @addtogroup g_aime
20 /// @{
21 
22  //--------------------
23  // AccessCode 構造体定義
24  //--------------------
25 
26  /// @brief アクセスコード値構造体。
27  /// @note memcpy 可能。
28  ///
29  /// AiMeLibの AiMeDef::AccessCode 構造体とバイナリ互換である。
30  ///
31  /// @internal ライブラリ実装メモ: この型を直接共有メモリに配置する。
32  struct AccessCode
33  {
34  /// 桁数。
35  static const std::size_t DigitCount = 20;
36 
37  /// BCD形式データサイズ。
38  static const std::size_t Size = (DigitCount + 1) / 2;
39 
40  /// 内部値。4ビットごとに1桁を表すBCD形式データ。AiMeLib互換。
41  std::uint8_t values[Size];
42 
43  /// @brief すべての桁が 0 であるアクセスコード値を取得する。
44  /// @return すべての桁が 0 であるアクセスコード値。
45  static const AccessCode& zero();
46 
47  /// @brief アクセスコード値を作成可能なBCD形式データであるか否かを調べる。
48  /// @param[in] values BCD形式データ。AiMeLib互換。
49  /// @retval true 作成可能である場合。
50  /// @retval false 作成不可能である場合。
51  /// @see make(const std::uint8_t (&)[Size])
52  ///
53  /// この関数が true を返す場合、同じ引数を静的メンバ関数
54  /// make(const std::uint8_t (&)[Size]) に渡すことで、
55  /// 例外を発生させることなくアクセスコード値を作成可能であることが保証される。
56  static bool canMake(const std::uint8_t (&values)[Size]);
57 
58  /// @brief BCD形式データからアクセスコード値を作成する。
59  /// @param[in] values BCD形式データ。AiMeLib互換。
60  /// @return 作成されたアクセスコード値。
61  /// @see canMake(const std::uint8_t (&)[Size])
62  ///
63  /// @exception Exception
64  /// 引数 values に不正な値を指定した場合。
65  static AccessCode make(const std::uint8_t (&values)[Size]);
66 
67  /// @brief アクセスコード値を作成可能なアクセスコード文字列であるか否かを調べる。
68  /// @param[in] src アクセスコード文字列。 "01031234567812345678" 等。
69  /// @param[in] separator
70  /// セパレータとして認識する文字列。既定の処理を行わせるならば nullptr 。
71  /// @retval true 作成可能である場合。
72  /// @retval false 作成不可能である場合。
73  /// @see make(const wchar_t*, const wchar_t*)
74  ///
75  /// この関数が true を返す場合、同じ引数を静的メンバ関数
76  /// make(const wchar_t*, const wchar_t*) に渡すことで、
77  /// 例外を発生させることなくアクセスコード値を作成可能であることが保証される。
78  static bool canMake(const wchar_t* src, const wchar_t* separator = nullptr);
79 
80  /// @brief アクセスコード文字列からアクセスコード値を作成する。
81  /// @param[in] src アクセスコード文字列。 "01031234567812345678" 等。
82  /// @param[in] separator
83  /// セパレータとして認識する文字列。既定の処理を行わせるならば nullptr 。
84  /// @return 作成されたアクセスコード値。
85  ///
86  /// @exception Exception
87  /// - 引数 src に nullptr を指定した場合。
88  /// - 引数 src に無効な文字が含まれる場合。
89  /// - 引数 src 内の数字個数が #DigitCount と等しくない場合。
90  ///
91  /// 引数 src 内の文字 '0' 〜 '9' を用いてアクセスコード値を作成する。
92  ///
93  /// 引数 separator の扱いは次の通り。
94  ///
95  /// - separator が既定値 nullptr である場合、半角スペースおよびタブ文字を無視する。
96  /// 先頭および末尾にある場合や、連続している場合も無視される。
97  /// - separator が空文字列である場合、数字以外のあらゆる文字は無効となる。
98  /// - separator が nullptr 以外かつ空文字列以外である場合、
99  /// 指定された文字列をセパレータとして認識する。
100  /// - 先頭および末尾に現れてはならない。
101  /// - 連続していてはならない。
102  /// - 上記要件を満たしていればセパレータの位置および個数は任意。
103  /// - セパレータ文字列に数字が含まれていてもセパレータの判定が優先される。
104  static AccessCode make(const wchar_t* src, const wchar_t* separator = nullptr);
105 
106  /// @brief 無効なアクセスコード値を作成する。
107  /// @return 無効なアクセスコード値。
108  static AccessCode makeInvalid();
109 
110  /// @brief 有効なアクセスコードであるか否かを取得する。
111  /// @retval true 有効なアクセスコードである場合。
112  /// @retval false 無効なアクセスコードである場合。
113  bool valid() const;
114 
115  /// @brief 指定した桁位置の数値を取得する。
116  /// @param[in] digitIndex 桁位置。先頭が 0 。 0 以上 #DigitCount 未満。
117  /// @return 数値。有効なアクセスコードならば 0 以上 9 以下。
118  ///
119  /// @exception
120  /// 引数 digitIndex に #DigitCount 以上の値を指定した場合。
121  ///
122  /// 無効なアクセスコードであっても構わず算出する。
123  /// そのため無効なアクセスコードでは範囲外の値が返る場合がある。
124  int getDigit(std::size_t digitIndex) const;
125 
126  /// @brief 文字列表現値を作成する。
127  /// @param[in] separator 4桁ごとのセパレータ文字列。区切らないならば nullptr 。
128  /// @return 文字列表現値。
129  ///
130  /// 無効なアクセスコードであっても構わず文字列を作成する。
131  /// その際、無効な桁は16進数文字('A' 〜 'F')となる。
132  std::wstring toString(const wchar_t* separator = nullptr) const;
133  };
134 
135 /// @}
136 
137  //--------------------
138  // インライン関数定義
139  //--------------------
140 
141  /// @brief 等価比較演算子のオーバロード。
142  /// @param[in] l 左辺値。
143  /// @param[in] r 右辺値。
144  /// @return 比較結果値。
145  /// @relatesalso AccessCode
146  inline bool operator==(const AccessCode& l, const AccessCode& r)
147  {
148  return (std::memcmp(l.values, r.values, sizeof(l.values)) == 0);
149  }
150 
151  /// @brief 非等価比較演算子のオーバロード。
152  /// @param[in] l 左辺値。
153  /// @param[in] r 右辺値。
154  /// @return 比較結果値。
155  /// @relatesalso AccessCode
156  inline bool operator!=(const AccessCode& l, const AccessCode& r)
157  {
158  return !(l == r);
159  }
160 
161  /// @brief 小なり比較演算子のオーバロード。
162  /// @param[in] l 左辺値。
163  /// @param[in] r 右辺値。
164  /// @return 比較結果値。
165  /// @relatesalso AccessCode
166  inline bool operator<(const AccessCode& l, const AccessCode& r)
167  {
168  return (std::memcmp(l.values, r.values, sizeof(l.values)) < 0);
169  }
170 
171  /// @brief 大なり比較演算子のオーバロード。
172  /// @param[in] l 左辺値。
173  /// @param[in] r 右辺値。
174  /// @return 比較結果値。
175  /// @relatesalso AccessCode
176  inline bool operator>(const AccessCode& l, const AccessCode& r)
177  {
178  return (r < l);
179  }
180 
181  /// @brief 小なり等価比較演算子のオーバロード。
182  /// @param[in] l 左辺値。
183  /// @param[in] r 右辺値。
184  /// @return 比較結果値。
185  /// @relatesalso AccessCode
186  inline bool operator<=(const AccessCode& l, const AccessCode& r)
187  {
188  return !(r < l);
189  }
190 
191  /// @brief 大なり等価比較演算子のオーバロード。
192  /// @param[in] l 左辺値。
193  /// @param[in] r 右辺値。
194  /// @return 比較結果値。
195  /// @relatesalso AccessCode
196  inline bool operator>=(const AccessCode& l, const AccessCode& r)
197  {
198  return !(l < r);
199  }
200 } // namespace amdaemon
201 
202 namespace std
203 {
204  // 前方宣言
205  template<class T> struct hash;
206 
207  /// @brief ハッシュ値を求めるファンクタ構造体。
208  ///
209  /// std::hash クラステンプレートの amdaemon::AccessCode 構造体に対する特殊化。
210  template<>
211  struct hash< ::amdaemon::AccessCode >
212  {
213  /// 戻り値の型。
214  typedef size_t result_type;
215 
216  /// 引数の型。
217  typedef ::amdaemon::AccessCode argument_type;
218 
219  /// @brief 引数のハッシュ値を取得する。
220  /// @param[in] accessCode 引数。
221  /// @return ハッシュ値。
222  result_type operator()(const argument_type& accessCode) const
223  {
224  // 先頭から sizeof(result_type) バイトを用いる
225  AMDAEMON_STATIC_ASSERT(sizeof(accessCode.values) >= sizeof(result_type));
226  return *reinterpret_cast<const result_type*>(accessCode.values);
227  }
228  };
229 } // namespace std
230 
231 #endif // AMDAEMON_ACCESSCODE_H
static bool canMake(const std::uint8_t(&values)[Size])
アクセスコード値を作成可能なBCD形式データであるか否かを調べる。
bool operator<=(const AccessCode &l, const AccessCode &r)
小なり等価比較演算子のオーバロード。
Definition: AccessCode.h:186
result_type operator()(const argument_type &accessCode) const
引数のハッシュ値を取得する。
Definition: AccessCode.h:222
static const std::size_t Size
BCD形式データサイズ。
Definition: AccessCode.h:38
std::uint8_t values[Size]
内部値。4ビットごとに1桁を表すBCD形式データ。AiMeLib互換。
Definition: AccessCode.h:41
bool operator>(const AccessCode &l, const AccessCode &r)
大なり比較演算子のオーバロード。
Definition: AccessCode.h:176
Definition: AccessCode.h:202
Daemonライブラリの環境定義を行うヘッダ。
static const AccessCode & zero()
すべての桁が 0 であるアクセスコード値を取得する。
::amdaemon::AccessCode argument_type
引数の型。
Definition: AccessCode.h:217
AM Daemon ライブラリクラス群の基底名前空間。
Definition: Log.h:13
コンパイル時アサートマクロを定義するヘッダ。
bool valid() const
有効なアクセスコードであるか否かを取得する。
アクセスコード値構造体。
Definition: AccessCode.h:32
static const std::size_t DigitCount
桁数。
Definition: AccessCode.h:35
size_t result_type
戻り値の型。
Definition: AccessCode.h:214
static AccessCode make(const std::uint8_t(&values)[Size])
BCD形式データからアクセスコード値を作成する。
std::wstring toString(const wchar_t *separator=nullptr) const
文字列表現値を作成する。
static AccessCode makeInvalid()
無効なアクセスコード値を作成する。
int getDigit(std::size_t digitIndex) const
指定した桁位置の数値を取得する。
bool operator<(const AccessCode &l, const AccessCode &r)
小なり比較演算子のオーバロード。
Definition: AccessCode.h:166
bool operator!=(const AccessCode &l, const AccessCode &r)
非等価比較演算子のオーバロード。
Definition: AccessCode.h:156
#define AMDAEMON_STATIC_ASSERT(flag)
引数が偽であればコンパイルエラーとする。
Definition: StaticAssert.h:17
bool operator>=(const AccessCode &l, const AccessCode &r)
大なり等価比較演算子のオーバロード。
Definition: AccessCode.h:196
bool operator==(const AccessCode &l, const AccessCode &r)
等価比較演算子のオーバロード。
Definition: AccessCode.h:146