1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.utils;
18
19 import java.util.ArrayList;
20 import java.util.Collection;
21 import java.util.Collections;
22 import java.util.List;
23 import java.util.function.Function;
24 import java.util.stream.Stream;
25
26 import org.hipparchus.CalculusFieldElement;
27 import org.hipparchus.exception.LocalizedCoreFormats;
28 import org.orekit.errors.OrekitException;
29 import org.orekit.errors.OrekitIllegalArgumentException;
30 import org.orekit.errors.OrekitIllegalStateException;
31 import org.orekit.errors.OrekitMessages;
32 import org.orekit.errors.TimeStampedCacheException;
33 import org.orekit.time.FieldAbsoluteDate;
34 import org.orekit.time.FieldChronologicalComparator;
35 import org.orekit.time.FieldTimeStamped;
36 import org.orekit.time.TimeStamped;
37
38
39
40
41
42
43
44
45
46
47
48
49 public class ImmutableFieldTimeStampedCache<T extends FieldTimeStamped<KK>, KK extends CalculusFieldElement<KK>>
50 implements FieldTimeStampedCache<T, KK> {
51
52
53
54
55 @SuppressWarnings("rawtypes")
56 private static final ImmutableFieldTimeStampedCache EMPTY_CACHE =
57 new EmptyFieldTimeStampedCache();
58
59
60
61
62
63 private final List<T> data;
64
65
66 private final int maxNeighborsSize;
67
68
69
70
71
72
73
74
75
76
77
78 public ImmutableFieldTimeStampedCache(final int maxNeighborsSize,
79 final Collection<? extends T> data) {
80
81 if (maxNeighborsSize > data.size()) {
82 throw new OrekitIllegalArgumentException(OrekitMessages.NOT_ENOUGH_CACHED_NEIGHBORS,
83 data.size(), maxNeighborsSize);
84 }
85 if (maxNeighborsSize < 1) {
86 throw new OrekitIllegalArgumentException(LocalizedCoreFormats.NUMBER_TOO_SMALL,
87 maxNeighborsSize, 1);
88 }
89
90
91 this.maxNeighborsSize = maxNeighborsSize;
92
93
94 this.data = new ArrayList<>(data);
95 this.data.sort(new FieldChronologicalComparator<>());
96
97 }
98
99
100
101 private ImmutableFieldTimeStampedCache() {
102 this.data = null;
103 this.maxNeighborsSize = 0;
104 }
105
106
107
108
109
110
111
112
113
114 @SuppressWarnings("unchecked")
115 public static <TS extends FieldTimeStamped<CFE>, CFE extends CalculusFieldElement<CFE>>
116 ImmutableFieldTimeStampedCache<TS, CFE> emptyCache() {
117 return (ImmutableFieldTimeStampedCache<TS, CFE>) EMPTY_CACHE;
118 }
119
120
121 public Stream<T> getNeighbors(final FieldAbsoluteDate<KK> central, final int n) {
122 if (n > maxNeighborsSize) {
123 throw new OrekitException(OrekitMessages.NOT_ENOUGH_DATA, maxNeighborsSize);
124 }
125 return new FieldSortedListTrimmer(n).getNeighborsSubList(central, data).stream();
126 }
127
128
129 public int getMaxNeighborsSize() {
130 return this.maxNeighborsSize;
131 }
132
133
134 public T getEarliest() {
135 return this.data.getFirst();
136 }
137
138
139 public T getLatest() {
140 return this.data.get(this.data.size() - 1);
141 }
142
143
144
145
146
147
148
149 public List<T> getAll() {
150 return Collections.unmodifiableList(this.data);
151 }
152
153
154 @Override
155 public String toString() {
156 return "Immutable cache with " + this.data.size() + " entries";
157 }
158
159
160 private static class EmptyFieldTimeStampedCache<T extends FieldTimeStamped<KK>, KK extends CalculusFieldElement<KK>>
161 extends ImmutableFieldTimeStampedCache<T, KK> {
162
163
164 @Override
165 public Stream<T> getNeighbors(final FieldAbsoluteDate<KK> central) {
166 throw new TimeStampedCacheException(OrekitMessages.NO_CACHED_ENTRIES);
167 }
168
169
170 @Override
171 public int getMaxNeighborsSize() {
172 return 0;
173 }
174
175
176 @Override
177 public T getEarliest() {
178 throw new OrekitIllegalStateException(OrekitMessages.NO_CACHED_ENTRIES);
179 }
180
181
182 @Override
183 public T getLatest() {
184 throw new OrekitIllegalStateException(OrekitMessages.NO_CACHED_ENTRIES);
185 }
186
187
188 @Override
189 public List<T> getAll() {
190 return Collections.emptyList();
191 }
192
193
194 @Override
195 public String toString() {
196 return "Empty immutable cache";
197 }
198
199 }
200
201
202
203
204
205
206
207 public <N extends TimeStamped> ImmutableTimeStampedCache<N> toNonField(final Function<T, N> converter) {
208 final List<N> nonFieldData = new ArrayList<>(data.size());
209 for (int i = 0; i < data.size(); i++) {
210 nonFieldData.add(converter.apply(data.get(i)));
211 }
212 return new ImmutableTimeStampedCache<>(maxNeighborsSize, nonFieldData);
213 }
214
215 }