AM Daemon ライブラリリファレンス
misc.h
[詳解]
1 /// @file
2 /// @brief 雑多なインライン関数やマクロを定義するヘッダ。
3 ///
4 /// Copyright(C)SEGA
5 
6 #ifndef AMDAEMON_UTIL_MISC_H
7 #define AMDAEMON_UTIL_MISC_H
8 
9 #include "amdaemon/env.h"
10 
11 #include <cstddef>
12 #include <cwchar>
13 
14 /// std::isfinite が実装されている環境ならば真。(VC++2013以降)
15 #define AMDAEMON_STD_FINITE_SUPPORTED AMDAEMON_MSVC_COMPATIBLE(1800)
16 
17 #if AMDAEMON_STD_FINITE_SUPPORTED
18 #include <cmath> // for std::isfinite
19 #else // AMDAEMON_STD_FINITE_SUPPORTED
20 #include <float.h> // for ::_finite
21 #endif // AMDAEMON_STD_FINITE_SUPPORTED
22 
23 /// @addtogroup g_util
24 /// @{
25 
26 /// constexpr キーワードが実装されている環境ならば真。(VC++2015以降)
27 #define AMDAEMON_CONSTEXPR_SUPPORTED AMDAEMON_MSVC_COMPATIBLE(1900)
28 
29 /// @def AMDAEMON_CONSTEXPR
30 /// @brief 環境に応じて constexpr キーワードまたは inline キーワードとなる。
31 ///
32 /// - VC++2015以降およびVC++以外のコンパイラでは constexpr キーワードと等価。
33 /// - 上記以外の環境では inline キーワードと等価。
34 #if AMDAEMON_CONSTEXPR_SUPPORTED
35 #define AMDAEMON_CONSTEXPR constexpr
36 #else // AMDAEMON_CONSTEXPR_SUPPORTED
37 #define AMDAEMON_CONSTEXPR inline
38 #endif // AMDAEMON_CONSTEXPR_SUPPORTED
39 
40 /// @def AMDAEMON_STRING_TO_WIDE
41 /// @brief char リテラル文字列を wchar_t リテラル文字列に変換する。
42 /// @param[in] s char リテラル文字列。
43 ///
44 /// 引数にマクロを渡した場合、マクロを展開した上で文字列変換する。
45 #define AMDAEMON_STRING_TO_WIDE_IMPL_(s) L##s
46 #define AMDAEMON_STRING_TO_WIDE(s) AMDAEMON_STRING_TO_WIDE_IMPL_(s)
47 
48 /// @}
49 
50 namespace amdaemon
51 {
52 namespace util
53 {
54 /// @addtogroup g_util
55 /// @{
56 
57  /// @brief 組み込み配列の要素数を取得する。
58  /// @tparam T 組み込み配列の要素型。
59  /// @tparam Size 組み込み配列の要素数。
60  /// @return 要素数。
61  template<class T, std::size_t Size>
62  AMDAEMON_CONSTEXPR std::size_t getArraySize(const T (&)[Size])
63  {
64  return Size;
65  }
66 
67  /// @brief 浮動小数点数が非数値ではないか否かを取得する。
68  /// @param[in] value 調べる浮動小数点数値。
69  /// @retval true value が非数値ではない場合。
70  /// @retval false value が非数値である場合。
71  ///
72  /// value が下記のいずれの値でもなければ true を返す。
73  ///
74  /// - 正の無限大
75  /// - 負の無限大
76  /// - NaN
77  inline bool isFinite(float value)
78  {
79 #if AMDAEMON_STD_FINITE_SUPPORTED
80  return (std::isfinite(value) != 0);
81 #else // AMDAEMON_STD_FINITE_SUPPORTED
82  // _finitef は x86 環境だと利用できないので _finite を使う
83  return (::_finite(value) != 0);
84 #endif // AMDAEMON_STD_FINITE_SUPPORTED
85  }
86 
87  /// @copydoc isFinite
88  inline bool isFinite(double value)
89  {
90 #if AMDAEMON_STD_FINITE_SUPPORTED
91  return (std::isfinite(value) != 0);
92 #else // AMDAEMON_STD_FINITE_SUPPORTED
93  return (::_finite(value) != 0);
94 #endif // AMDAEMON_STD_FINITE_SUPPORTED
95  }
96 
97  /// @brief 文字がASCIIの10進数字であるか否かを取得する。
98  /// @param[in] c 調べる文字。
99  /// @retval true ASCIIの10進数字である場合。
100  /// @retval false ASCIIの10進数字ではない場合。
101  ///
102  /// 標準関数 std::iswdigit は現在のロケールを考慮するため、
103  /// 全角文字や想定していない文字まで10進数字として判定される可能性がある。
105  {
106  return (c >= L'0' && c <= L'9');
107  }
108 
109  /// @brief 文字がASCIIのアルファベットであるか否かを取得する。
110  /// @param[in] c 調べる文字。
111  /// @retval true ASCIIのアルファベットである場合。
112  /// @retval false ASCIIのアルファベットではない場合。
113  ///
114  /// 標準関数 std::iswalpha は現在のロケールを考慮するため、
115  /// 全角文字や想定していない文字までアルファベットとして判定される可能性がある。
117  {
118  return ((c >= L'a' && c <= L'z') || (c >= L'A' && c <= L'Z'));
119  }
120 
121  /// @brief 文字列を文字列バッファへコピーする。
122  /// @tparam N 文字配列の要素数。
123  /// @param[in] src コピー元の文字列。
124  /// @param[out] dest コピー先の文字列バッファ。
125  /// @param[in] destCount コピー先バッファの許容文字数。
126  ///
127  /// - 必ず終端の '¥0' は付与される。
128  /// - 引数 src の文字数が destCount 以上である場合、
129  /// (destCount - 1) 文字目までがコピーされる。
130  inline void copyString(const wchar_t* src, wchar_t* dest, std::size_t destCount)
131  {
132 #if AMDAEMON_ON_MSVC
133  (void)::wcsncpy_s(dest, destCount, src, destCount - 1);
134 #else // AMDAEMON_ON_MSVC
135  (std::wcsncpy(dest, src, destCount - 1))[destCount - 1] = L'¥0';
136 #endif // AMDAEMON_ON_MSVC
137  }
138 
139  /// @brief 文字列を文字配列へコピーする。
140  /// @tparam N 文字配列の要素数。
141  /// @param[in] src コピー元の文字列。
142  /// @param[out] dest コピー先の文字配列。
143  ///
144  /// - 必ず終端の '¥0' は付与される。
145  /// - 引数 src の文字数が N 以上である場合、 (N - 1) 文字目までがコピーされる。
146  template<std::size_t N>
147  inline void copyString(const wchar_t* src, wchar_t (&dest)[N])
148  {
149  copyString(src, dest, N);
150  }
151 
152  /// @brief 1次元値の線形変換を行う。
153  /// @tparam TDest 線形変換後の値型。引数から推論される。
154  /// @tparam TSrc 線形変換前の値型。引数から推論される。
155  /// @param[in] value 線形変換する値。
156  /// @param[in] minValue 線形変換前の最小値。 maxValue と同値であってはならない。
157  /// @param[in] maxValue 線形変換前の最大値。 minValue と同値であってはならない。
158  /// @param[in] transMin minValue を線形変換した時の値。
159  /// @param[in] transMax maxValue を線形変換した時の値。
160  /// @return 線形変換した値。
161  template<class TDest, class TSrc>
162  inline TDest transformLinear(
163  TSrc value,
164  TSrc minValue,
165  TSrc maxValue,
166  TDest transMin,
167  TDest transMax)
168  {
169  const auto range = maxValue - minValue;
170  const auto transRange = transMax - transMin;
171  return
172  (range == 0) ?
173  transMin :
174  static_cast<TDest>((value - minValue) * transRange / range + transMin);
175  }
176 
177 /// @}
178 
179  namespace detail
180  {
181  /// @brief AMDAEMON_ARRAYSIZE マクロのためのヘルパ関数。
182  /// @tparam T 組み込み配列要素型。
183  /// @tparam Size 組み込み配列要素数。
184  /// @return 組み込み配列の要素数を得るための型。
185  ///
186  /// 直接呼び出そうとするとコンパイルエラーとなる。
187  /// sizeof と組み合わせて用いる。
188  template<class T, std::size_t Size>
189  char (&array_size_helper(T (&)[Size]))[Size];
190  } // namespace detail
191 } // namespace util
192 } // namespace amdaemon
193 
194 /// @addtogroup g_util
195 /// @{
196 
197 /// @brief 組み込み配列の要素数を取得する。
198 /// @param[in] arr 組み込み配列。
199 #define AMDAEMON_ARRAYSIZE(arr) sizeof(::amdaemon::util::detail::array_size_helper(arr))
200 
201 /// @}
202 
203 #endif // AMDAEMON_UTIL_MISC_H
bool isFinite(float value)
浮動小数点数が非数値ではないか否かを取得する。
Definition: misc.h:77
AMDAEMON_CONSTEXPR bool isAsciiAlphabet(wchar_t c)
文字がASCIIのアルファベットであるか否かを取得する。
Definition: misc.h:116
Daemonライブラリの環境定義を行うヘッダ。
AM Daemon ライブラリクラス群の基底名前空間。
Definition: Log.h:13
void copyString(const wchar_t *src, wchar_t *dest, std::size_t destCount)
文字列を文字列バッファへコピーする。
Definition: misc.h:130
TDest transformLinear(TSrc value, TSrc minValue, TSrc maxValue, TDest transMin, TDest transMax)
1次元値の線形変換を行う。
Definition: misc.h:162
AMDAEMON_CONSTEXPR std::size_t getArraySize(const T(&)[Size])
組み込み配列の要素数を取得する。
Definition: misc.h:62
AMDAEMON_CONSTEXPR bool isAsciiDigit(wchar_t c)
文字がASCIIの10進数字であるか否かを取得する。
Definition: misc.h:104
#define AMDAEMON_CONSTEXPR
環境に応じて constexpr キーワードまたは inline キーワードとなる。
Definition: misc.h:35