1 /*---------------------------------------------------------------------------*
2 Project: Horizon
3 File: Result.h
4
5 Copyright (C)2009 Nintendo Co., Ltd. All rights reserved.
6
7 These coded instructions, statements, and computer programs contain
8 proprietary information of Nintendo of America Inc. and/or Nintendo
9 Company Ltd., and are protected by Federal copyright law. They may
10 not be disclosed to third parties or copied or duplicated in any form,
11 in whole or in part, without the prior written consent of Nintendo.
12
13 $Rev: 33694 $
14 *---------------------------------------------------------------------------*/
15
16 /*!
17 @file
18 @brief Result クラスの宣言
19
20 :include nn/Result.h
21 */
22
23 #ifndef NN_RESULT_H_
24 #define NN_RESULT_H_
25
26 #include <nn/types.h>
27 #include <nn/util/util_StaticAssert.h>
28
29 //-------------------------------------------------------------------
30 // for C / C++
31
32 /*!
33 @addtogroup nn_root
34 @{
35 */
36
37 /*!
38 @defgroup nn_Result_c Result (C)
39
40 @brief 処理の結果を示すnn::ResultのC インタフェースモジュールです。
41
42 @{
43 */
44
45
46 #ifdef __cplusplus
47 extern "C" {
48 #endif // ifdef __cplusplus
49
50 /*!
51 @brief 処理の結果を示す構造体です。C の API で使用します。
52 */
53 typedef struct nnResult
54 {
55 bit32 value;
56 }
57 nnResult;
58
59 #ifdef __cplusplus
60 }
61 #endif // ifdef __cplusplus
62
63 /*!
64 @}
65 */
66 /*!
67 @}
68 */
69
70
71 //-------------------------------------------------------------------
72 // for C++
73
74 #ifdef __cplusplus
75
76 namespace nn {
77
78 /*!
79 @brief 処理の結果を示すクラスです。
80 */
81
82 class Result{
83 private:
84 static const bit32 MASK_FAIL_BIT = 0x80000000u; // 最上位ビット
85
86 static const s32 SIZE_DESCRIPTION = 10;
87 static const s32 SIZE_MODULE = 8;
88 static const s32 SIZE_RESERVE = 3;
89 static const s32 SIZE_SUMMARY = 6;
90 static const s32 SIZE_LEVEL = 5;
91
92 static const s32 SHIFTS_DESCRIPTION = 0;
93 static const s32 SHIFTS_MODULE = SHIFTS_DESCRIPTION + SIZE_DESCRIPTION;
94 static const s32 SHIFTS_RESERVE = SHIFTS_MODULE + SIZE_MODULE;
95 static const s32 SHIFTS_SUMMARY = SHIFTS_RESERVE + SIZE_RESERVE;
96 static const s32 SHIFTS_LEVEL = SHIFTS_SUMMARY + SIZE_SUMMARY;
97 NN_STATIC_ASSERT( SHIFTS_LEVEL + SIZE_LEVEL == 32 );
98
99 static const bit32 MASK_NEGATIVE_LEVEL = (~0u) << SIZE_LEVEL;
100
101 #define NN_RESULT_H_MAKE_MASK(size, shift) (((~0u) >> (32 - (size))) << (shift))
102 #define NN_RESULT_H_MAKE_MASK_HELPER(c) \
103 static const bit32 MASK_ ## c = NN_RESULT_H_MAKE_MASK(SIZE_ ## c, SHIFTS_ ## c)
104 NN_RESULT_H_MAKE_MASK_HELPER(DESCRIPTION);
105 NN_RESULT_H_MAKE_MASK_HELPER(MODULE);
106 NN_RESULT_H_MAKE_MASK_HELPER(SUMMARY);
107 NN_RESULT_H_MAKE_MASK_HELPER(LEVEL);
108 #undef NN_RESULT_H_MAKE_MASK_HELPER
109 #undef NN_RESULT_H_MAKE_MASK
110
111 #define NN_RESULT_H_MAKE_MAX(size) ((~0u) >> (32 - (size)))
112 #define NN_RESULT_H_MAKE_MAX_HELPER(c) \
113 static const s32 MAX_ ## c = NN_RESULT_H_MAKE_MAX(SIZE_ ## c)
114 NN_RESULT_H_MAKE_MAX_HELPER(DESCRIPTION);
115 NN_RESULT_H_MAKE_MAX_HELPER(MODULE);
116 NN_RESULT_H_MAKE_MAX_HELPER(SUMMARY);
117 NN_RESULT_H_MAKE_MAX_HELPER(LEVEL);
118 #undef NN_RESULT_H_MAKE_MAX_HELPER
119 #undef NN_RESULT_H_MAKE_MAX
120
121 public:
122 /*!
123 * @brief エラーの重要度を示す列挙体です。(この列挙体を利用してエラーのハンドリングをしないでください。)
124 */
125 enum Level
126 {
127 //! 成功。追加情報あり。
128 LEVEL_INFO = 1,
129 //! 成功。追加情報なし。
130 LEVEL_SUCCESS = 0,
131 //! システムレベルの致命的なエラー。ソフトウェアでの復旧不可能。サポートセンター案内シーケンスへ移行。
132 LEVEL_FATAL = -1,
133 //! 予想されていないエラー。リセットシーケンスへ移行すべき。モジュールの再初期化で回復する見込みはないがリセットで回復する可能性がある。
134 LEVEL_RESET = -2,
135 //! モジュールの再初期化が必要なエラー。
136 LEVEL_REINIT = -3,
137 //! プログラミング上のエラー。指定された引数では内部状態によらず必ずエラーである。
138 LEVEL_USAGE = -4,
139 //! 通常のエラー。リトライできない。
140 LEVEL_PERMANENT = -5,
141 //! 一時的な失敗。同じ引数で即リトライできる。比較的少ないリトライ回数で成功する。
142 LEVEL_TEMPORARY = -6,
143 //! 予想された失敗。
144 LEVEL_STATUS = -7,
145 //! この値は使用されません。
146 LEVEL_END
147 };
148
149 /*!
150 * @brief エラーの概要を示す列挙体です。(この列挙体を利用してエラーのハンドリングをしないでください。)
151 */
152 enum Summary
153 {
154 SUMMARY_SUCCESS = 0, //!< 成功しました。
155 SUMMARY_NOTHING_HAPPENED = 1, //!< 何も置きませんでした。
156 SUMMARY_WOULD_BLOCK = 2, //!< 処理がブロックする可能性があります。
157 SUMMARY_OUT_OF_RESOURCE = 3, //!< 処理に必要なリソースが確保できませんでした。
158 SUMMARY_NOT_FOUND = 4, //!< 対象が存在しません。
159 SUMMARY_INVALID_STATE = 5, //!< 要求された処理は、現在の内部状態では実行できません。
160 SUMMARY_NOT_SUPPORTED = 6, //!< 現在の SDK では未対応です。
161 SUMMARY_INVALID_ARGUMENT = 7, //!< 引数が不正です。
162 SUMMARY_WRONG_ARGUMENT = 8, //!< 引数以外のパラメータが不正です。
163 SUMMARY_CANCELLED = 9, //!< 処理はキャンセルされました。
164 SUMMARY_STATUS_CHANGED = 10, //!< 状態が変化しました。(例: 処理を実行中に内部状態が変化した)
165 SUMMARY_INTERNAL = 11, //!< ライブラリ内部で使用されるエラーです。
166
167 SUMMARY_INVALID_RESULT_VALUE = MAX_SUMMARY
168 };
169
170 /*!
171 * @brief エラーが発生したモジュールを示す列挙体です。(この列挙体を利用してエラーのハンドリングをしないでください。)
172 *
173 * 列挙体の定義は将来変更される可能性があります。
174 */
175 enum Module
176 {
177 MODULE_COMMON = 0,
178 MODULE_NN_KERNEL = 1,
179 MODULE_NN_UTIL,
180 MODULE_NN_FILE_SERVER,
181 MODULE_NN_LOADER_SERVER,
182 MODULE_NN_TCB,
183 MODULE_NN_OS,
184 MODULE_NN_DBG,
185 MODULE_NN_DMNT,
186 MODULE_NN_PDN,
187 MODULE_NN_GX,
188 MODULE_NN_I2C,
189 MODULE_NN_GPIO,
190 MODULE_NN_DD,
191 MODULE_NN_CODEC,
192 MODULE_NN_SPI,
193 MODULE_NN_PXI,
194 MODULE_NN_FS,
195 MODULE_NN_DI,
196 MODULE_NN_HID,
197 MODULE_NN_CAMERA,
198 MODULE_NN_PI,
199 MODULE_NN_PM,
200 MODULE_NN_PMLOW,
201 MODULE_NN_FSI,
202 MODULE_NN_SRV,
203 MODULE_NN_NDM,
204 MODULE_NN_NWM,
205 MODULE_NN_SOCKET,
206 MODULE_NN_LDR,
207 MODULE_NN_ACC,
208 MODULE_NN_ROMFS,
209 MODULE_NN_AM,
210 MODULE_NN_HIO,
211 MODULE_NN_UPDATER,
212 MODULE_NN_MIC,
213 MODULE_NN_FND,
214 MODULE_NN_MP,
215 MODULE_NN_MPWL,
216 MODULE_NN_AC,
217 MODULE_NN_HTTP,
218 MODULE_NN_DSP,
219 MODULE_NN_SND,
220 MODULE_NN_DLP,
221 MODULE_NN_HIOLOW,
222 MODULE_NN_CSND,
223 MODULE_NN_SSL,
224 MODULE_NN_AMLOW,
225 MODULE_NN_NEX,
226 MODULE_NN_FRIENDS,
227 MODULE_NN_RDT,
228 MODULE_NN_APPLET,
229 MODULE_NN_NIM,
230 MODULE_NN_PTM,
231 MODULE_NN_MIDI,
232 MODULE_NN_MC,
233 MODULE_NN_SWC,
234 MODULE_NN_FATFS,
235 MODULE_NN_NGC,
236 MODULE_NN_CARD,
237 MODULE_NN_CARDNOR,
238 MODULE_NN_SDMC,
239 MODULE_NN_BOSS,
240 MODULE_NN_DBM,
241 MODULE_NN_CFG,
242 MODULE_NN_PS,
243 MODULE_NN_CEC,
244 MODULE_NN_IR,
245 MODULE_NN_UDS,
246 MODULE_NN_PL,
247 MODULE_NN_CUP,
248 MODULE_NN_GYROSCOPE,
249 MODULE_NN_MCU,
250 MODULE_NN_NS,
251 MODULE_NN_NEWS,
252 MODULE_NN_RO,
253 MODULE_NN_GD,
254
255 MODULE_APPLICATION = MAX_MODULE - 1,
256
257 MODULE_INVALID_RESULT_VALUE = MAX_MODULE
258 };
259
260 /*!
261 * @brief エラーの詳細を示す列挙体です。(この列挙体を利用してエラーのハンドリングをしないでください。)
262 *
263 * 負の値は SDK 全体で共通しており、正の値は各ライブラリが独自に定義する値です。
264 */
265 enum Description
266 {
267 DESCRIPTION_SUCCESS = 0, //!< 成功しました。
268
269 DESCRIPTION_INVALID_SELECTION = MAX_DESCRIPTION - 23, //!< (指定可能な値が離散的な場合に、) 不正な値が指定されました。
270 DESCRIPTION_TOO_LARGE = MAX_DESCRIPTION - 22, //!< 値が大きすぎます。
271 DESCRIPTION_NOT_AUTHORIZED = MAX_DESCRIPTION - 21, //!< 許可されていない操作です。
272 DESCRIPTION_ALREADY_DONE = MAX_DESCRIPTION - 20, //!< 内部状態が既に指定された状態になっています。
273 DESCRIPTION_INVALID_SIZE = MAX_DESCRIPTION - 19, //!< 値が無効なサイズです。
274 DESCRIPTION_INVALID_ENUM_VALUE = MAX_DESCRIPTION - 18, //!< enum 値の範囲外の値です。
275 DESCRIPTION_INVALID_COMBINATION = MAX_DESCRIPTION - 17, //!< 引数間の組み合わせが不正です。
276 DESCRIPTION_NO_DATA = MAX_DESCRIPTION - 16, //!< データがありません。
277 DESCRIPTION_BUSY = MAX_DESCRIPTION - 15, //!< 既に他の処理が行われていたため、実行できませんでした。
278 DESCRIPTION_MISALIGNED_ADDRESS = MAX_DESCRIPTION - 14, //!< アドレスに関するアライメントが不正です。
279 DESCRIPTION_MISALIGNED_SIZE = MAX_DESCRIPTION - 13, //!< サイズに関するアライメントが不正
280 DESCRIPTION_OUT_OF_MEMORY = MAX_DESCRIPTION - 12, //!< メモリが足りません。
281 DESCRIPTION_NOT_IMPLEMENTED = MAX_DESCRIPTION - 11, //!< 未実装です。
282 DESCRIPTION_INVALID_ADDRESS = MAX_DESCRIPTION - 10, //!< 不正なアドレスです。
283 DESCRIPTION_INVALID_POINTER = MAX_DESCRIPTION - 9, //!< 不正なポインタです。
284 DESCRIPTION_INVALID_HANDLE = MAX_DESCRIPTION - 8, //!< 不正なハンドルです。
285 DESCRIPTION_NOT_INITIALIZED = MAX_DESCRIPTION - 7, //!< 初期化されていません。
286 DESCRIPTION_ALREADY_INITIALIZED = MAX_DESCRIPTION - 6, //!< 既に初期化されています。
287 DESCRIPTION_NOT_FOUND = MAX_DESCRIPTION - 5, //!< 対象が存在しません。
288 DESCRIPTION_CANCEL_REQUESTED = MAX_DESCRIPTION - 4, //!< 要求がキャンセルされました。
289 DESCRIPTION_ALREADY_EXISTS = MAX_DESCRIPTION - 3, //!< 対象は既に存在します。
290 DESCRIPTION_OUT_OF_RANGE = MAX_DESCRIPTION - 2, //!< 値が定義域の範囲外です。
291 DESCRIPTION_TIMEOUT = MAX_DESCRIPTION - 1, //!< 処理がタイムアウトしました。
292 DESCRIPTION_INVALID_RESULT_VALUE = MAX_DESCRIPTION - 0
293 };
294
295 private:
296
297 bit32 m_Code;
298
299 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription> friend struct Const;
300 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription, int TDescriptionMin, int TDescriptionMax> friend struct ConstRange;
Result(bit32 code)301 explicit Result(bit32 code) : m_Code(code) {}
302
303 public:
Result()304 Result()
305 : m_Code( static_cast<bit32>(
306 ((static_cast<bit32>(LEVEL_USAGE) << SHIFTS_LEVEL) & MASK_LEVEL) |
307 ((SUMMARY_INVALID_RESULT_VALUE << SHIFTS_SUMMARY) & MASK_SUMMARY) |
308 ((MODULE_INVALID_RESULT_VALUE << SHIFTS_MODULE) & MASK_MODULE) |
309 ((DESCRIPTION_INVALID_RESULT_VALUE << SHIFTS_DESCRIPTION) & MASK_DESCRIPTION) ))
310 {
311 }
312
Result(Level level,Summary summary,Module module,int description)313 Result(Level level, Summary summary, Module module, int description)
314 : m_Code( static_cast<bit32>(
315 ((level << SHIFTS_LEVEL) & MASK_LEVEL) |
316 ((summary << SHIFTS_SUMMARY) & MASK_SUMMARY) |
317 ((module << SHIFTS_MODULE) & MASK_MODULE) |
318 ((description << SHIFTS_DESCRIPTION) & MASK_DESCRIPTION) ))
319 {
320 }
321
Result(nnResult result)322 Result(nnResult result) : m_Code(result.value) {}
323 /*!
324 @name 判定
325 @{
326 */
327 /*!
328 * @brief 処理の結果が失敗なら true を、成功なら false を返します。
329 */
IsFailure()330 bool IsFailure() const
331 {
332 return (m_Code & MASK_FAIL_BIT) != 0;
333 }
334
335 /*!
336 * @brief 処理の結果が成功なら true を、失敗なら false を返します。
337 */
IsSuccess()338 bool IsSuccess() const
339 {
340 return !IsFailure();
341 }
342 /*!
343 @}
344 */
345 /*!
346 * :private
347 * @brief エラーの深刻度を示す Level 列挙体を返します。
348 *
349 * Bug: 列挙体の定義は将来変更されます。開発時のエラー内容確認の用途以外では利用しないでください。
350 */
GetLevel()351 Level GetLevel() const
352 {
353 // TODO: プラットフォーム依存の算術シフトインライン関数を作ってそれを呼ぶべき
354 if(m_Code & MASK_FAIL_BIT)
355 {
356 return static_cast<Level>( GetCodeBits(MASK_LEVEL, SHIFTS_LEVEL) | MASK_NEGATIVE_LEVEL);
357 }
358 else
359 {
360 return static_cast<Level>( GetCodeBits(MASK_LEVEL, SHIFTS_LEVEL) );
361 }
362 }
363
364 /*!
365 * :private
366 * @brief エラーの概要を示す Summary 列挙体を返します。
367 *
368 * Bug: 列挙体の定義は将来変更されます。開発時のエラー内容確認の用途以外では利用しないでください。
369 */
GetSummary()370 Summary GetSummary() const
371 {
372 return static_cast<Summary>( GetCodeBits(MASK_SUMMARY, SHIFTS_SUMMARY) );
373 }
374
375 /*!
376 * :private
377 * @brief エラーが発生したモジュールを示す Module 列挙体を返します。
378 *
379 * Bug: 列挙体の定義は将来変更されます。開発時のエラー内容確認の用途以外では利用しないでください。
380 */
GetModule()381 Module GetModule() const
382 {
383 return static_cast<Module>( GetCodeBits(MASK_MODULE, SHIFTS_MODULE) );
384 }
385
386 /*!
387 * :private
388 * @brief エラーの詳細を示す Description 列挙体を返します。
389 *
390 * Bug: 列挙体の定義は将来変更されます。開発時のエラー内容確認の用途以外では利用しないでください。
391 */
GetDescription()392 int GetDescription() const
393 {
394 return static_cast<int>( GetCodeBits(MASK_DESCRIPTION, SHIFTS_DESCRIPTION) );
395 }
396
GetValue()397 bit32 GetValue() const { return m_Code; }
398 /*!
399 @name 開発サポート
400 @{
401 */
402 /*!
403 * @brief Result を 32bit のビット列に変換します。
404 *
405 * @return @ref Level, @ref Summary, @ref Module, @ref Description をまとめた 32bit のビット列です。
406 */
GetPrintableBits()407 bit32 GetPrintableBits() const { return m_Code; }
408
nnResult()409 operator nnResult() const
410 {
411 nnResult r = {m_Code};
412 return r;
413 }
414 /*!
415 @}
416 */
417 /*!
418 @name 判定
419 @{
420 */
421 /*!
422 * @brief 一致判定を行います。
423 *
424 * @ref nn::fs 以外のライブラリで、特定のエラーをハンドリングする際にご利用下さい。なお、 @ref nn::fs ライブラリでの
425 * エラーハンドリングについては @ref nn::fs ライブラリのリファレンスを参照下さい。
426 * @return 一致した場合に true を、一致しない場合に false を返します。
427 */
428 bool operator ==(const Result& rhs) const { return this->m_Code == rhs.m_Code; }
429
430 /*!
431 * @brief 不一致判定を行います。
432 *
433 * @ref nn::fs 以外のライブラリで、特定のエラーをハンドリングする際にご利用下さい。なお、 @ref nn::fs ライブラリでの
434 * エラーハンドリングについては @ref nn::fs ライブラリのリファレンスを参照下さい。
435 * @return 一致しない場合に true を、一致する場合に false を返します。
436 */
437 bool operator !=(const Result& rhs) const { return this->m_Code != rhs.m_Code; }
438 /*!
439 @}
440 */
441 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription> struct Const;
442 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription, int TDescriptionMin, int TDescriptionMax> struct ConstRange;
443 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule> struct Const_LSM;
444 template <Result::Level TLevel, Result::Module TModule> struct Const_LM;
445 template <Result::Level TLevel> struct Const_L;
446
447 private:
GetCodeBits(bit32 mask,s32 shift)448 bit32 GetCodeBits(bit32 mask, s32 shift) const
449 {
450 return ((m_Code & mask) >> shift);
451 }
452
453 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription, int TDescriptionMin, int TDescriptionMax>
454 bool operator==(ConstRange<TLevel, TSummary, TModule, TDescription, TDescriptionMin, TDescriptionMax>) const;
455 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription, int TDescriptionMin, int TDescriptionMax>
456 bool operator!=(ConstRange<TLevel, TSummary, TModule, TDescription, TDescriptionMin, TDescriptionMax>) const;
457 };
458
459 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription>
460 struct Result::Const : public Result
461 {
462 static const Result::Level Level = TLevel;
463 static const Result::Summary Summary = TSummary;
464 static const Result::Module Module = TModule;
465 static const int Description = TDescription;
466
467 static const bit32 Value = static_cast<bit32>(
468 ((static_cast<bit32>(TLevel) << SHIFTS_LEVEL) & MASK_LEVEL) |
469 ((TSummary << SHIFTS_SUMMARY) & MASK_SUMMARY) |
470 ((TModule << SHIFTS_MODULE) & MASK_MODULE) |
471 ((TDescription << SHIFTS_DESCRIPTION) & MASK_DESCRIPTION) );
472
ConstConst473 Const() : Result(Value) {}
474
IncludesConst475 static bool Includes(Result result)
476 {
477 return result.GetModule() == TModule && result.GetDescription() == TDescription;
478 }
479 };
480
481 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription, int TDescriptionMin, int TDescriptionMax>
482 struct Result::ConstRange : public Result
483 {
484 static const Result::Level Level = TLevel;
485 static const Result::Summary Summary = TSummary;
486 static const Result::Module Module = TModule;
487 static const int Description = TDescription;
488 static const int DescriptionMin = TDescriptionMin;
489 static const int DescriptionMax = TDescriptionMax;
490
491 static const bit32 Value = static_cast<bit32>(
492 ((static_cast<bit32>(TLevel) << SHIFTS_LEVEL) & MASK_LEVEL) |
493 ((TSummary << SHIFTS_SUMMARY) & MASK_SUMMARY) |
494 ((TModule << SHIFTS_MODULE) & MASK_MODULE) |
495 ((TDescription << SHIFTS_DESCRIPTION) & MASK_DESCRIPTION) );
496
ConstRangeConstRange497 ConstRange() : Result(Value) {}
498
IncludesConstRange499 static bool Includes(Result result)
500 {
501 return result.GetModule() == TModule && (TDescriptionMin <= result.GetDescription() && result.GetDescription() <= TDescriptionMax);
502 }
503
504 friend bool operator<=(Result lhs, ConstRange) { return ConstRange::Includes(lhs); }
505 friend bool operator>=(ConstRange, Result rhs) { return ConstRange::Includes(rhs); }
506 private:
507 bool operator==(Result) const;
508 bool operator!=(Result) const;
509 };
510
511 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule>
512 struct Result::Const_LSM : public Result
513 {
514 static const Result::Level Level = TLevel;
515 static const Result::Summary Summary = TSummary;
516 static const Result::Module Module = TModule;
517
518 template <int TDescription>
519 struct Const : public Result::Const<TLevel, TSummary, TModule, TDescription> {};
520
Const_LSMConst_LSM521 Const_LSM(int description) : Result(TLevel, TSummary, TModule, description) {}
522 };
523
524 template <Result::Level TLevel, Result::Module TModule>
525 struct Result::Const_LM : public Result
526 {
527 static const Result::Level Level = TLevel;
528 static const Result::Module Module = TModule;
529
530 template <Result::Summary TSummary, int TDescription>
531 struct Const : public Result::Const<TLevel, TSummary, TModule, TDescription> {};
532
Const_LMConst_LM533 Const_LM(Result::Summary summary, int description) : Result(TLevel, summary, TModule, description) {}
534 };
535
536 template <Result::Level TLevel>
537 struct Result::Const_L : public Result
538 {
539 static const Result::Level Level = TLevel;
540
541 template <Result::Summary TSummary, Result::Module TModule, int TDescription>
542 struct Const : public Result::Const<TLevel, TSummary, TModule, TDescription> {};
543
Const_LConst_L544 Const_L(Result::Summary summary, Result::Module module, int description) : Result(TLevel, summary, module, description) {}
545 };
546
547 #define NN_DEFINE_RESULT_CONST(name, level, summary, module, description) \
548 typedef ::nn::Result::Const<(level), (summary), (module), (description)> name
549
550 #define NN_DEFINE_RESULT_CONST_RANGE(name, level, summary, module, description, descriptionMin, descriptionMax) \
551 typedef ::nn::Result::ConstRange<(level), (summary), (module), (description), (descriptionMin), (descriptionMax)> name
552
553 NN_DEFINE_RESULT_CONST(ResultSuccess, Result::LEVEL_SUCCESS, Result::SUMMARY_SUCCESS, Result::MODULE_COMMON, Result::DESCRIPTION_SUCCESS);
554
555 #define NN_DEFINE_RESULT_FUNC_LSM(name, level, summary, module) \
556 typedef ::nn::Result::Const_LSM<(level), (summary), (module)> name
557
558 #define NN_DEFINE_RESULT_CONST_LSM(name, f, description) \
559 typedef f::Const<(description)> name
560
561 #define NN_DEFINE_RESULT_FUNC_LM(name, level, module) \
562 typedef ::nn::Result::Const_LM<(level), (module)> name
563
564 #define NN_DEFINE_RESULT_CONST_LM(name, f, summary, description) \
565 typedef f::Const<(summary), (description)> name
566
567 #define NN_DEFINE_RESULT_FUNC_L(name, level) \
568 typedef ::nn::Result::Const_L<(level)> name
569
570 #define NN_DEFINE_RESULT_CONST_L(name, f, summary, module, description) \
571 typedef f::Const<(summary), (module), (description)> name
572
MakeInfoResult(Result::Summary summary,Result::Module module,int description)573 inline Result MakeInfoResult(Result::Summary summary, Result::Module module, int description)
574 { return Result(Result::LEVEL_INFO, summary, module, description); }
MakeFatalResult(Result::Summary summary,Result::Module module,int description)575 inline Result MakeFatalResult(Result::Summary summary, Result::Module module, int description)
576 { return Result(Result::LEVEL_FATAL, summary, module, description); }
MakeResetResult(Result::Summary summary,Result::Module module,int description)577 inline Result MakeResetResult(Result::Summary summary, Result::Module module, int description)
578 { return Result(Result::LEVEL_RESET, summary, module, description); }
MakeReInitResult(Result::Summary summary,Result::Module module,int description)579 inline Result MakeReInitResult(Result::Summary summary, Result::Module module, int description)
580 { return Result(Result::LEVEL_REINIT, summary, module, description); }
MakeUsageResult(Result::Summary summary,Result::Module module,int description)581 inline Result MakeUsageResult(Result::Summary summary, Result::Module module, int description)
582 { return Result(Result::LEVEL_USAGE, summary, module, description); }
MakePermanentResult(Result::Summary summary,Result::Module module,int description)583 inline Result MakePermanentResult(Result::Summary summary, Result::Module module, int description)
584 { return Result(Result::LEVEL_PERMANENT, summary, module, description); }
MakeTemporaryResult(Result::Summary summary,Result::Module module,int description)585 inline Result MakeTemporaryResult(Result::Summary summary, Result::Module module, int description)
586 { return Result(Result::LEVEL_TEMPORARY, summary, module, description); }
MakeStatusResult(Result::Summary summary,Result::Module module,int description)587 inline Result MakeStatusResult(Result::Summary summary, Result::Module module, int description)
588 { return Result(Result::LEVEL_STATUS, summary, module, description); }
589
590 }
591
592
593 #endif // __cplusplus
594
595 #ifdef __cplusplus
596 extern "C" {
597 #endif
598
599 typedef void (*nnResultHandlerImpl)(nnResult result, const char* filename, int lineno, const char* fmt, va_list vlist);
600
601 int nnResultFailureHandler(nnResult result, const char* filename, int lineno, const char* fmt, ...);
602 int nnResultTFailureHandler(nnResult result, const char* filename, int lineno, const char* fmt, ...);
603
604 int nnResultPanicHandler(nnResult result, const char* filename, int lineno, const char* fmt, ...);
605 int nnResultTPanicHandler(nnResult result, const char* filename, int lineno, const char* fmt, ...);
606
607 nnResult nnMakeInvalidResult(void);
608
609 #ifdef __cplusplus
610 }
611 #endif
612
613 #endif /* NN_RESULT_H_ */
614