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