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