Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Overload* OverloadResolver::GatherNumeric(Vector<Overload*>& oo, Vector<Node*>& params, int pi, ZClass* cls) {
- Node& n = *params[pi];
- GatherInfo gi;
- gi.Rez = nullptr;
- if (n.IsAddressable) {
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyRef, cls);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- }
- if (n.IsTemporary) {
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, cls);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, cls);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- if (cls == ass.CInt) {
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CLong);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CLong);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CDouble);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CDouble);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- if (n.IsCT && n.IsLiteral && (int)n.IntVal >= -1) {
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CPtrSize);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CPtrSize);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- }
- }
- else if (cls == ass.CByte) {
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CWord, ass.CDWord);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CWord, ass.CDWord);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CQWord);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CQWord);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CShort, ass.CInt);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CShort, ass.CInt);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CLong);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CLong);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CFloat, ass.CDouble);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CFloat, ass.CDouble);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- }
- else if (cls == ass.CWord) {
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CDWord);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CDWord);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CQWord);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CQWord);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CInt);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CInt);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CLong);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CLong);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CFloat, ass.CDouble);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CFloat, ass.CDouble);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- }
- else if (cls == ass.CDWord) {
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CQWord);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CQWord);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CLong);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CLong);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CDouble);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CDouble);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- }
- else if (cls == ass.CSmall) {
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CShort, ass.CInt);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CShort, ass.CInt);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CLong);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CLong);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CFloat, ass.CDouble);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CFloat, ass.CDouble);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- }
- else if (cls == ass.CShort) {
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CShort);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CInt);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CInt);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CLong);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CLong);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CFloat, ass.CDouble);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CFloat, ass.CDouble);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- }
- else if (cls == ass.CFloat) {
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CDouble);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CDouble);
- if (gi.Count == 1) return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
- }
- return nullptr;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement