/// <summary> /// Will return an index into [head] + tail, or -1 if not found /// </summary> private int LastIndexOf(MulticastDelegate o) { int oInvLen = o.InvocationListLength; var oInvList = o.InvocationList; var invList = InvocationList; // We need to start comparing from the end. // Mono's implementation uses the KMP algorithm, but at a first // glance this seems to be overkill for an invocation list. In the // typical usage scenario, 'o' will have no invocation list at all. // We stick to the naive implementation for now. int i = InvocationListLength - oInvLen; if (oInvLen == 0) { for (; i > 0; --i) { if (o.EqualsWithoutInvocationList(invList[i - 1])) { return(i); } } } else { for (; i > 0; --i) { if (!o.EqualsWithoutInvocationList(invList[i - 1])) { continue; } for (int j = 0; j < oInvLen; ++j) { if (!invList[i + j].EqualsWithoutInvocationList(oInvList[j])) { goto next_iteration; } } // found it! return(i); next_iteration :; } } // 0 = this return(i < 0 || !o.EqualsWithoutInvocationList(this) ? -1 : 0); }
/// <summary> /// Will return an index into [head] + tail, or -1 if not found /// </summary> private int LastIndexOf(MulticastDelegate o) { int oInvLen = o.InvocationListLength; var oInvList = o.InvocationList; var invList = InvocationList; // We need to start comparing from the end. // Mono's implementation uses the KMP algorithm, but at a first // glance this seems to be overkill for an invocation list. In the // typical usage scenario, 'o' will have no invocation list at all. // We stick to the naive implementation for now. int i = InvocationListLength - oInvLen; if (oInvLen == 0) { for(; i > 0; --i) { if (o.EqualsWithoutInvocationList(invList[i - 1])) return i; } } else { for (; i > 0; --i) { if (!o.EqualsWithoutInvocationList(invList[i - 1])) continue; for (int j = 0; j < oInvLen; ++j) { if (!invList[i + j].EqualsWithoutInvocationList(oInvList[j])) goto next_iteration; } // found it! return i; next_iteration:; } } // 0 = this return i < 0 || !o.EqualsWithoutInvocationList(this) ? -1 : 0; }