1 /*---------------------------------------------------------------------------*
2 
3   Copyright (C) 2009-2013 Nintendo.  All rights reserved.
4 
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 
11  *---------------------------------------------------------------------------*/
12 template <Result::LegacyLevel TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription>
13 struct Result::Const : public Result
14 {
15     static const Result::LegacyLevel Level = TLevel;
16     static const Result::Summary Summary = TSummary;
17     static const Result::Module Module = TModule;
18     static const int Description = TDescription;
19 
20     static const bit32 Value = TemplateMakeLegacyResult<TLevel, TSummary, TModule, TDescription>::Value;
21 
ConstConst22     Const() : Result(Value) {}
23 
IncludesConst24     static bool Includes(Result result) { return result.GetValue() == Value; }
25     friend bool operator<=(Result lhs, const Const<TLevel, TSummary, TModule, TDescription>& rhs) { return Includes(lhs); }
26     friend bool operator>=(const Const<TLevel, TSummary, TModule, TDescription>, Result rhs) { return Includes(rhs); }
27 };
28 
29 template <Result::LegacyLevel TLevel, Result::Summary TSummary, Result::Module TModule>
30 struct Result::Const_LSM : public Result
31 {
32     static const Result::LegacyLevel Level = TLevel;
33     static const Result::Summary Summary = TSummary;
34     static const Result::Module Module = TModule;
35 
36     template <int TDescription>
37     struct Const : public Result::Const<TLevel, TSummary, TModule, TDescription> {};
38 
Const_LSMConst_LSM39     Const_LSM(int description) : Result(TLevel, TSummary, TModule, description) {}
40 
IncludesConst_LSM41     bool Includes(Result result) { return result == *this; }
42     friend bool operator<=(Result lhs, const Const_LSM<TLevel, TSummary, TModule>&) { return Includes(lhs); }
43     friend bool operator>=(const Const_LSM<TLevel, TSummary, TModule>&, Result rhs) { return Includes(rhs); }
44 };
45 
46 template <Result::LegacyLevel TLevel, Result::Module TModule>
47 struct Result::Const_LM : public Result
48 {
49     static const Result::LegacyLevel Level = TLevel;
50     static const Result::Module Module = TModule;
51 
52     template <Result::Summary TSummary, int TDescription>
53     struct Const : public Result::Const<TLevel, TSummary, TModule, TDescription> {};
54 
Const_LMConst_LM55     Const_LM(Result::Summary summary, int description) : Result(TLevel, summary, TModule, description) {}
56 
IncludesConst_LM57     bool Includes(Result result) { return result == *this; }
58     friend bool operator<=(Result lhs, const Const_LM<TLevel, TModule>&) { return Includes(lhs); }
59     friend bool operator>=(const Const_LM<TLevel, TModule>&, Result rhs) { return Includes(rhs); }
60 };
61 
62 template <Result::LegacyLevel TLevel>
63 struct Result::Const_L : public Result
64 {
65     static const Result::LegacyLevel Level = TLevel;
66 
67     template <Result::Summary TSummary, Result::Module TModule, int TDescription>
68     struct Const : public Result::Const<TLevel, TSummary, TModule, TDescription> {};
69 
Const_LConst_L70     Const_L(Result::Summary summary, Result::Module module, int description) : Result(TLevel, summary, module, description) {}
71 
IncludesConst_L72     bool Includes(Result result) { return result == *this; }
73     friend bool operator<=(Result lhs, const Const_L<TLevel>&) { return Includes(lhs); }
74     friend bool operator>=(const Const_L<TLevel>&, Result rhs) { return Includes(rhs); }
75 };
76 
77 #define NN_DEFINE_RESULT_CONST(name, level, summary, module, description) \
78     typedef ::nn::Result::Const<(level), (summary), (module), (description)> name
79 
80 #define NN_DEFINE_RESULT_FUNC_LSM(name, level, summary, module) \
81     typedef ::nn::Result::Const_LSM<(level), (summary), (module)> name
82 
83 #define NN_DEFINE_RESULT_CONST_LSM(name, f, description) \
84     typedef f::Const<(description)> name
85 
86 #define NN_DEFINE_RESULT_FUNC_LM(name, level, module) \
87     typedef ::nn::Result::Const_LM<(level), (module)> name
88 
89 #define NN_DEFINE_RESULT_CONST_LM(name, f, summary, description) \
90     typedef f::Const<(summary), (description)> name
91 
92 #define NN_DEFINE_RESULT_FUNC_L(name, level) \
93     typedef ::nn::Result::Const_L<(level)> name
94 
95 #define NN_DEFINE_RESULT_CONST_L(name, f, summary, module, description) \
96     typedef f::Const<(summary), (module), (description)> name
97 
MakeInfoResult(Result::Summary summary,Result::Module module,int description)98 inline Result MakeInfoResult(Result::Summary summary, Result::Module module, int description)
99     { return Result(Result::LEVEL_INFO, summary, module, description); }
MakeFatalResult(Result::Summary summary,Result::Module module,int description)100 inline Result MakeFatalResult(Result::Summary summary, Result::Module module, int description)
101     { return Result(Result::LEVEL_FATAL, summary, module, description); }
MakeResetResult(Result::Summary summary,Result::Module module,int description)102 inline Result MakeResetResult(Result::Summary summary, Result::Module module, int description)
103     { return Result(Result::LEVEL_RESET, summary, module, description); }
MakeReInitResult(Result::Summary summary,Result::Module module,int description)104 inline Result MakeReInitResult(Result::Summary summary, Result::Module module, int description)
105     { return Result(Result::LEVEL_REINIT, summary, module, description); }
MakeUsageResult(Result::Summary summary,Result::Module module,int description)106 inline Result MakeUsageResult(Result::Summary summary, Result::Module module, int description)
107     { return Result(Result::LEVEL_USAGE, summary, module, description); }
MakePermanentResult(Result::Summary summary,Result::Module module,int description)108 inline Result MakePermanentResult(Result::Summary summary, Result::Module module, int description)
109     { return Result(Result::LEVEL_PERMANENT, summary, module, description); }
MakeTemporaryResult(Result::Summary summary,Result::Module module,int description)110 inline Result MakeTemporaryResult(Result::Summary summary, Result::Module module, int description)
111     { return Result(Result::LEVEL_TEMPORARY, summary, module, description); }
MakeStatusResult(Result::Summary summary,Result::Module module,int description)112 inline Result MakeStatusResult(Result::Summary summary, Result::Module module, int description)
113     { return Result(Result::LEVEL_STATUS, summary, module, description); }
114