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: 30889 $
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_INVALID_RESULT_VALUE = MAX_MODULE
253 };
254
255 /*!
256 * @brief エラーの詳細を示す列挙体です。(この列挙体を利用してエラーのハンドリングをしないでください。)
257 *
258 * 負の値は SDK 全体で共通しており、正の値は各ライブラリが独自に定義する値です。
259 */
260 enum Description
261 {
262 DESCRIPTION_SUCCESS = 0, //!< 成功しました。
263
264 DESCRIPTION_INVALID_SELECTION = MAX_DESCRIPTION - 23, //!< (指定可能な値が離散的な場合に、) 不正な値が指定されました。
265 DESCRIPTION_TOO_LARGE = MAX_DESCRIPTION - 22, //!< 値が大きすぎます。
266 DESCRIPTION_NOT_AUTHORIZED = MAX_DESCRIPTION - 21, //!< 許可されていない操作です。
267 DESCRIPTION_ALREADY_DONE = MAX_DESCRIPTION - 20, //!< 内部状態が既に指定された状態になっています。
268 DESCRIPTION_INVALID_SIZE = MAX_DESCRIPTION - 19, //!< 値が無効なサイズです。
269 DESCRIPTION_INVALID_ENUM_VALUE = MAX_DESCRIPTION - 18, //!< enum 値の範囲外の値です。
270 DESCRIPTION_INVALID_COMBINATION = MAX_DESCRIPTION - 17, //!< 引数間の組み合わせが不正です。
271 DESCRIPTION_NO_DATA = MAX_DESCRIPTION - 16, //!< データがありません。
272 DESCRIPTION_BUSY = MAX_DESCRIPTION - 15, //!< 既に他の処理が行われていたため、実行できませんでした。
273 DESCRIPTION_MISALIGNED_ADDRESS = MAX_DESCRIPTION - 14, //!< アドレスに関するアライメントが不正です。
274 DESCRIPTION_MISALIGNED_SIZE = MAX_DESCRIPTION - 13, //!< サイズに関するアライメントが不正
275 DESCRIPTION_OUT_OF_MEMORY = MAX_DESCRIPTION - 12, //!< メモリが足りません。
276 DESCRIPTION_NOT_IMPLEMENTED = MAX_DESCRIPTION - 11, //!< 未実装です。
277 DESCRIPTION_INVALID_ADDRESS = MAX_DESCRIPTION - 10, //!< 不正なアドレスです。
278 DESCRIPTION_INVALID_POINTER = MAX_DESCRIPTION - 9, //!< 不正なポインタです。
279 DESCRIPTION_INVALID_HANDLE = MAX_DESCRIPTION - 8, //!< 不正なハンドルです。
280 DESCRIPTION_NOT_INITIALIZED = MAX_DESCRIPTION - 7, //!< 初期化されていません。
281 DESCRIPTION_ALREADY_INITIALIZED = MAX_DESCRIPTION - 6, //!< 既に初期化されています。
282 DESCRIPTION_NOT_FOUND = MAX_DESCRIPTION - 5, //!< 対象が存在しません。
283 DESCRIPTION_CANCEL_REQUESTED = MAX_DESCRIPTION - 4, //!< 要求がキャンセルされました。
284 DESCRIPTION_ALREADY_EXISTS = MAX_DESCRIPTION - 3, //!< 対象は既に存在します。
285 DESCRIPTION_OUT_OF_RANGE = MAX_DESCRIPTION - 2, //!< 値が定義域の範囲外です。
286 DESCRIPTION_TIMEOUT = MAX_DESCRIPTION - 1, //!< 処理がタイムアウトしました。
287 DESCRIPTION_INVALID_RESULT_VALUE = MAX_DESCRIPTION - 0
288 };
289
290 private:
291
292 bit32 m_Code;
293
294 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription> friend struct Const;
295 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription, int TDescriptionMin, int TDescriptionMax> friend struct ConstRange;
Result(bit32 code)296 explicit Result(bit32 code) : m_Code(code) {}
297
298 public:
Result()299 Result()
300 : m_Code( static_cast<bit32>(
301 ((static_cast<bit32>(LEVEL_USAGE) << SHIFTS_LEVEL) & MASK_LEVEL) |
302 ((SUMMARY_INVALID_RESULT_VALUE << SHIFTS_SUMMARY) & MASK_SUMMARY) |
303 ((MODULE_INVALID_RESULT_VALUE << SHIFTS_MODULE) & MASK_MODULE) |
304 ((DESCRIPTION_INVALID_RESULT_VALUE << SHIFTS_DESCRIPTION) & MASK_DESCRIPTION) ))
305 {
306 }
307
Result(Level level,Summary summary,Module module,int description)308 Result(Level level, Summary summary, Module module, int description)
309 : m_Code( static_cast<bit32>(
310 ((level << SHIFTS_LEVEL) & MASK_LEVEL) |
311 ((summary << SHIFTS_SUMMARY) & MASK_SUMMARY) |
312 ((module << SHIFTS_MODULE) & MASK_MODULE) |
313 ((description << SHIFTS_DESCRIPTION) & MASK_DESCRIPTION) ))
314 {
315 }
316
Result(nnResult result)317 Result(nnResult result) : m_Code(result.value) {}
318 /*!
319 @name 判定
320 @{
321 */
322 /*!
323 * @brief 処理の結果が失敗なら true を、成功なら false を返します。
324 */
IsFailure()325 bool IsFailure() const
326 {
327 return (m_Code & MASK_FAIL_BIT) != 0;
328 }
329
330 /*!
331 * @brief 処理の結果が成功なら true を、失敗なら false を返します。
332 */
IsSuccess()333 bool IsSuccess() const
334 {
335 return !IsFailure();
336 }
337 /*!
338 @}
339 */
340 /*!
341 * :private
342 * @brief エラーの深刻度を示す Level 列挙体を返します。
343 *
344 * Bug: 列挙体の定義は将来変更されます。開発時のエラー内容確認の用途以外では利用しないでください。
345 */
GetLevel()346 Level GetLevel() const
347 {
348 // TODO: プラットフォーム依存の算術シフトインライン関数を作ってそれを呼ぶべき
349 if(m_Code & MASK_FAIL_BIT)
350 {
351 return static_cast<Level>( GetCodeBits(MASK_LEVEL, SHIFTS_LEVEL) | MASK_NEGATIVE_LEVEL);
352 }
353 else
354 {
355 return static_cast<Level>( GetCodeBits(MASK_LEVEL, SHIFTS_LEVEL) );
356 }
357 }
358
359 /*!
360 * :private
361 * @brief エラーの概要を示す Summary 列挙体を返します。
362 *
363 * Bug: 列挙体の定義は将来変更されます。開発時のエラー内容確認の用途以外では利用しないでください。
364 */
GetSummary()365 Summary GetSummary() const
366 {
367 return static_cast<Summary>( GetCodeBits(MASK_SUMMARY, SHIFTS_SUMMARY) );
368 }
369
370 /*!
371 * :private
372 * @brief エラーが発生したモジュールを示す Module 列挙体を返します。
373 *
374 * Bug: 列挙体の定義は将来変更されます。開発時のエラー内容確認の用途以外では利用しないでください。
375 */
GetModule()376 Module GetModule() const
377 {
378 return static_cast<Module>( GetCodeBits(MASK_MODULE, SHIFTS_MODULE) );
379 }
380
381 /*!
382 * :private
383 * @brief エラーの詳細を示す Description 列挙体を返します。
384 *
385 * Bug: 列挙体の定義は将来変更されます。開発時のエラー内容確認の用途以外では利用しないでください。
386 */
GetDescription()387 int GetDescription() const
388 {
389 return static_cast<int>( GetCodeBits(MASK_DESCRIPTION, SHIFTS_DESCRIPTION) );
390 }
391
GetValue()392 bit32 GetValue() const { return m_Code; }
393 /*!
394 @name 開発サポート
395 @{
396 */
397 /*!
398 * @brief Result を 32bit のビット列に変換します。
399 *
400 * @return @ref Level, @ref Summary, @ref Module, @ref Description をまとめた 32bit のビット列です。
401 */
GetPrintableBits()402 bit32 GetPrintableBits() const { return m_Code; }
403
nnResult()404 operator nnResult() const
405 {
406 nnResult r = {m_Code};
407 return r;
408 }
409 /*!
410 @}
411 */
412 /*!
413 @name 判定
414 @{
415 */
416 /*!
417 * @brief 一致判定を行います。
418 *
419 * @ref nn::fs 以外のライブラリで、特定のエラーをハンドリングする際にご利用下さい。なお、 @ref nn::fs ライブラリでの
420 * エラーハンドリングについては @ref nn::fs ライブラリのリファレンスを参照下さい。
421 * @return 一致した場合に true を、一致しない場合に false を返します。
422 */
423 bool operator ==(const Result& rhs) const { return this->m_Code == rhs.m_Code; }
424
425 /*!
426 * @brief 不一致判定を行います。
427 *
428 * @ref nn::fs 以外のライブラリで、特定のエラーをハンドリングする際にご利用下さい。なお、 @ref nn::fs ライブラリでの
429 * エラーハンドリングについては @ref nn::fs ライブラリのリファレンスを参照下さい。
430 * @return 一致しない場合に true を、一致する場合に false を返します。
431 */
432 bool operator !=(const Result& rhs) const { return this->m_Code != rhs.m_Code; }
433 /*!
434 @}
435 */
436 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription> struct Const;
437 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription, int TDescriptionMin, int TDescriptionMax> struct ConstRange;
438 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule> struct Const_LSM;
439 template <Result::Level TLevel, Result::Module TModule> struct Const_LM;
440 template <Result::Level TLevel> struct Const_L;
441
442 private:
GetCodeBits(bit32 mask,s32 shift)443 bit32 GetCodeBits(bit32 mask, s32 shift) const
444 {
445 return ((m_Code & mask) >> shift);
446 }
447
448 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription, int TDescriptionMin, int TDescriptionMax>
449 bool operator==(ConstRange<TLevel, TSummary, TModule, TDescription, TDescriptionMin, TDescriptionMax>) const;
450 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription, int TDescriptionMin, int TDescriptionMax>
451 bool operator!=(ConstRange<TLevel, TSummary, TModule, TDescription, TDescriptionMin, TDescriptionMax>) const;
452 };
453
454 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription>
455 struct Result::Const : public Result
456 {
457 static const Result::Level Level = TLevel;
458 static const Result::Summary Summary = TSummary;
459 static const Result::Module Module = TModule;
460 static const int Description = TDescription;
461
462 static const bit32 Value = static_cast<bit32>(
463 ((static_cast<bit32>(TLevel) << SHIFTS_LEVEL) & MASK_LEVEL) |
464 ((TSummary << SHIFTS_SUMMARY) & MASK_SUMMARY) |
465 ((TModule << SHIFTS_MODULE) & MASK_MODULE) |
466 ((TDescription << SHIFTS_DESCRIPTION) & MASK_DESCRIPTION) );
467
ConstConst468 Const() : Result(Value) {}
469
IncludesConst470 static bool Includes(Result result)
471 {
472 return result.GetModule() == TModule && result.GetDescription() == TDescription;
473 }
474 };
475
476 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription, int TDescriptionMin, int TDescriptionMax>
477 struct Result::ConstRange : public Result
478 {
479 static const Result::Level Level = TLevel;
480 static const Result::Summary Summary = TSummary;
481 static const Result::Module Module = TModule;
482 static const int Description = TDescription;
483 static const int DescriptionMin = TDescriptionMin;
484 static const int DescriptionMax = TDescriptionMax;
485
486 static const bit32 Value = static_cast<bit32>(
487 ((static_cast<bit32>(TLevel) << SHIFTS_LEVEL) & MASK_LEVEL) |
488 ((TSummary << SHIFTS_SUMMARY) & MASK_SUMMARY) |
489 ((TModule << SHIFTS_MODULE) & MASK_MODULE) |
490 ((TDescription << SHIFTS_DESCRIPTION) & MASK_DESCRIPTION) );
491
ConstRangeConstRange492 ConstRange() : Result(Value) {}
493
IncludesConstRange494 static bool Includes(Result result)
495 {
496 return result.GetModule() == TModule && (TDescriptionMin <= result.GetDescription() && result.GetDescription() <= TDescriptionMax);
497 }
498
499 friend bool operator<=(Result lhs, ConstRange) { return ConstRange::Includes(lhs); }
500 friend bool operator>=(ConstRange, Result rhs) { return ConstRange::Includes(rhs); }
501 private:
502 bool operator==(Result) const;
503 bool operator!=(Result) const;
504 };
505
506 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule>
507 struct Result::Const_LSM : public Result
508 {
509 static const Result::Level Level = TLevel;
510 static const Result::Summary Summary = TSummary;
511 static const Result::Module Module = TModule;
512
513 template <int TDescription>
514 struct Const : public Result::Const<TLevel, TSummary, TModule, TDescription> {};
515
Const_LSMConst_LSM516 Const_LSM(int description) : Result(TLevel, TSummary, TModule, description) {}
517 };
518
519 template <Result::Level TLevel, Result::Module TModule>
520 struct Result::Const_LM : public Result
521 {
522 static const Result::Level Level = TLevel;
523 static const Result::Module Module = TModule;
524
525 template <Result::Summary TSummary, int TDescription>
526 struct Const : public Result::Const<TLevel, TSummary, TModule, TDescription> {};
527
Const_LMConst_LM528 Const_LM(Result::Summary summary, int description) : Result(TLevel, summary, TModule, description) {}
529 };
530
531 template <Result::Level TLevel>
532 struct Result::Const_L : public Result
533 {
534 static const Result::Level Level = TLevel;
535
536 template <Result::Summary TSummary, Result::Module TModule, int TDescription>
537 struct Const : public Result::Const<TLevel, TSummary, TModule, TDescription> {};
538
Const_LConst_L539 Const_L(Result::Summary summary, Result::Module module, int description) : Result(TLevel, summary, module, description) {}
540 };
541
542 #define NN_DEFINE_RESULT_CONST(name, level, summary, module, description) \
543 typedef ::nn::Result::Const<(level), (summary), (module), (description)> name
544
545 #define NN_DEFINE_RESULT_CONST_RANGE(name, level, summary, module, description, descriptionMin, descriptionMax) \
546 typedef ::nn::Result::ConstRange<(level), (summary), (module), (description), (descriptionMin), (descriptionMax)> name
547
548 NN_DEFINE_RESULT_CONST(ResultSuccess, Result::LEVEL_SUCCESS, Result::SUMMARY_SUCCESS, Result::MODULE_COMMON, Result::DESCRIPTION_SUCCESS);
549
550 #define NN_DEFINE_RESULT_FUNC_LSM(name, level, summary, module) \
551 typedef ::nn::Result::Const_LSM<(level), (summary), (module)> name
552
553 #define NN_DEFINE_RESULT_CONST_LSM(name, f, description) \
554 typedef f::Const<(description)> name
555
556 #define NN_DEFINE_RESULT_FUNC_LM(name, level, module) \
557 typedef ::nn::Result::Const_LM<(level), (module)> name
558
559 #define NN_DEFINE_RESULT_CONST_LM(name, f, summary, description) \
560 typedef f::Const<(summary), (description)> name
561
562 #define NN_DEFINE_RESULT_FUNC_L(name, level) \
563 typedef ::nn::Result::Const_L<(level)> name
564
565 #define NN_DEFINE_RESULT_CONST_L(name, f, summary, module, description) \
566 typedef f::Const<(summary), (module), (description)> name
567
MakeInfoResult(Result::Summary summary,Result::Module module,int description)568 inline Result MakeInfoResult(Result::Summary summary, Result::Module module, int description)
569 { return Result(Result::LEVEL_INFO, summary, module, description); }
MakeFatalResult(Result::Summary summary,Result::Module module,int description)570 inline Result MakeFatalResult(Result::Summary summary, Result::Module module, int description)
571 { return Result(Result::LEVEL_FATAL, summary, module, description); }
MakeResetResult(Result::Summary summary,Result::Module module,int description)572 inline Result MakeResetResult(Result::Summary summary, Result::Module module, int description)
573 { return Result(Result::LEVEL_RESET, summary, module, description); }
MakeReInitResult(Result::Summary summary,Result::Module module,int description)574 inline Result MakeReInitResult(Result::Summary summary, Result::Module module, int description)
575 { return Result(Result::LEVEL_REINIT, summary, module, description); }
MakeUsageResult(Result::Summary summary,Result::Module module,int description)576 inline Result MakeUsageResult(Result::Summary summary, Result::Module module, int description)
577 { return Result(Result::LEVEL_USAGE, summary, module, description); }
MakePermanentResult(Result::Summary summary,Result::Module module,int description)578 inline Result MakePermanentResult(Result::Summary summary, Result::Module module, int description)
579 { return Result(Result::LEVEL_PERMANENT, summary, module, description); }
MakeTemporaryResult(Result::Summary summary,Result::Module module,int description)580 inline Result MakeTemporaryResult(Result::Summary summary, Result::Module module, int description)
581 { return Result(Result::LEVEL_TEMPORARY, summary, module, description); }
MakeStatusResult(Result::Summary summary,Result::Module module,int description)582 inline Result MakeStatusResult(Result::Summary summary, Result::Module module, int description)
583 { return Result(Result::LEVEL_STATUS, summary, module, description); }
584
585 }
586
587
588 #endif // __cplusplus
589
590 #ifdef __cplusplus
591 extern "C" {
592 #endif
593
594 typedef void (*nnResultHandlerImpl)(nnResult result, const char* filename, int lineno, const char* fmt, va_list vlist);
595
596 int nnResultFailureHandler(nnResult result, const char* filename, int lineno, const char* fmt, ...);
597 int nnResultTFailureHandler(nnResult result, const char* filename, int lineno, const char* fmt, ...);
598
599 int nnResultPanicHandler(nnResult result, const char* filename, int lineno, const char* fmt, ...);
600 int nnResultTPanicHandler(nnResult result, const char* filename, int lineno, const char* fmt, ...);
601
602 nnResult nnMakeInvalidResult(void);
603
604 #ifdef __cplusplus
605 }
606 #endif
607
608 #endif /* NN_RESULT_H_ */
609