public int
compare(
Object o1,
Object o2 )
{
IpRange e1 = (IpRange)o1;
IpRange e2 = (IpRange)o2;
long diff = e1.getStartIpLong() - e2.getStartIpLong();
if (diff == 0) {
diff = e2.getEndIpLong() - e1.getEndIpLong();
}
return signum(diff);
}
public boolean
equals(Object obj)
{
return( false );
}
});
// now merge overlapping ranges
List me = new ArrayList( ents.length );
for (int i=0;i<ents.length;i++){
IpRange entry = ents[i];
if ( entry.getMerged()){
continue;
}
me.add( entry );
int pos = i+1;
while( pos < ents.length ){
long end_pos = entry.getMergedEndLong();
IpRange e2 = ents[pos++];
if (!e2.getMerged()){
if ( end_pos >= e2.getStartIpLong()){
e2.setMerged();
if ( e2.getEndIpLong() > end_pos ){
entry.setMergedEnd( e2.getEndIpLong() );
entry.addMergedEntry( e2 );
}
}else{
break;
}
}
}
}
/*
for (int i=0;i<ents.length;i++){
entry e = ents[i];
System.out.println( Long.toHexString(e.getStart()) + " - " + Long.toHexString(e.getEnd()) + ": " + e.getMerged() + "/" + Long.toHexString(e.getMergedEnd()));
}
*/
mergedRanges = new IpRange[me.size()];
me.toArray( mergedRanges );
total_span = 0;
for (int i=0;i<mergedRanges.length;i++){
IpRange e = mergedRanges[i];
// span is inclusive
long span = ( e.getMergedEndLong() - e.getStartIpLong()) + 1;
total_span += span;
}
// System.out.println( "non_merged = " + merged_entries.length );