include/ylt/reflection/template_switch.hpp (529 lines of code) (raw):
#pragma once
namespace ylt::reflection {
[[noreturn]] inline void unreachable() {
// Uses compiler specific extensions if possible.
// Even if no extension is used, undefined behavior is still raised by
// an empty function body and the noreturn attribute.
#ifdef __GNUC__ // GCC, Clang, ICC
__builtin_unreachable();
#elif defined(_MSC_VER) // msvc
__assume(false);
#endif
}
template <typename Func, typename... Args>
constexpr decltype(auto) inline template_switch(size_t index, Args &&...args) {
switch (index) {
case 0:
return Func::template run<0>(std::forward<Args>(args)...);
case 1:
return Func::template run<1>(std::forward<Args>(args)...);
case 2:
return Func::template run<2>(std::forward<Args>(args)...);
case 3:
return Func::template run<3>(std::forward<Args>(args)...);
case 4:
return Func::template run<4>(std::forward<Args>(args)...);
case 5:
return Func::template run<5>(std::forward<Args>(args)...);
case 6:
return Func::template run<6>(std::forward<Args>(args)...);
case 7:
return Func::template run<7>(std::forward<Args>(args)...);
case 8:
return Func::template run<8>(std::forward<Args>(args)...);
case 9:
return Func::template run<9>(std::forward<Args>(args)...);
case 10:
return Func::template run<10>(std::forward<Args>(args)...);
case 11:
return Func::template run<11>(std::forward<Args>(args)...);
case 12:
return Func::template run<12>(std::forward<Args>(args)...);
case 13:
return Func::template run<13>(std::forward<Args>(args)...);
case 14:
return Func::template run<14>(std::forward<Args>(args)...);
case 15:
return Func::template run<15>(std::forward<Args>(args)...);
case 16:
return Func::template run<16>(std::forward<Args>(args)...);
case 17:
return Func::template run<17>(std::forward<Args>(args)...);
case 18:
return Func::template run<18>(std::forward<Args>(args)...);
case 19:
return Func::template run<19>(std::forward<Args>(args)...);
case 20:
return Func::template run<20>(std::forward<Args>(args)...);
case 21:
return Func::template run<21>(std::forward<Args>(args)...);
case 22:
return Func::template run<22>(std::forward<Args>(args)...);
case 23:
return Func::template run<23>(std::forward<Args>(args)...);
case 24:
return Func::template run<24>(std::forward<Args>(args)...);
case 25:
return Func::template run<25>(std::forward<Args>(args)...);
case 26:
return Func::template run<26>(std::forward<Args>(args)...);
case 27:
return Func::template run<27>(std::forward<Args>(args)...);
case 28:
return Func::template run<28>(std::forward<Args>(args)...);
case 29:
return Func::template run<29>(std::forward<Args>(args)...);
case 30:
return Func::template run<30>(std::forward<Args>(args)...);
case 31:
return Func::template run<31>(std::forward<Args>(args)...);
case 32:
return Func::template run<32>(std::forward<Args>(args)...);
case 33:
return Func::template run<33>(std::forward<Args>(args)...);
case 34:
return Func::template run<34>(std::forward<Args>(args)...);
case 35:
return Func::template run<35>(std::forward<Args>(args)...);
case 36:
return Func::template run<36>(std::forward<Args>(args)...);
case 37:
return Func::template run<37>(std::forward<Args>(args)...);
case 38:
return Func::template run<38>(std::forward<Args>(args)...);
case 39:
return Func::template run<39>(std::forward<Args>(args)...);
case 40:
return Func::template run<40>(std::forward<Args>(args)...);
case 41:
return Func::template run<41>(std::forward<Args>(args)...);
case 42:
return Func::template run<42>(std::forward<Args>(args)...);
case 43:
return Func::template run<43>(std::forward<Args>(args)...);
case 44:
return Func::template run<44>(std::forward<Args>(args)...);
case 45:
return Func::template run<45>(std::forward<Args>(args)...);
case 46:
return Func::template run<46>(std::forward<Args>(args)...);
case 47:
return Func::template run<47>(std::forward<Args>(args)...);
case 48:
return Func::template run<48>(std::forward<Args>(args)...);
case 49:
return Func::template run<49>(std::forward<Args>(args)...);
case 50:
return Func::template run<50>(std::forward<Args>(args)...);
case 51:
return Func::template run<51>(std::forward<Args>(args)...);
case 52:
return Func::template run<52>(std::forward<Args>(args)...);
case 53:
return Func::template run<53>(std::forward<Args>(args)...);
case 54:
return Func::template run<54>(std::forward<Args>(args)...);
case 55:
return Func::template run<55>(std::forward<Args>(args)...);
case 56:
return Func::template run<56>(std::forward<Args>(args)...);
case 57:
return Func::template run<57>(std::forward<Args>(args)...);
case 58:
return Func::template run<58>(std::forward<Args>(args)...);
case 59:
return Func::template run<59>(std::forward<Args>(args)...);
case 60:
return Func::template run<60>(std::forward<Args>(args)...);
case 61:
return Func::template run<61>(std::forward<Args>(args)...);
case 62:
return Func::template run<62>(std::forward<Args>(args)...);
case 63:
return Func::template run<63>(std::forward<Args>(args)...);
case 64:
return Func::template run<64>(std::forward<Args>(args)...);
case 65:
return Func::template run<65>(std::forward<Args>(args)...);
case 66:
return Func::template run<66>(std::forward<Args>(args)...);
case 67:
return Func::template run<67>(std::forward<Args>(args)...);
case 68:
return Func::template run<68>(std::forward<Args>(args)...);
case 69:
return Func::template run<69>(std::forward<Args>(args)...);
case 70:
return Func::template run<70>(std::forward<Args>(args)...);
case 71:
return Func::template run<71>(std::forward<Args>(args)...);
case 72:
return Func::template run<72>(std::forward<Args>(args)...);
case 73:
return Func::template run<73>(std::forward<Args>(args)...);
case 74:
return Func::template run<74>(std::forward<Args>(args)...);
case 75:
return Func::template run<75>(std::forward<Args>(args)...);
case 76:
return Func::template run<76>(std::forward<Args>(args)...);
case 77:
return Func::template run<77>(std::forward<Args>(args)...);
case 78:
return Func::template run<78>(std::forward<Args>(args)...);
case 79:
return Func::template run<79>(std::forward<Args>(args)...);
case 80:
return Func::template run<80>(std::forward<Args>(args)...);
case 81:
return Func::template run<81>(std::forward<Args>(args)...);
case 82:
return Func::template run<82>(std::forward<Args>(args)...);
case 83:
return Func::template run<83>(std::forward<Args>(args)...);
case 84:
return Func::template run<84>(std::forward<Args>(args)...);
case 85:
return Func::template run<85>(std::forward<Args>(args)...);
case 86:
return Func::template run<86>(std::forward<Args>(args)...);
case 87:
return Func::template run<87>(std::forward<Args>(args)...);
case 88:
return Func::template run<88>(std::forward<Args>(args)...);
case 89:
return Func::template run<89>(std::forward<Args>(args)...);
case 90:
return Func::template run<90>(std::forward<Args>(args)...);
case 91:
return Func::template run<91>(std::forward<Args>(args)...);
case 92:
return Func::template run<92>(std::forward<Args>(args)...);
case 93:
return Func::template run<93>(std::forward<Args>(args)...);
case 94:
return Func::template run<94>(std::forward<Args>(args)...);
case 95:
return Func::template run<95>(std::forward<Args>(args)...);
case 96:
return Func::template run<96>(std::forward<Args>(args)...);
case 97:
return Func::template run<97>(std::forward<Args>(args)...);
case 98:
return Func::template run<98>(std::forward<Args>(args)...);
case 99:
return Func::template run<99>(std::forward<Args>(args)...);
case 100:
return Func::template run<100>(std::forward<Args>(args)...);
case 101:
return Func::template run<101>(std::forward<Args>(args)...);
case 102:
return Func::template run<102>(std::forward<Args>(args)...);
case 103:
return Func::template run<103>(std::forward<Args>(args)...);
case 104:
return Func::template run<104>(std::forward<Args>(args)...);
case 105:
return Func::template run<105>(std::forward<Args>(args)...);
case 106:
return Func::template run<106>(std::forward<Args>(args)...);
case 107:
return Func::template run<107>(std::forward<Args>(args)...);
case 108:
return Func::template run<108>(std::forward<Args>(args)...);
case 109:
return Func::template run<109>(std::forward<Args>(args)...);
case 110:
return Func::template run<110>(std::forward<Args>(args)...);
case 111:
return Func::template run<111>(std::forward<Args>(args)...);
case 112:
return Func::template run<112>(std::forward<Args>(args)...);
case 113:
return Func::template run<113>(std::forward<Args>(args)...);
case 114:
return Func::template run<114>(std::forward<Args>(args)...);
case 115:
return Func::template run<115>(std::forward<Args>(args)...);
case 116:
return Func::template run<116>(std::forward<Args>(args)...);
case 117:
return Func::template run<117>(std::forward<Args>(args)...);
case 118:
return Func::template run<118>(std::forward<Args>(args)...);
case 119:
return Func::template run<119>(std::forward<Args>(args)...);
case 120:
return Func::template run<120>(std::forward<Args>(args)...);
case 121:
return Func::template run<121>(std::forward<Args>(args)...);
case 122:
return Func::template run<122>(std::forward<Args>(args)...);
case 123:
return Func::template run<123>(std::forward<Args>(args)...);
case 124:
return Func::template run<124>(std::forward<Args>(args)...);
case 125:
return Func::template run<125>(std::forward<Args>(args)...);
case 126:
return Func::template run<126>(std::forward<Args>(args)...);
case 127:
return Func::template run<127>(std::forward<Args>(args)...);
case 128:
return Func::template run<128>(std::forward<Args>(args)...);
case 129:
return Func::template run<129>(std::forward<Args>(args)...);
case 130:
return Func::template run<130>(std::forward<Args>(args)...);
case 131:
return Func::template run<131>(std::forward<Args>(args)...);
case 132:
return Func::template run<132>(std::forward<Args>(args)...);
case 133:
return Func::template run<133>(std::forward<Args>(args)...);
case 134:
return Func::template run<134>(std::forward<Args>(args)...);
case 135:
return Func::template run<135>(std::forward<Args>(args)...);
case 136:
return Func::template run<136>(std::forward<Args>(args)...);
case 137:
return Func::template run<137>(std::forward<Args>(args)...);
case 138:
return Func::template run<138>(std::forward<Args>(args)...);
case 139:
return Func::template run<139>(std::forward<Args>(args)...);
case 140:
return Func::template run<140>(std::forward<Args>(args)...);
case 141:
return Func::template run<141>(std::forward<Args>(args)...);
case 142:
return Func::template run<142>(std::forward<Args>(args)...);
case 143:
return Func::template run<143>(std::forward<Args>(args)...);
case 144:
return Func::template run<144>(std::forward<Args>(args)...);
case 145:
return Func::template run<145>(std::forward<Args>(args)...);
case 146:
return Func::template run<146>(std::forward<Args>(args)...);
case 147:
return Func::template run<147>(std::forward<Args>(args)...);
case 148:
return Func::template run<148>(std::forward<Args>(args)...);
case 149:
return Func::template run<149>(std::forward<Args>(args)...);
case 150:
return Func::template run<150>(std::forward<Args>(args)...);
case 151:
return Func::template run<151>(std::forward<Args>(args)...);
case 152:
return Func::template run<152>(std::forward<Args>(args)...);
case 153:
return Func::template run<153>(std::forward<Args>(args)...);
case 154:
return Func::template run<154>(std::forward<Args>(args)...);
case 155:
return Func::template run<155>(std::forward<Args>(args)...);
case 156:
return Func::template run<156>(std::forward<Args>(args)...);
case 157:
return Func::template run<157>(std::forward<Args>(args)...);
case 158:
return Func::template run<158>(std::forward<Args>(args)...);
case 159:
return Func::template run<159>(std::forward<Args>(args)...);
case 160:
return Func::template run<160>(std::forward<Args>(args)...);
case 161:
return Func::template run<161>(std::forward<Args>(args)...);
case 162:
return Func::template run<162>(std::forward<Args>(args)...);
case 163:
return Func::template run<163>(std::forward<Args>(args)...);
case 164:
return Func::template run<164>(std::forward<Args>(args)...);
case 165:
return Func::template run<165>(std::forward<Args>(args)...);
case 166:
return Func::template run<166>(std::forward<Args>(args)...);
case 167:
return Func::template run<167>(std::forward<Args>(args)...);
case 168:
return Func::template run<168>(std::forward<Args>(args)...);
case 169:
return Func::template run<169>(std::forward<Args>(args)...);
case 170:
return Func::template run<170>(std::forward<Args>(args)...);
case 171:
return Func::template run<171>(std::forward<Args>(args)...);
case 172:
return Func::template run<172>(std::forward<Args>(args)...);
case 173:
return Func::template run<173>(std::forward<Args>(args)...);
case 174:
return Func::template run<174>(std::forward<Args>(args)...);
case 175:
return Func::template run<175>(std::forward<Args>(args)...);
case 176:
return Func::template run<176>(std::forward<Args>(args)...);
case 177:
return Func::template run<177>(std::forward<Args>(args)...);
case 178:
return Func::template run<178>(std::forward<Args>(args)...);
case 179:
return Func::template run<179>(std::forward<Args>(args)...);
case 180:
return Func::template run<180>(std::forward<Args>(args)...);
case 181:
return Func::template run<181>(std::forward<Args>(args)...);
case 182:
return Func::template run<182>(std::forward<Args>(args)...);
case 183:
return Func::template run<183>(std::forward<Args>(args)...);
case 184:
return Func::template run<184>(std::forward<Args>(args)...);
case 185:
return Func::template run<185>(std::forward<Args>(args)...);
case 186:
return Func::template run<186>(std::forward<Args>(args)...);
case 187:
return Func::template run<187>(std::forward<Args>(args)...);
case 188:
return Func::template run<188>(std::forward<Args>(args)...);
case 189:
return Func::template run<189>(std::forward<Args>(args)...);
case 190:
return Func::template run<190>(std::forward<Args>(args)...);
case 191:
return Func::template run<191>(std::forward<Args>(args)...);
case 192:
return Func::template run<192>(std::forward<Args>(args)...);
case 193:
return Func::template run<193>(std::forward<Args>(args)...);
case 194:
return Func::template run<194>(std::forward<Args>(args)...);
case 195:
return Func::template run<195>(std::forward<Args>(args)...);
case 196:
return Func::template run<196>(std::forward<Args>(args)...);
case 197:
return Func::template run<197>(std::forward<Args>(args)...);
case 198:
return Func::template run<198>(std::forward<Args>(args)...);
case 199:
return Func::template run<199>(std::forward<Args>(args)...);
case 200:
return Func::template run<200>(std::forward<Args>(args)...);
case 201:
return Func::template run<201>(std::forward<Args>(args)...);
case 202:
return Func::template run<202>(std::forward<Args>(args)...);
case 203:
return Func::template run<203>(std::forward<Args>(args)...);
case 204:
return Func::template run<204>(std::forward<Args>(args)...);
case 205:
return Func::template run<205>(std::forward<Args>(args)...);
case 206:
return Func::template run<206>(std::forward<Args>(args)...);
case 207:
return Func::template run<207>(std::forward<Args>(args)...);
case 208:
return Func::template run<208>(std::forward<Args>(args)...);
case 209:
return Func::template run<209>(std::forward<Args>(args)...);
case 210:
return Func::template run<210>(std::forward<Args>(args)...);
case 211:
return Func::template run<211>(std::forward<Args>(args)...);
case 212:
return Func::template run<212>(std::forward<Args>(args)...);
case 213:
return Func::template run<213>(std::forward<Args>(args)...);
case 214:
return Func::template run<214>(std::forward<Args>(args)...);
case 215:
return Func::template run<215>(std::forward<Args>(args)...);
case 216:
return Func::template run<216>(std::forward<Args>(args)...);
case 217:
return Func::template run<217>(std::forward<Args>(args)...);
case 218:
return Func::template run<218>(std::forward<Args>(args)...);
case 219:
return Func::template run<219>(std::forward<Args>(args)...);
case 220:
return Func::template run<220>(std::forward<Args>(args)...);
case 221:
return Func::template run<221>(std::forward<Args>(args)...);
case 222:
return Func::template run<222>(std::forward<Args>(args)...);
case 223:
return Func::template run<223>(std::forward<Args>(args)...);
case 224:
return Func::template run<224>(std::forward<Args>(args)...);
case 225:
return Func::template run<225>(std::forward<Args>(args)...);
case 226:
return Func::template run<226>(std::forward<Args>(args)...);
case 227:
return Func::template run<227>(std::forward<Args>(args)...);
case 228:
return Func::template run<228>(std::forward<Args>(args)...);
case 229:
return Func::template run<229>(std::forward<Args>(args)...);
case 230:
return Func::template run<230>(std::forward<Args>(args)...);
case 231:
return Func::template run<231>(std::forward<Args>(args)...);
case 232:
return Func::template run<232>(std::forward<Args>(args)...);
case 233:
return Func::template run<233>(std::forward<Args>(args)...);
case 234:
return Func::template run<234>(std::forward<Args>(args)...);
case 235:
return Func::template run<235>(std::forward<Args>(args)...);
case 236:
return Func::template run<236>(std::forward<Args>(args)...);
case 237:
return Func::template run<237>(std::forward<Args>(args)...);
case 238:
return Func::template run<238>(std::forward<Args>(args)...);
case 239:
return Func::template run<239>(std::forward<Args>(args)...);
case 240:
return Func::template run<240>(std::forward<Args>(args)...);
case 241:
return Func::template run<241>(std::forward<Args>(args)...);
case 242:
return Func::template run<242>(std::forward<Args>(args)...);
case 243:
return Func::template run<243>(std::forward<Args>(args)...);
case 244:
return Func::template run<244>(std::forward<Args>(args)...);
case 245:
return Func::template run<245>(std::forward<Args>(args)...);
case 246:
return Func::template run<246>(std::forward<Args>(args)...);
case 247:
return Func::template run<247>(std::forward<Args>(args)...);
case 248:
return Func::template run<248>(std::forward<Args>(args)...);
case 249:
return Func::template run<249>(std::forward<Args>(args)...);
case 250:
return Func::template run<250>(std::forward<Args>(args)...);
case 251:
return Func::template run<251>(std::forward<Args>(args)...);
case 252:
return Func::template run<252>(std::forward<Args>(args)...);
case 253:
return Func::template run<253>(std::forward<Args>(args)...);
case 254:
return Func::template run<254>(std::forward<Args>(args)...);
case 255:
return Func::template run<255>(std::forward<Args>(args)...);
default:
unreachable();
// index shouldn't bigger than 256
}
}
} // namespace ylt::reflection