Intervals -> kt
This commit is contained in:
parent
72176edfb9
commit
00ee60ff1e
3 changed files with 74 additions and 98 deletions
|
@ -1,96 +0,0 @@
|
|||
package info.nightscout.androidaps.data;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.collection.LongSparseArray;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import info.nightscout.androidaps.interfaces.Interval;
|
||||
|
||||
/**
|
||||
* Created by mike on 09.05.2017.
|
||||
*/
|
||||
|
||||
// Zero duration means end of interval
|
||||
|
||||
public abstract class Intervals<T extends Interval> {
|
||||
|
||||
LongSparseArray<T> rawData; // oldest at index 0
|
||||
|
||||
public Intervals() {
|
||||
rawData = new LongSparseArray<T>();
|
||||
}
|
||||
|
||||
public synchronized Intervals<T> reset() {
|
||||
rawData = new LongSparseArray<T>();
|
||||
return this;
|
||||
}
|
||||
|
||||
protected abstract void merge();
|
||||
|
||||
/**
|
||||
* The List must be sorted by `T.start()` in ascending order
|
||||
*/
|
||||
public synchronized void add(List<T> list) {
|
||||
for (T interval : list) {
|
||||
rawData.put(interval.start(), interval);
|
||||
}
|
||||
merge();
|
||||
}
|
||||
|
||||
public synchronized void add(T interval) {
|
||||
rawData.put(interval.start(), interval);
|
||||
merge();
|
||||
}
|
||||
|
||||
|
||||
public synchronized List<T> getList() {
|
||||
List<T> list = new ArrayList<>();
|
||||
for (int i = 0; i < rawData.size(); i++)
|
||||
list.add(rawData.valueAt(i));
|
||||
return list;
|
||||
}
|
||||
|
||||
public synchronized List<T> getReversedList() {
|
||||
List<T> list = new ArrayList<>();
|
||||
for (int i = rawData.size() - 1; i >= 0; i--)
|
||||
list.add(rawData.valueAt(i));
|
||||
return list;
|
||||
}
|
||||
|
||||
protected synchronized int binarySearch(long value) {
|
||||
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 abstract T getValueByInterval(long time);
|
||||
|
||||
public synchronized int size() {
|
||||
return rawData.size();
|
||||
}
|
||||
|
||||
public synchronized T get(int index) {
|
||||
return rawData.valueAt(index);
|
||||
}
|
||||
|
||||
public synchronized T getReversed(int index) {
|
||||
return rawData.valueAt(size() - 1 - index);
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,72 @@
|
|||
package info.nightscout.androidaps.data
|
||||
|
||||
import androidx.collection.LongSparseArray
|
||||
import info.nightscout.androidaps.interfaces.Interval
|
||||
import java.util.*
|
||||
|
||||
/**
|
||||
* Created by mike on 09.05.2017.
|
||||
*/
|
||||
// Zero duration means end of interval
|
||||
abstract class Intervals<T : Interval> {
|
||||
|
||||
var rawData: LongSparseArray<T> = LongSparseArray()// oldest at index 0
|
||||
|
||||
@Synchronized fun reset(): Intervals<T> {
|
||||
rawData = LongSparseArray()
|
||||
return this
|
||||
}
|
||||
|
||||
protected abstract fun merge()
|
||||
|
||||
/**
|
||||
* The List must be sorted by `T.start()` in ascending order
|
||||
*/
|
||||
@Synchronized fun add(list: List<T>) {
|
||||
for (interval in list) {
|
||||
rawData.put(interval.start(), interval)
|
||||
}
|
||||
merge()
|
||||
}
|
||||
|
||||
@Synchronized fun add(interval: T) {
|
||||
rawData.put(interval.start(), interval)
|
||||
merge()
|
||||
}
|
||||
|
||||
@get:Synchronized val list: List<T>
|
||||
get() {
|
||||
val list: MutableList<T> = ArrayList()
|
||||
for (i in 0 until rawData.size()) list.add(rawData.valueAt(i))
|
||||
return list
|
||||
}
|
||||
@get:Synchronized val reversedList: List<T>
|
||||
get() {
|
||||
val list: MutableList<T> = ArrayList()
|
||||
for (i in rawData.size() - 1 downTo 0) list.add(rawData.valueAt(i))
|
||||
return list
|
||||
}
|
||||
|
||||
@Synchronized protected fun binarySearch(value: Long): Int {
|
||||
var lo = 0
|
||||
var hi = rawData.size() - 1
|
||||
while (lo <= hi) {
|
||||
val mid = lo + hi ushr 1
|
||||
val midVal: Interval = rawData.valueAt(mid)
|
||||
when {
|
||||
midVal.before(value) -> lo = mid + 1
|
||||
midVal.after(value) -> hi = mid - 1
|
||||
midVal.match(value) -> return mid // value found
|
||||
}
|
||||
}
|
||||
return lo.inv() // value not present
|
||||
}
|
||||
|
||||
abstract fun getValueByInterval(time: Long): T?
|
||||
|
||||
@Synchronized fun size(): Int = rawData.size()
|
||||
|
||||
@Synchronized operator fun get(index: Int): T? = rawData.valueAt(index)
|
||||
|
||||
@Synchronized fun getReversed(index: Int): T? = rawData.valueAt(size() - 1 - index)
|
||||
}
|
|
@ -52,8 +52,8 @@ class OverlappingIntervalsTest {
|
|||
someList.add(TempTargetTest().date(startDate + T.hours(1).msecs()).duration(T.hours(1).mins()).low(100.0).high(100.0))
|
||||
list.reset()
|
||||
list.add(someList)
|
||||
Assert.assertEquals(startDate, list[0].data.timestamp)
|
||||
Assert.assertEquals(startDate + T.hours(1).msecs(), list.getReversed(0).data.timestamp)
|
||||
Assert.assertEquals(startDate, list[0]?.data?.timestamp)
|
||||
Assert.assertEquals(startDate + T.hours(1).msecs(), list.getReversed(0)?.data?.timestamp)
|
||||
Assert.assertEquals(startDate + T.hours(1).msecs(), list.reversedList[0].data.timestamp)
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue