1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     Result.h
4   Copyright (C)2009 Nintendo Co., Ltd.  All rights reserved.
5   These coded instructions, statements, and computer programs contain
6   proprietary information of Nintendo of America Inc. and/or Nintendo
7   Company Ltd., and are protected by Federal copyright law. They may
8   not be disclosed to third parties or copied or duplicated in any form,
9   in whole or in part, without the prior written consent of Nintendo.
10   $Rev: 34707 $
11  *---------------------------------------------------------------------------
12 
13 
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     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         MODULE_NN_CARDSPI,
255 
256         MODULE_APPLICATION              = MAX_MODULE - 1,
257 
258         MODULE_INVALID_RESULT_VALUE     = MAX_MODULE
259     };
260 
261     /* Please see man pages for details
262 
263 
264 
265      */
266     enum Description
267     {
268         DESCRIPTION_SUCCESS                         =    0,  //
269 
270         DESCRIPTION_INVALID_SELECTION               = MAX_DESCRIPTION - 23,  //
271         DESCRIPTION_TOO_LARGE                       = MAX_DESCRIPTION - 22,  //
272         DESCRIPTION_NOT_AUTHORIZED                  = MAX_DESCRIPTION - 21,  //
273         DESCRIPTION_ALREADY_DONE                    = MAX_DESCRIPTION - 20,  //
274         DESCRIPTION_INVALID_SIZE                    = MAX_DESCRIPTION - 19,  //
275         DESCRIPTION_INVALID_ENUM_VALUE              = MAX_DESCRIPTION - 18,  //
276         DESCRIPTION_INVALID_COMBINATION             = MAX_DESCRIPTION - 17,  //
277         DESCRIPTION_NO_DATA                         = MAX_DESCRIPTION - 16,  //
278         DESCRIPTION_BUSY                            = MAX_DESCRIPTION - 15,  //
279         DESCRIPTION_MISALIGNED_ADDRESS              = MAX_DESCRIPTION - 14,  //
280         DESCRIPTION_MISALIGNED_SIZE                 = MAX_DESCRIPTION - 13,  //
281         DESCRIPTION_OUT_OF_MEMORY                   = MAX_DESCRIPTION - 12,  //
282         DESCRIPTION_NOT_IMPLEMENTED                 = MAX_DESCRIPTION - 11,  //
283         DESCRIPTION_INVALID_ADDRESS                 = MAX_DESCRIPTION - 10,  //
284         DESCRIPTION_INVALID_POINTER                 = MAX_DESCRIPTION -  9,  //
285         DESCRIPTION_INVALID_HANDLE                  = MAX_DESCRIPTION -  8,  //
286         DESCRIPTION_NOT_INITIALIZED                 = MAX_DESCRIPTION -  7,  //
287         DESCRIPTION_ALREADY_INITIALIZED             = MAX_DESCRIPTION -  6,  //
288         DESCRIPTION_NOT_FOUND                       = MAX_DESCRIPTION -  5,  //
289         DESCRIPTION_CANCEL_REQUESTED                = MAX_DESCRIPTION -  4,  //
290         DESCRIPTION_ALREADY_EXISTS                  = MAX_DESCRIPTION -  3,  //
291         DESCRIPTION_OUT_OF_RANGE                    = MAX_DESCRIPTION -  2,  //
292         DESCRIPTION_TIMEOUT                         = MAX_DESCRIPTION -  1,  //
293         DESCRIPTION_INVALID_RESULT_VALUE            = MAX_DESCRIPTION -  0
294     };
295 
296 private:
297 
298     bit32 m_Code;
299 
300     template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription> friend struct Const;
301     template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription, int TDescriptionMin, int TDescriptionMax> friend struct ConstRange;
Result(bit32 code)302     explicit Result(bit32 code) : m_Code(code) {}
303 
304 public:
Result()305     Result()
306         : m_Code( static_cast<bit32>(
307                     ((static_cast<bit32>(LEVEL_USAGE)   << SHIFTS_LEVEL)         & MASK_LEVEL)        |
308                     ((SUMMARY_INVALID_RESULT_VALUE      << SHIFTS_SUMMARY)       & MASK_SUMMARY)      |
309                     ((MODULE_INVALID_RESULT_VALUE       << SHIFTS_MODULE)        & MASK_MODULE)       |
310                     ((DESCRIPTION_INVALID_RESULT_VALUE  << SHIFTS_DESCRIPTION)   & MASK_DESCRIPTION) ))
311     {
312     }
313 
Result(Level level,Summary summary,Module module,int description)314     Result(Level level, Summary summary, Module module, int description)
315         : m_Code( static_cast<bit32>(
316                     ((level        << SHIFTS_LEVEL)         & MASK_LEVEL)        |
317                     ((summary      << SHIFTS_SUMMARY)       & MASK_SUMMARY)      |
318                     ((module       << SHIFTS_MODULE)        & MASK_MODULE)       |
319                     ((description  << SHIFTS_DESCRIPTION)   & MASK_DESCRIPTION) ))
320     {
321     }
322 
Result(nnResult result)323     Result(nnResult result) : m_Code(result.value) {}
324 /* Please see man pages for details
325 
326 
327 */
328     /* Please see man pages for details
329 
330      */
IsFailure()331     bool IsFailure() const
332     {
333         return (m_Code & MASK_FAIL_BIT) != 0;
334     }
335 
336     /* Please see man pages for details
337 
338      */
IsSuccess()339     bool IsSuccess() const
340     {
341         return !IsFailure();
342     }
343 /*
344 
345 */
346     /* Please see man pages for details
347 
348 
349 
350 
351      */
GetLevel()352     Level GetLevel() const
353     {
354         // TODO: Create platform-dependent function for arithmetic shift in-line, and this function should be called
355         if(m_Code & MASK_FAIL_BIT)
356         {
357             return static_cast<Level>( GetCodeBits(MASK_LEVEL, SHIFTS_LEVEL) | MASK_NEGATIVE_LEVEL);
358         }
359         else
360         {
361             return static_cast<Level>( GetCodeBits(MASK_LEVEL, SHIFTS_LEVEL) );
362         }
363     }
364 
365     /* Please see man pages for details
366 
367 
368 
369 
370      */
GetSummary()371     Summary GetSummary() const
372     {
373         return static_cast<Summary>( GetCodeBits(MASK_SUMMARY, SHIFTS_SUMMARY) );
374     }
375 
376     /* Please see man pages for details
377 
378 
379 
380 
381      */
GetModule()382     Module GetModule() const
383     {
384         return static_cast<Module>( GetCodeBits(MASK_MODULE, SHIFTS_MODULE) );
385     }
386 
387     /* Please see man pages for details
388 
389 
390 
391 
392      */
GetDescription()393     int GetDescription() const
394     {
395         return static_cast<int>( GetCodeBits(MASK_DESCRIPTION, SHIFTS_DESCRIPTION) );
396     }
397 
GetValue()398     bit32 GetValue() const { return m_Code; }
399 /* Please see man pages for details
400 
401 
402 */
403     /* Please see man pages for details
404 
405 
406 
407      */
GetPrintableBits()408     bit32 GetPrintableBits() const { return m_Code; }
409 
nnResult()410     operator nnResult() const
411     {
412         nnResult r = {m_Code};
413         return r;
414     }
415 /*
416 
417 */
418 /* Please see man pages for details
419 
420 
421 */
422     /* Please see man pages for details
423 
424 
425 
426 
427 
428      */
429     bool operator ==(const Result& rhs) const { return this->m_Code == rhs.m_Code; }
430 
431     /* Please see man pages for details
432 
433 
434 
435 
436 
437      */
438     bool operator !=(const Result& rhs) const { return this->m_Code != rhs.m_Code; }
439 /*
440 
441 */
442     template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription> struct Const;
443     template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription, int TDescriptionMin, int TDescriptionMax> struct ConstRange;
444     template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule> struct Const_LSM;
445     template <Result::Level TLevel, Result::Module TModule> struct Const_LM;
446     template <Result::Level TLevel> struct Const_L;
447 
448 private:
GetCodeBits(bit32 mask,s32 shift)449     bit32 GetCodeBits(bit32 mask, s32 shift) const
450     {
451         return ((m_Code & mask) >> shift);
452     }
453 
454     template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription, int TDescriptionMin, int TDescriptionMax>
455     bool operator==(ConstRange<TLevel, TSummary, TModule, TDescription, TDescriptionMin, TDescriptionMax>) const;
456     template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription, int TDescriptionMin, int TDescriptionMax>
457     bool operator!=(ConstRange<TLevel, TSummary, TModule, TDescription, TDescriptionMin, TDescriptionMax>) const;
458 };
459 
460 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription>
461 struct Result::Const : public Result
462 {
463     static const Result::Level Level = TLevel;
464     static const Result::Summary Summary = TSummary;
465     static const Result::Module Module = TModule;
466     static const int Description = TDescription;
467 
468     static const bit32 Value = static_cast<bit32>(
469                     ((static_cast<bit32>(TLevel) << SHIFTS_LEVEL) & MASK_LEVEL)        |
470                     ((TSummary     << SHIFTS_SUMMARY)             & MASK_SUMMARY)      |
471                     ((TModule      << SHIFTS_MODULE)              & MASK_MODULE)       |
472                     ((TDescription << SHIFTS_DESCRIPTION)         & MASK_DESCRIPTION) );
473 
ConstConst474     Const() : Result(Value) {}
475 
IncludesConst476     static bool Includes(Result result)
477     {
478         return result.GetModule() == TModule && result.GetDescription() == TDescription;
479     }
480 };
481 
482 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription, int TDescriptionMin, int TDescriptionMax>
483 struct Result::ConstRange : public Result
484 {
485     static const Result::Level Level = TLevel;
486     static const Result::Summary Summary = TSummary;
487     static const Result::Module Module = TModule;
488     static const int Description = TDescription;
489     static const int DescriptionMin = TDescriptionMin;
490     static const int DescriptionMax = TDescriptionMax;
491 
492     static const bit32 Value = static_cast<bit32>(
493                     ((static_cast<bit32>(TLevel) << SHIFTS_LEVEL) & MASK_LEVEL)        |
494                     ((TSummary     << SHIFTS_SUMMARY)             & MASK_SUMMARY)      |
495                     ((TModule      << SHIFTS_MODULE)              & MASK_MODULE)       |
496                     ((TDescription << SHIFTS_DESCRIPTION)         & MASK_DESCRIPTION) );
497 
ConstRangeConstRange498     ConstRange() : Result(Value) {}
499 
IncludesConstRange500     static bool Includes(Result result)
501     {
502         return result.GetModule() == TModule && (TDescriptionMin <= result.GetDescription() && result.GetDescription() <= TDescriptionMax);
503     }
504 
505     friend bool operator<=(Result lhs, ConstRange) { return ConstRange::Includes(lhs); }
506     friend bool operator>=(ConstRange, Result rhs) { return ConstRange::Includes(rhs); }
507 private:
508     bool operator==(Result) const;
509     bool operator!=(Result) const;
510 };
511 
512 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule>
513 struct Result::Const_LSM : public Result
514 {
515     static const Result::Level Level = TLevel;
516     static const Result::Summary Summary = TSummary;
517     static const Result::Module Module = TModule;
518 
519     template <int TDescription>
520     struct Const : public Result::Const<TLevel, TSummary, TModule, TDescription> {};
521 
Const_LSMConst_LSM522     Const_LSM(int description) : Result(TLevel, TSummary, TModule, description) {}
523 };
524 
525 template <Result::Level TLevel, Result::Module TModule>
526 struct Result::Const_LM : public Result
527 {
528     static const Result::Level Level = TLevel;
529     static const Result::Module Module = TModule;
530 
531     template <Result::Summary TSummary, int TDescription>
532     struct Const : public Result::Const<TLevel, TSummary, TModule, TDescription> {};
533 
Const_LMConst_LM534     Const_LM(Result::Summary summary, int description) : Result(TLevel, summary, TModule, description) {}
535 };
536 
537 template <Result::Level TLevel>
538 struct Result::Const_L : public Result
539 {
540     static const Result::Level Level = TLevel;
541 
542     template <Result::Summary TSummary, Result::Module TModule, int TDescription>
543     struct Const : public Result::Const<TLevel, TSummary, TModule, TDescription> {};
544 
Const_LConst_L545     Const_L(Result::Summary summary, Result::Module module, int description) : Result(TLevel, summary, module, description) {}
546 };
547 
548 #define NN_DEFINE_RESULT_CONST(name, level, summary, module, description) \
549     typedef ::nn::Result::Const<(level), (summary), (module), (description)> name
550 
551 #define NN_DEFINE_RESULT_CONST_RANGE(name, level, summary, module, description, descriptionMin, descriptionMax) \
552     typedef ::nn::Result::ConstRange<(level), (summary), (module), (description), (descriptionMin), (descriptionMax)> name
553 
554 NN_DEFINE_RESULT_CONST(ResultSuccess, Result::LEVEL_SUCCESS, Result::SUMMARY_SUCCESS, Result::MODULE_COMMON, Result::DESCRIPTION_SUCCESS);
555 
556 #define NN_DEFINE_RESULT_FUNC_LSM(name, level, summary, module) \
557     typedef ::nn::Result::Const_LSM<(level), (summary), (module)> name
558 
559 #define NN_DEFINE_RESULT_CONST_LSM(name, f, description) \
560     typedef f::Const<(description)> name
561 
562 #define NN_DEFINE_RESULT_FUNC_LM(name, level, module) \
563     typedef ::nn::Result::Const_LM<(level), (module)> name
564 
565 #define NN_DEFINE_RESULT_CONST_LM(name, f, summary, description) \
566     typedef f::Const<(summary), (description)> name
567 
568 #define NN_DEFINE_RESULT_FUNC_L(name, level) \
569     typedef ::nn::Result::Const_L<(level)> name
570 
571 #define NN_DEFINE_RESULT_CONST_L(name, f, summary, module, description) \
572     typedef f::Const<(summary), (module), (description)> name
573 
MakeInfoResult(Result::Summary summary,Result::Module module,int description)574 inline Result MakeInfoResult(Result::Summary summary, Result::Module module, int description)
575     { return Result(Result::LEVEL_INFO, summary, module, description); }
MakeFatalResult(Result::Summary summary,Result::Module module,int description)576 inline Result MakeFatalResult(Result::Summary summary, Result::Module module, int description)
577     { return Result(Result::LEVEL_FATAL, summary, module, description); }
MakeResetResult(Result::Summary summary,Result::Module module,int description)578 inline Result MakeResetResult(Result::Summary summary, Result::Module module, int description)
579     { return Result(Result::LEVEL_RESET, summary, module, description); }
MakeReInitResult(Result::Summary summary,Result::Module module,int description)580 inline Result MakeReInitResult(Result::Summary summary, Result::Module module, int description)
581     { return Result(Result::LEVEL_REINIT, summary, module, description); }
MakeUsageResult(Result::Summary summary,Result::Module module,int description)582 inline Result MakeUsageResult(Result::Summary summary, Result::Module module, int description)
583     { return Result(Result::LEVEL_USAGE, summary, module, description); }
MakePermanentResult(Result::Summary summary,Result::Module module,int description)584 inline Result MakePermanentResult(Result::Summary summary, Result::Module module, int description)
585     { return Result(Result::LEVEL_PERMANENT, summary, module, description); }
MakeTemporaryResult(Result::Summary summary,Result::Module module,int description)586 inline Result MakeTemporaryResult(Result::Summary summary, Result::Module module, int description)
587     { return Result(Result::LEVEL_TEMPORARY, summary, module, description); }
MakeStatusResult(Result::Summary summary,Result::Module module,int description)588 inline Result MakeStatusResult(Result::Summary summary, Result::Module module, int description)
589     { return Result(Result::LEVEL_STATUS, summary, module, description); }
590 
591 }
592 
593 
594 #endif // __cplusplus
595 
596 #ifdef __cplusplus
597 extern "C" {
598 #endif
599 
600 typedef void (*nnResultHandlerImpl)(nnResult result, const char* filename, int lineno, const char* fmt, va_list vlist);
601 
602 int nnResultFailureHandler(nnResult result, const char* filename, int lineno, const char* fmt, ...);
603 int nnResultTFailureHandler(nnResult result, const char* filename, int lineno, const char* fmt, ...);
604 
605 int nnResultPanicHandler(nnResult result, const char* filename, int lineno, const char* fmt, ...);
606 int nnResultTPanicHandler(nnResult result, const char* filename, int lineno, const char* fmt, ...);
607 
608 nnResult nnMakeInvalidResult(void);
609 
610 #ifdef __cplusplus
611 }
612 #endif
613 
614 #endif /* NN_RESULT_H_ */
615