AndroidAPS/app/src/main/java/info/nightscout/utils/OverlappingIntervals.java

99 lines
2.5 KiB
Java
Raw Normal View History

2017-05-10 14:00:46 +02:00
package info.nightscout.utils;
import android.os.Handler;
import android.os.HandlerThread;
import android.support.annotation.Nullable;
import android.support.v4.util.LongSparseArray;
import java.util.ArrayList;
import java.util.List;
2017-05-21 22:05:03 +02:00
import info.nightscout.androidaps.interfaces.Interval;
2017-05-10 14:00:46 +02:00
/**
* Created by mike on 09.05.2017.
*/
public class OverlappingIntervals<T extends Interval> {
2017-05-10 14:00:46 +02:00
private LongSparseArray<T> rawData = new LongSparseArray<>(); // oldest at index 0
2017-05-10 14:00:46 +02:00
public OverlappingIntervals reset() {
2017-05-10 14:00:46 +02:00
rawData = new LongSparseArray<>();
return this;
}
public void add(T newInterval) {
2017-05-10 14:00:46 +02:00
rawData.put(newInterval.start(), newInterval);
merge();
}
public void add(List<T> list) {
for (T interval : list) {
2017-05-10 14:00:46 +02:00
rawData.put(interval.start(), interval);
}
merge();
}
private void merge() {
for (int index = 0; index < rawData.size() - 1; index++) {
Interval i = rawData.valueAt(index);
long startOfNewer = rawData.valueAt(index + 1).start();
2017-05-10 14:00:46 +02:00
if (i.originalEnd() > startOfNewer) {
i.cutEndTo(startOfNewer);
}
}
}
@Nullable
public Interval getValueByInterval(long time) {
int index = binarySearch(time);
if (index >= 0) return rawData.valueAt(index);
2017-05-10 14:00:46 +02:00
return null;
}
public List<T> getList() {
List<T> list = new ArrayList<>();
2017-05-10 14:00:46 +02:00
for (int i = 0; i < rawData.size(); i++)
list.add(rawData.valueAt(i));
return list;
}
public List<T> getReversedList() {
List<T> list = new ArrayList<>();
for (int i = rawData.size() -1; i>=0; i--)
list.add(rawData.valueAt(i));
return list;
}
private int binarySearch(long value) {
2017-05-10 14:00:46 +02:00
int lo = 0;
int hi = rawData.size() - 1;
while (lo <= hi) {
final int mid = (lo + hi) >>> 1;
final Interval midVal = rawData.valueAt(mid);
if (midVal.before(value)) {
lo = mid + 1;
} else if (midVal.after(value)) {
hi = mid - 1;
} else if (midVal.match(value)) {
return mid; // value found
}
}
return ~lo; // value not present
}
public int size() {
return rawData.size();
}
public T get(int index) {
return rawData.valueAt(index);
}
public T getReversed(int index) {
return rawData.valueAt(size() - 1 - index);
}
2017-05-21 22:05:03 +02:00
}