1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.rng.simple.internal;
18
19 import org.apache.commons.rng.core.util.NumberFactory;
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 public enum NativeSeedType {
45
46 INT(Integer.class, 4) {
47 @Override
48 public Integer createSeed(int size, int from, int to) {
49 return SeedFactory.createInt();
50 }
51 @Override
52 protected Integer convert(Integer seed, int size) {
53 return seed;
54 }
55 @Override
56 protected Integer convert(Long seed, int size) {
57 return Conversions.long2Int(seed);
58 }
59 @Override
60 protected Integer convert(int[] seed, int size) {
61 return Conversions.intArray2Int(seed);
62 }
63 @Override
64 protected Integer convert(long[] seed, int size) {
65 return Conversions.longArray2Int(seed);
66 }
67 @Override
68 protected Integer convert(byte[] seed, int size) {
69 return Conversions.byteArray2Int(seed);
70 }
71 },
72
73 LONG(Long.class, 8) {
74 @Override
75 public Long createSeed(int size, int from, int to) {
76 return SeedFactory.createLong();
77 }
78 @Override
79 protected Long convert(Integer seed, int size) {
80 return Conversions.int2Long(seed);
81 }
82 @Override
83 protected Long convert(Long seed, int size) {
84 return seed;
85 }
86 @Override
87 protected Long convert(int[] seed, int size) {
88 return Conversions.intArray2Long(seed);
89 }
90 @Override
91 protected Long convert(long[] seed, int size) {
92 return Conversions.longArray2Long(seed);
93 }
94 @Override
95 protected Long convert(byte[] seed, int size) {
96 return Conversions.byteArray2Long(seed);
97 }
98 },
99
100 INT_ARRAY(int[].class, 4) {
101 @Override
102 public int[] createSeed(int size, int from, int to) {
103
104
105 return SeedFactory.createIntArray(Math.min(size, RANDOM_SEED_ARRAY_SIZE),
106 from, to);
107 }
108 @Override
109 protected int[] convert(Integer seed, int size) {
110 return Conversions.int2IntArray(seed, size);
111 }
112 @Override
113 protected int[] convert(Long seed, int size) {
114 return Conversions.long2IntArray(seed, size);
115 }
116 @Override
117 protected int[] convert(int[] seed, int size) {
118 return seed;
119 }
120 @Override
121 protected int[] convert(long[] seed, int size) {
122
123 return Conversions.longArray2IntArray(seed,
124 Math.min(size, Conversions.intSizeFromLongSize(seed.length)));
125 }
126 @Override
127 protected int[] convert(byte[] seed, int size) {
128
129 return Conversions.byteArray2IntArray(seed,
130 Math.min(size, Conversions.intSizeFromByteSize(seed.length)));
131 }
132 },
133
134 LONG_ARRAY(long[].class, 8) {
135 @Override
136 public long[] createSeed(int size, int from, int to) {
137
138
139 return SeedFactory.createLongArray(Math.min(size, RANDOM_SEED_ARRAY_SIZE),
140 from, to);
141 }
142 @Override
143 protected long[] convert(Integer seed, int size) {
144 return Conversions.int2LongArray(seed, size);
145 }
146 @Override
147 protected long[] convert(Long seed, int size) {
148 return Conversions.long2LongArray(seed, size);
149 }
150 @Override
151 protected long[] convert(int[] seed, int size) {
152
153 return Conversions.intArray2LongArray(seed,
154 Math.min(size, Conversions.longSizeFromIntSize(seed.length)));
155 }
156 @Override
157 protected long[] convert(long[] seed, int size) {
158 return seed;
159 }
160 @Override
161 protected long[] convert(byte[] seed, int size) {
162
163 return Conversions.byteArray2LongArray(seed,
164 Math.min(size, Conversions.longSizeFromByteSize(seed.length)));
165 }
166 };
167
168
169 private static final String UNRECOGNISED_SEED = "Unrecognized seed type: ";
170
171 private static final int RANDOM_SEED_ARRAY_SIZE = 128;
172
173
174 private final Class<?> type;
175
176
177
178
179
180 private final int bytes;
181
182
183
184
185
186
187
188 NativeSeedType(Class<?> type, int bytes) {
189 this.type = type;
190 this.bytes = bytes;
191 }
192
193
194
195
196
197
198 public Class<?> getType() {
199 return type;
200 }
201
202
203
204
205
206
207
208 public int getBytes() {
209 return bytes;
210 }
211
212
213
214
215
216
217
218
219 public Object createSeed(int size) {
220
221 return createSeed(size, 0, Math.min(size, 1));
222 }
223
224
225
226
227
228
229
230
231
232
233
234
235
236 public abstract Object createSeed(int size, int from, int to);
237
238
239
240
241
242
243
244
245
246
247 public Object convertSeed(Object seed,
248 int size) {
249
250
251
252 if (seed instanceof Integer) {
253 return convert((Integer) seed, size);
254 } else if (seed instanceof Long) {
255 return convert((Long) seed, size);
256 } else if (seed instanceof int[]) {
257 return convert((int[]) seed, size);
258 } else if (seed instanceof long[]) {
259 return convert((long[]) seed, size);
260 } else if (seed instanceof byte[]) {
261 return convert((byte[]) seed, size);
262 }
263
264 throw new UnsupportedOperationException(unrecognisedSeedMessage(seed));
265 }
266
267
268
269
270
271
272
273
274 protected abstract Object convert(Integer seed, int size);
275
276
277
278
279
280
281
282
283 protected abstract Object convert(Long seed, int size);
284
285
286
287
288
289
290
291
292 protected abstract Object convert(int[] seed, int size);
293
294
295
296
297
298
299
300
301 protected abstract Object convert(long[] seed, int size);
302
303
304
305
306
307
308
309
310 protected abstract Object convert(byte[] seed, int size);
311
312
313
314
315
316
317
318
319 public static byte[] convertSeedToBytes(Object seed) {
320 if (seed instanceof Integer) {
321 return NumberFactory.makeByteArray((Integer) seed);
322 } else if (seed instanceof Long) {
323 return NumberFactory.makeByteArray((Long) seed);
324 } else if (seed instanceof int[]) {
325 return NumberFactory.makeByteArray((int[]) seed);
326 } else if (seed instanceof long[]) {
327 return NumberFactory.makeByteArray((long[]) seed);
328 } else if (seed instanceof byte[]) {
329 return (byte[]) seed;
330 }
331
332 throw new UnsupportedOperationException(unrecognisedSeedMessage(seed));
333 }
334
335
336
337
338
339
340
341 private static String unrecognisedSeedMessage(Object seed) {
342 return UNRECOGNISED_SEED + ((seed == null) ? "null" : seed.getClass().getName());
343 }
344 }