/***************************************************************************** * Limpet - the Lightweight InforMation ProcEssing Toolkit * http://limpet.info * * (C) 2015-2016, Deep Blue C Technologies Ltd * * This library is free software; you can redistribute it and/or * modify it under the terms of the Eclipse Public License v1.0 * (http://www.eclipse.org/legal/epl-v10.html) * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *****************************************************************************/ package info.limpet.data.impl; import java.util.Iterator; import java.util.List; import info.limpet.ICommand; import info.limpet.ITemporalObjectCollection; import info.limpet.data.impl.helpers.TimeHelper; public class TemporalObjectCollection<T extends Object> extends ObjectCollection<T> implements ITemporalObjectCollection<T> { private final TimesList<Long> times = new TimesList<Long>(); private transient TimeHelper tSupport; public TemporalObjectCollection(String name) { this(name, null); } public TemporalObjectCollection(String name, ICommand<?> precedent) { super(name, precedent); initTime(); } @Override public void clearQuiet() { times.clear(); // let the parent clear the objects/values super.clearQuiet(); } @Override public void clear() { times.clear(); // let the parent clear the objects/values super.clear(); } protected void initTime() { if (tSupport == null) { tSupport = new TimeHelper(times); } } @Override public List<Long> getTimes() { initTime(); return tSupport.getTimes(); } @Override public void add(T value) { throw new UnsupportedOperationException("Use add(time,object) for a time series"); } @Override public void add(long time, T object) { times.add(time); super.add(object); } @Override public long start() { initTime(); return tSupport.start(); } @Override public long finish() { initTime(); return tSupport.finish(); } @Override public long duration() { initTime(); return tSupport.duration(); } @Override public double rate() { initTime(); return tSupport.rate(); } public Iterator<Doublet<T>> iterator() { return new MyIterator(); } private class MyIterator implements Iterator<Doublet<T>> { private int ctr = 0; @Override public boolean hasNext() { return ctr < getValuesCount(); } @Override public Doublet<T> next() { final int thisCtr = ctr; ctr++; return new Doublet<T>() { @Override public long getTime() { return times.get(thisCtr); } @Override public T getObservation() { return getValues().get(thisCtr); } }; } @Override public void remove() { throw new UnsupportedOperationException("Method not implemented"); } } @Override public boolean isQuantity() { return false; } @Override public boolean isTemporal() { return true; } }