in csharp/src/Containers/SortedSqrtDecomposition.cs [144:237]
public int AddIfNotExist(Type x)
{
bool insert = false;
if (needRebuild)
{
RebuildSqrt();
}
for (int j = 0; j < numberOfBlocks; ++j)
{
if (size != 0 && dataInBegin[j] != null && comparator.Compare(dataInBegin[j], x) > 0)
{
if (j == 0)
{
for (int k = endOfBlock[0]; k > 0; k--)
{
data[k] = data[k - 1];
}
data[0] = x;
dataInBegin[0] = x;
endOfBlock[0]++;
insert = true;
size++;
if (endOfBlock[0] == (len << 1))
{
needRebuild = true;
}
return 0;
}
for (int k = (len * (j - 1) << 1); k < endOfBlock[j - 1]; k++)
if (comparator.Compare(data[k], x) > 0)
{
for (int l = endOfBlock[j - 1]; l > k; l--)
{
data[l] = data[l - 1];
}
data[k] = x;
endOfBlock[j - 1]++;
insert = true;
size++;
if (endOfBlock[j - 1] == (len * j << 1)) needRebuild = true;
return k;
}
else if (comparator.Compare(data[k], x) == 0)
{
return -(k + 1);
}
if (!insert)
{
data[endOfBlock[j - 1]] = x;
insert = true;
endOfBlock[j - 1]++;
size++;
if (endOfBlock[j - 1] == (len * j << 1))
{
needRebuild = true;
}
return endOfBlock[j - 1] - 1;
}
}
}
if (!insert)
{
for (int j = (len * (numberOfBlocks - 1) << 1); j < endOfBlock[numberOfBlocks - 1]; ++j)
if (data[j] != null && comparator.Compare(data[j], x) > 0)
{
for (int l = endOfBlock[numberOfBlocks - 1]; l > j; l--)
{
data[l] = data[l - 1];
}
data[j] = x;
if (j == ((len * (numberOfBlocks - 1)) << 1)) dataInBegin[numberOfBlocks - 1] = x;
insert = true;
endOfBlock[numberOfBlocks - 1]++;
size++;
if (endOfBlock[numberOfBlocks - 1] == (len * numberOfBlocks << 1)) needRebuild = true;
return j;
}
else if (comparator.Compare(data[j], x) == 0)
{
return -(j + 1);
}
if (!insert)
{
size++;
if (endOfBlock[numberOfBlocks - 1] == (len * (numberOfBlocks - 1) << 1))
dataInBegin[numberOfBlocks - 1] = x;
data[endOfBlock[numberOfBlocks - 1]] = x;
endOfBlock[numberOfBlocks - 1]++;
if (endOfBlock[numberOfBlocks - 1] == (len * numberOfBlocks << 1)) needRebuild = true;
return endOfBlock[numberOfBlocks - 1] - 1;
}
}
return NoElement;
}