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