Skip to content

Instantly share code, notes, and snippets.

@clarkis117
Created May 3, 2016 21:51
Show Gist options
  • Save clarkis117/0b83cd654f2e9e75d3bff0063037b0fa to your computer and use it in GitHub Desktop.
Save clarkis117/0b83cd654f2e9e75d3bff0063037b0fa to your computer and use it in GitHub Desktop.
Unsafe Network diff
public unsafe void NetworkDifferential(WifiNetwork[] InRangeNetworks)
{
var changesIndex = 0;
var changesLength = InRangeNetworks.Length * 2;
var changes = stackalloc WifiListChange[changesLength];
//List<WifiNetwork> itemsToRemove = new List<WifiNetwork>();
//List<string> itemsToAdd = new List<string>();
//foreach network in Networks
for (int NetworkIndex = 0; NetworkIndex < Networks.Count; NetworkIndex++)
{
bool match = false;
//access once and cache
var NetworkItem = Networks[NetworkIndex];
//todo foreach network InRange Networks
for (int i = 0; i < InRangeNetworks.Length; i++)
{
//access once and cache
var InRangeItem = InRangeNetworks[i];
//if match trigger Property Update
if (NetworkItem.BSSID == InRangeItem.BSSID)
{
/*update properties here
*/
changes[changesIndex] = new WifiListChange((int)ListChange.Update, NetworkIndex, i);
changesIndex += 1;
match = true;
break;
}
}
if (match == false) //add to removal list
{
changes[changesIndex] = new WifiListChange((int)ListChange.Remove, NetworkIndex, 0);
changesIndex += 1;
}
}
//foreach network InRange Networks
for (int InRangeIndex = 0; InRangeIndex < InRangeNetworks.Length; InRangeIndex++)
{
bool match = false;
//access once and cache
var InRangeItem = InRangeNetworks[InRangeIndex];
//foreach network in Networks
for (int NetworkIndex = 0; NetworkIndex < Networks.Count; NetworkIndex++)
{
//if match it means the time is was previously in range
if (InRangeItem.BSSID == Networks[NetworkIndex].BSSID)
{
match = true;
break;
}
}
if (match == false) //add item
{
changes[changesIndex] = new WifiListChange((int)ListChange.Add, 0, InRangeIndex);
changesIndex += 1;
}
}
//remove out of range networks
var changelen = changesLength;
for (int i = 0; i < changesIndex; i++)
{
//Networks.Remove(itemsToRemove[i]);
var change = changes[i];
switch (change.Change)
{
case (int)ListChange.Update:
var NetworkItem = Networks[change.NetworkRef];
var InRangeItem = InRangeNetworks[change.InRangeRef];
if (NetworkItem.Frequency != InRangeItem.Frequency)
{
NetworkItem.Frequency = InRangeItem.Frequency;
}
if (NetworkItem.SignalStrength != InRangeItem.SignalStrength)
{
NetworkItem.SignalStrength = InRangeItem.SignalStrength;
}
break;
case (int)ListChange.Add:
Networks.Add(InRangeNetworks[change.InRangeRef]);
break;
}
}
for (int i = changesIndex; i >= 0; i--)
{
//Networks.Remove(itemsToRemove[i]);
var change = changes[i];
if (change.Change == 0)
{
Networks.RemoveAt(change.NetworkRef);
throw new Exception("not type");
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment