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: 38834 $
14  *---------------------------------------------------------------------------*/
15 
16 /* Please see man pages for details
17 
18 
19 
20 
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 /* Please see man pages for details
33 
34 
35 */
36 
37 /* Please see man pages for details
38 
39 
40 
41 
42 
43 */
44 
45 
46 #ifdef __cplusplus
47 extern "C" {
48 #endif  // ifdef __cplusplus
49 
50 /* Please see man pages for details
51 
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 /* Please see man pages for details
79 
80 */
81 
82 class Result{
83 private:
84     static const bit32 MASK_FAIL_BIT        = 0x80000000u; // Most Significant Bit
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     /* Please see man pages for details
123 
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     /* Please see man pages for details
150 
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,  //
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     /* Please see man pages for details
171 
172 
173 
174 
175 
176      */
177     enum Module
178     {
179         MODULE_COMMON                   = 0,
180         MODULE_NN_KERNEL                = 1,
181         MODULE_NN_UTIL,
182         MODULE_NN_FILE_SERVER,
183         MODULE_NN_LOADER_SERVER,
184         MODULE_NN_TCB,
185         MODULE_NN_OS,
186         MODULE_NN_DBG,
187         MODULE_NN_DMNT,
188         MODULE_NN_PDN,
189         MODULE_NN_GX,
190         MODULE_NN_I2C,
191         MODULE_NN_GPIO,
192         MODULE_NN_DD,
193         MODULE_NN_CODEC,
194         MODULE_NN_SPI,
195         MODULE_NN_PXI,
196         MODULE_NN_FS,
197         MODULE_NN_DI,
198         MODULE_NN_HID,
199         MODULE_NN_CAMERA,
200         MODULE_NN_PI,
201         MODULE_NN_PM,
202         MODULE_NN_PMLOW,
203         MODULE_NN_FSI,
204         MODULE_NN_SRV,
205         MODULE_NN_NDM,
206         MODULE_NN_NWM,
207         MODULE_NN_SOCKET,
208         MODULE_NN_LDR,
209         MODULE_NN_ACC,
210         MODULE_NN_ROMFS,
211         MODULE_NN_AM,
212         MODULE_NN_HIO,
213         MODULE_NN_UPDATER,
214         MODULE_NN_MIC,
215         MODULE_NN_FND,
216         MODULE_NN_MP,
217         MODULE_NN_MPWL,
218         MODULE_NN_AC,
219         MODULE_NN_HTTP,
220         MODULE_NN_DSP,
221         MODULE_NN_SND,
222         MODULE_NN_DLP,
223         MODULE_NN_HIOLOW,
224         MODULE_NN_CSND,
225         MODULE_NN_SSL,
226         MODULE_NN_AMLOW,
227         MODULE_NN_NEX,
228         MODULE_NN_FRIENDS,
229         MODULE_NN_RDT,
230         MODULE_NN_APPLET,
231         MODULE_NN_NIM,
232         MODULE_NN_PTM,
233         MODULE_NN_MIDI,
234         MODULE_NN_MC,
235         MODULE_NN_SWC,
236         MODULE_NN_FATFS,
237         MODULE_NN_NGC,
238         MODULE_NN_CARD,
239         MODULE_NN_CARDNOR,
240         MODULE_NN_SDMC,
241         MODULE_NN_BOSS,
242         MODULE_NN_DBM,
243         MODULE_NN_CFG,
244         MODULE_NN_PS,
245         MODULE_NN_CEC,
246         MODULE_NN_IR,
247         MODULE_NN_UDS,
248         MODULE_NN_PL,
249         MODULE_NN_CUP,
250         MODULE_NN_GYROSCOPE,
251         MODULE_NN_MCU,
252         MODULE_NN_NS,
253         MODULE_NN_NEWS,
254         MODULE_NN_RO,
255         MODULE_NN_GD,
256         MODULE_NN_CARDSPI,
257 
258         MODULE_APPLICATION              = MAX_MODULE - 1,   //
259 
260         MODULE_INVALID_RESULT_VALUE     = MAX_MODULE        //
261     };
262 
263     /* Please see man pages for details
264 
265 
266 
267      */
268     enum Description
269     {
270         DESCRIPTION_SUCCESS                         =    0,  //
271 
272         DESCRIPTION_INVALID_SELECTION               = MAX_DESCRIPTION - 23,  //
273         DESCRIPTION_TOO_LARGE                       = MAX_DESCRIPTION - 22,  //
274         DESCRIPTION_NOT_AUTHORIZED                  = MAX_DESCRIPTION - 21,  //
275         DESCRIPTION_ALREADY_DONE                    = MAX_DESCRIPTION - 20,  //
276         DESCRIPTION_INVALID_SIZE                    = MAX_DESCRIPTION - 19,  //
277         DESCRIPTION_INVALID_ENUM_VALUE              = MAX_DESCRIPTION - 18,  //
278         DESCRIPTION_INVALID_COMBINATION             = MAX_DESCRIPTION - 17,  //
279         DESCRIPTION_NO_DATA                         = MAX_DESCRIPTION - 16,  //
280         DESCRIPTION_BUSY                            = MAX_DESCRIPTION - 15,  //
281         DESCRIPTION_MISALIGNED_ADDRESS              = MAX_DESCRIPTION - 14,  //
282         DESCRIPTION_MISALIGNED_SIZE                 = MAX_DESCRIPTION - 13,  //
283         DESCRIPTION_OUT_OF_MEMORY                   = MAX_DESCRIPTION - 12,  //
284         DESCRIPTION_NOT_IMPLEMENTED                 = MAX_DESCRIPTION - 11,  //
285         DESCRIPTION_INVALID_ADDRESS                 = MAX_DESCRIPTION - 10,  //
286         DESCRIPTION_INVALID_POINTER                 = MAX_DESCRIPTION -  9,  //
287         DESCRIPTION_INVALID_HANDLE                  = MAX_DESCRIPTION -  8,  //
288         DESCRIPTION_NOT_INITIALIZED                 = MAX_DESCRIPTION -  7,  //
289         DESCRIPTION_ALREADY_INITIALIZED             = MAX_DESCRIPTION -  6,  //
290         DESCRIPTION_NOT_FOUND                       = MAX_DESCRIPTION -  5,  //
291         DESCRIPTION_CANCEL_REQUESTED                = MAX_DESCRIPTION -  4,  //
292         DESCRIPTION_ALREADY_EXISTS                  = MAX_DESCRIPTION -  3,  //
293         DESCRIPTION_OUT_OF_RANGE                    = MAX_DESCRIPTION -  2,  //
294         DESCRIPTION_TIMEOUT                         = MAX_DESCRIPTION -  1,  //
295         DESCRIPTION_INVALID_RESULT_VALUE            = MAX_DESCRIPTION -  0   //
296     };
297 
298 private:
299 
300     bit32 m_Code;
301 
302     template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription> friend struct Const;
303     template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription, int TDescriptionMin, int TDescriptionMax> friend struct ConstRange;
Result(bit32 code)304     explicit Result(bit32 code) : m_Code(code) {}
305 
306 public:
Result()307     Result()
308         : m_Code( static_cast<bit32>(
309                     ((static_cast<bit32>(LEVEL_USAGE)   << SHIFTS_LEVEL)         & MASK_LEVEL)        |
310                     ((SUMMARY_INVALID_RESULT_VALUE      << SHIFTS_SUMMARY)       & MASK_SUMMARY)      |
311                     ((MODULE_INVALID_RESULT_VALUE       << SHIFTS_MODULE)        & MASK_MODULE)       |
312                     ((DESCRIPTION_INVALID_RESULT_VALUE  << SHIFTS_DESCRIPTION)   & MASK_DESCRIPTION) ))
313     {
314     }
315 
Result(Level level,Summary summary,Module module,int description)316     Result(Level level, Summary summary, Module module, int description)
317         : m_Code( static_cast<bit32>(
318                     ((level        << SHIFTS_LEVEL)         & MASK_LEVEL)        |
319                     ((summary      << SHIFTS_SUMMARY)       & MASK_SUMMARY)      |
320                     ((module       << SHIFTS_MODULE)        & MASK_MODULE)       |
321                     ((description  << SHIFTS_DESCRIPTION)   & MASK_DESCRIPTION) ))
322     {
323     }
324 
Result(nnResult result)325     Result(nnResult result) : m_Code(result.value) {}
326 /* Please see man pages for details
327 
328 
329 */
330     /* Please see man pages for details
331 
332      */
IsFailure()333     bool IsFailure() const
334     {
335         return (m_Code & MASK_FAIL_BIT) != 0;
336     }
337 
338     /* Please see man pages for details
339 
340      */
IsSuccess()341     bool IsSuccess() const
342     {
343         return !IsFailure();
344     }
345 /*
346 
347 */
348     /* Please see man pages for details
349 
350 
351 
352 
353      */
GetLevel()354     Level GetLevel() const
355     {
356         // TODO: Should create a platform-dependent arithmetic shift inline function and call it
357         if(m_Code & MASK_FAIL_BIT)
358         {
359             return static_cast<Level>( GetCodeBits(MASK_LEVEL, SHIFTS_LEVEL) | MASK_NEGATIVE_LEVEL);
360         }
361         else
362         {
363             return static_cast<Level>( GetCodeBits(MASK_LEVEL, SHIFTS_LEVEL) );
364         }
365     }
366 
367     /* Please see man pages for details
368 
369 
370 
371 
372      */
GetSummary()373     Summary GetSummary() const
374     {
375         return static_cast<Summary>( GetCodeBits(MASK_SUMMARY, SHIFTS_SUMMARY) );
376     }
377 
378     /* Please see man pages for details
379 
380 
381 
382 
383      */
GetModule()384     Module GetModule() const
385     {
386         return static_cast<Module>( GetCodeBits(MASK_MODULE, SHIFTS_MODULE) );
387     }
388 
389     /* Please see man pages for details
390 
391 
392 
393 
394      */
GetDescription()395     int GetDescription() const
396     {
397         return static_cast<int>( GetCodeBits(MASK_DESCRIPTION, SHIFTS_DESCRIPTION) );
398     }
399 
GetValue()400     bit32 GetValue() const { return m_Code; }
401 /* Please see man pages for details
402 
403 
404 */
405     /* Please see man pages for details
406 
407 
408 
409      */
GetPrintableBits()410     bit32 GetPrintableBits() const { return m_Code; }
411 
nnResult()412     operator nnResult() const
413     {
414         nnResult r = {m_Code};
415         return r;
416     }
417 /*
418 
419 */
420 /* Please see man pages for details
421 
422 
423 */
424     /* Please see man pages for details
425 
426 
427 
428 
429 
430 
431 
432      */
433     bool operator ==(const Result& rhs) const { return this->m_Code == rhs.m_Code; }
434 
435     /* Please see man pages for details
436 
437 
438 
439 
440 
441 
442 
443      */
444     bool operator !=(const Result& rhs) const { return this->m_Code != rhs.m_Code; }
445 /*
446 
447 */
448     template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription> struct Const;
449     template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription, int TDescriptionMin, int TDescriptionMax> struct ConstRange;
450     template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule> struct Const_LSM;
451     template <Result::Level TLevel, Result::Module TModule> struct Const_LM;
452     template <Result::Level TLevel> struct Const_L;
453 
454 private:
GetCodeBits(bit32 mask,s32 shift)455     bit32 GetCodeBits(bit32 mask, s32 shift) const
456     {
457         return ((m_Code & mask) >> shift);
458     }
459 
460     template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription, int TDescriptionMin, int TDescriptionMax>
461     bool operator==(ConstRange<TLevel, TSummary, TModule, TDescription, TDescriptionMin, TDescriptionMax>) const;
462     template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription, int TDescriptionMin, int TDescriptionMax>
463     bool operator!=(ConstRange<TLevel, TSummary, TModule, TDescription, TDescriptionMin, TDescriptionMax>) const;
464 };
465 
466 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription>
467 struct Result::Const : public Result
468 {
469     static const Result::Level Level = TLevel;
470     static const Result::Summary Summary = TSummary;
471     static const Result::Module Module = TModule;
472     static const int Description = TDescription;
473 
474     static const bit32 Value = static_cast<bit32>(
475                     ((static_cast<bit32>(TLevel) << SHIFTS_LEVEL) & MASK_LEVEL)        |
476                     ((TSummary     << SHIFTS_SUMMARY)             & MASK_SUMMARY)      |
477                     ((TModule      << SHIFTS_MODULE)              & MASK_MODULE)       |
478                     ((TDescription << SHIFTS_DESCRIPTION)         & MASK_DESCRIPTION) );
479 
ConstConst480     Const() : Result(Value) {}
481 
IncludesConst482     static bool Includes(Result result)
483     {
484         return result.GetModule() == TModule && result.GetDescription() == TDescription;
485     }
486 };
487 
488 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription, int TDescriptionMin, int TDescriptionMax>
489 struct Result::ConstRange : public Result
490 {
491     static const Result::Level Level = TLevel;
492     static const Result::Summary Summary = TSummary;
493     static const Result::Module Module = TModule;
494     static const int Description = TDescription;
495     static const int DescriptionMin = TDescriptionMin;
496     static const int DescriptionMax = TDescriptionMax;
497 
498     static const bit32 Value = static_cast<bit32>(
499                     ((static_cast<bit32>(TLevel) << SHIFTS_LEVEL) & MASK_LEVEL)        |
500                     ((TSummary     << SHIFTS_SUMMARY)             & MASK_SUMMARY)      |
501                     ((TModule      << SHIFTS_MODULE)              & MASK_MODULE)       |
502                     ((TDescription << SHIFTS_DESCRIPTION)         & MASK_DESCRIPTION) );
503 
ConstRangeConstRange504     ConstRange() : Result(Value) {}
505 
IncludesConstRange506     static bool Includes(Result result)
507     {
508         return result.GetModule() == TModule && (TDescriptionMin <= result.GetDescription() && result.GetDescription() <= TDescriptionMax);
509     }
510 
511     friend bool operator<=(Result lhs, ConstRange) { return ConstRange::Includes(lhs); }
512     friend bool operator>=(ConstRange, Result rhs) { return ConstRange::Includes(rhs); }
513 private:
514     bool operator==(Result) const;
515     bool operator!=(Result) const;
516 };
517 
518 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule>
519 struct Result::Const_LSM : public Result
520 {
521     static const Result::Level Level = TLevel;
522     static const Result::Summary Summary = TSummary;
523     static const Result::Module Module = TModule;
524 
525     template <int TDescription>
526     struct Const : public Result::Const<TLevel, TSummary, TModule, TDescription> {};
527 
Const_LSMConst_LSM528     Const_LSM(int description) : Result(TLevel, TSummary, TModule, description) {}
529 };
530 
531 template <Result::Level TLevel, Result::Module TModule>
532 struct Result::Const_LM : public Result
533 {
534     static const Result::Level Level = TLevel;
535     static const Result::Module Module = TModule;
536 
537     template <Result::Summary TSummary, int TDescription>
538     struct Const : public Result::Const<TLevel, TSummary, TModule, TDescription> {};
539 
Const_LMConst_LM540     Const_LM(Result::Summary summary, int description) : Result(TLevel, summary, TModule, description) {}
541 };
542 
543 template <Result::Level TLevel>
544 struct Result::Const_L : public Result
545 {
546     static const Result::Level Level = TLevel;
547 
548     template <Result::Summary TSummary, Result::Module TModule, int TDescription>
549     struct Const : public Result::Const<TLevel, TSummary, TModule, TDescription> {};
550 
Const_LConst_L551     Const_L(Result::Summary summary, Result::Module module, int description) : Result(TLevel, summary, module, description) {}
552 };
553 
554 #define NN_DEFINE_RESULT_CONST(name, level, summary, module, description) \
555     typedef ::nn::Result::Const<(level), (summary), (module), (description)> name
556 
557 #define NN_DEFINE_RESULT_CONST_RANGE(name, level, summary, module, description, descriptionMin, descriptionMax) \
558     typedef ::nn::Result::ConstRange<(level), (summary), (module), (description), (descriptionMin), (descriptionMax)> name
559 
560 NN_DEFINE_RESULT_CONST(ResultSuccess, Result::LEVEL_SUCCESS, Result::SUMMARY_SUCCESS, Result::MODULE_COMMON, Result::DESCRIPTION_SUCCESS);
561 
562 #define NN_DEFINE_RESULT_FUNC_LSM(name, level, summary, module) \
563     typedef ::nn::Result::Const_LSM<(level), (summary), (module)> name
564 
565 #define NN_DEFINE_RESULT_CONST_LSM(name, f, description) \
566     typedef f::Const<(description)> name
567 
568 #define NN_DEFINE_RESULT_FUNC_LM(name, level, module) \
569     typedef ::nn::Result::Const_LM<(level), (module)> name
570 
571 #define NN_DEFINE_RESULT_CONST_LM(name, f, summary, description) \
572     typedef f::Const<(summary), (description)> name
573 
574 #define NN_DEFINE_RESULT_FUNC_L(name, level) \
575     typedef ::nn::Result::Const_L<(level)> name
576 
577 #define NN_DEFINE_RESULT_CONST_L(name, f, summary, module, description) \
578     typedef f::Const<(summary), (module), (description)> name
579 
MakeInfoResult(Result::Summary summary,Result::Module module,int description)580 inline Result MakeInfoResult(Result::Summary summary, Result::Module module, int description)
581     { return Result(Result::LEVEL_INFO, summary, module, description); }
MakeFatalResult(Result::Summary summary,Result::Module module,int description)582 inline Result MakeFatalResult(Result::Summary summary, Result::Module module, int description)
583     { return Result(Result::LEVEL_FATAL, summary, module, description); }
MakeResetResult(Result::Summary summary,Result::Module module,int description)584 inline Result MakeResetResult(Result::Summary summary, Result::Module module, int description)
585     { return Result(Result::LEVEL_RESET, summary, module, description); }
MakeReInitResult(Result::Summary summary,Result::Module module,int description)586 inline Result MakeReInitResult(Result::Summary summary, Result::Module module, int description)
587     { return Result(Result::LEVEL_REINIT, summary, module, description); }
MakeUsageResult(Result::Summary summary,Result::Module module,int description)588 inline Result MakeUsageResult(Result::Summary summary, Result::Module module, int description)
589     { return Result(Result::LEVEL_USAGE, summary, module, description); }
MakePermanentResult(Result::Summary summary,Result::Module module,int description)590 inline Result MakePermanentResult(Result::Summary summary, Result::Module module, int description)
591     { return Result(Result::LEVEL_PERMANENT, summary, module, description); }
MakeTemporaryResult(Result::Summary summary,Result::Module module,int description)592 inline Result MakeTemporaryResult(Result::Summary summary, Result::Module module, int description)
593     { return Result(Result::LEVEL_TEMPORARY, summary, module, description); }
MakeStatusResult(Result::Summary summary,Result::Module module,int description)594 inline Result MakeStatusResult(Result::Summary summary, Result::Module module, int description)
595     { return Result(Result::LEVEL_STATUS, summary, module, description); }
596 
597 }
598 
599 
600 #endif // __cplusplus
601 
602 #ifdef __cplusplus
603 extern "C" {
604 #endif
605 
606 typedef void (*nnResultHandlerImpl)(nnResult result, const char* filename, int lineno, const char* fmt, va_list vlist);
607 
608 int nnResultFailureHandler(nnResult result, const char* filename, int lineno, const char* fmt, ...);
609 int nnResultTFailureHandler(nnResult result, const char* filename, int lineno, const char* fmt, ...);
610 
611 int nnResultPanicHandler(nnResult result, const char* filename, int lineno, const char* fmt, ...);
612 int nnResultTPanicHandler(nnResult result, const char* filename, int lineno, const char* fmt, ...);
613 
614 nnResult nnMakeInvalidResult(void);
615 
616 #ifdef __cplusplus
617 }
618 #endif
619 
620 #endif /* NN_RESULT_H_ */
621