Advertisement
Guest User

Untitled

a guest
Oct 15th, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.06 KB | None | 0 0
  1. Overload* OverloadResolver::GatherNumeric(Vector<Overload*>& oo, Vector<Node*>& params, int pi, ZClass* cls) {
  2.     Node& n = *params[pi];
  3.     GatherInfo gi;
  4.     gi.Rez = nullptr;
  5.    
  6.     if (n.IsAddressable) {
  7.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyRef, cls);
  8.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  9.     }
  10.    
  11.     if (n.IsTemporary) {
  12.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, cls);
  13.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  14.     }
  15.    
  16.     gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, cls);
  17.     if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  18.            
  19.     if (cls == ass.CInt) {
  20.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CLong);
  21.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  22.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CLong);
  23.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  24.        
  25.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CDouble);
  26.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  27.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CDouble);
  28.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  29.    
  30.         if (n.IsCT && n.IsLiteral && (int)n.IntVal >= -1) {
  31.             gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CPtrSize);
  32.             if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  33.             gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CPtrSize);
  34.             if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  35.         }
  36.     }
  37.     else if (cls == ass.CByte) {
  38.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CWord, ass.CDWord);
  39.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  40.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CWord, ass.CDWord);
  41.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  42.        
  43.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CQWord);
  44.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  45.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CQWord);
  46.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  47.        
  48.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CShort, ass.CInt);
  49.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  50.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CShort, ass.CInt);
  51.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  52.        
  53.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CLong);
  54.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  55.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CLong);
  56.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  57.        
  58.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CFloat, ass.CDouble);
  59.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  60.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CFloat, ass.CDouble);
  61.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  62.     }
  63.     else if (cls == ass.CWord) {
  64.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CDWord);
  65.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  66.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CDWord);
  67.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  68.        
  69.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CQWord);
  70.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  71.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CQWord);
  72.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  73.        
  74.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CInt);
  75.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  76.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CInt);
  77.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  78.        
  79.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CLong);
  80.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  81.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CLong);
  82.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  83.        
  84.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CFloat, ass.CDouble);
  85.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  86.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CFloat, ass.CDouble);
  87.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  88.     }
  89.     else if (cls == ass.CDWord) {
  90.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CQWord);
  91.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  92.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CQWord);
  93.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  94.        
  95.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CLong);
  96.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  97.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CLong);
  98.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  99.        
  100.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CDouble);
  101.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  102.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CDouble);
  103.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  104.     }
  105.     else if (cls == ass.CSmall) {
  106.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CShort, ass.CInt);
  107.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  108.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CShort, ass.CInt);
  109.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  110.        
  111.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CLong);
  112.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  113.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CLong);
  114.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  115.        
  116.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CFloat, ass.CDouble);
  117.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  118.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CFloat, ass.CDouble);
  119.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  120.     }
  121.     else if (cls == ass.CShort) {
  122.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CShort);
  123.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  124.                
  125.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CInt);
  126.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  127.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CInt);
  128.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  129.        
  130.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CLong);
  131.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  132.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CLong);
  133.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  134.        
  135.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CFloat, ass.CDouble);
  136.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  137.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CFloat, ass.CDouble);
  138.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  139.     }
  140.     else if (cls == ass.CFloat) {
  141.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyMove, ass.CDouble);
  142.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  143.         gi.Count = 0; GatherN(oo, params, pi, gi, Variable::tyAuto, ass.CDouble);
  144.         if (gi.Count == 1)  return gi.Rez; else if (gi.Count > 1) { ambig = true; return nullptr; }
  145.     }
  146.    
  147.     return nullptr;
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement