// Used to merge two distinct TokenBasedSets (used currently only in PermissionSet Deserialization)
internal TokenBasedSet SpecialUnion(TokenBasedSet other)
{
// This gets called from PermissionSet.OnDeserialized and it's possible that the TokenBasedSets have
// not been subjected to VTS callbacks yet
OnDeserializedInternal();
TokenBasedSet unionSet = new TokenBasedSet();
int maxMax;
if (other != null)
{
other.OnDeserializedInternal();
maxMax = this.GetMaxUsedIndex() > other.GetMaxUsedIndex() ? this.GetMaxUsedIndex() : other.GetMaxUsedIndex();
}
else
{
maxMax = this.GetMaxUsedIndex();
}
for (int i = 0; i <= maxMax; ++i)
{
Object thisObj = this.GetItem(i);
IPermission thisPerm = thisObj as IPermission;
Object otherObj = (other != null)?other.GetItem(i):null;
IPermission otherPerm = otherObj as IPermission;
if (thisObj == null && otherObj == null)
{
continue;
}
if (thisObj == null)
{
PermissionToken token = PermissionToken.GetToken(otherPerm);
if (token == null)
{
throw new SerializationException(Environment.GetResourceString("Serialization_InsufficientState"));
}
unionSet.SetItem(token.m_index, otherPerm);
}
else if (otherObj == null)
{
PermissionToken token = PermissionToken.GetToken(thisPerm);
if (token == null)
{
throw new SerializationException(Environment.GetResourceString("Serialization_InsufficientState"));
}
unionSet.SetItem(token.m_index, thisPerm);
}
else
{
Debug.Assert((thisObj == null || otherObj == null), "Permission cannot be in both TokenBasedSets");
}
}
return(unionSet);
}