Initial import
[jpf-core.git] / src / main / gov / nasa / jpf / vm / choice / RandomOrderLongCG.java
1 /*
2  * Copyright (C) 2014, United States Government, as represented by the
3  * Administrator of the National Aeronautics and Space Administration.
4  * All rights reserved.
5  *
6  * The Java Pathfinder core (jpf-core) platform is licensed under the
7  * Apache License, Version 2.0 (the "License"); you may not use this file except
8  * in compliance with the License. You may obtain a copy of the License at
9  * 
10  *        http://www.apache.org/licenses/LICENSE-2.0. 
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and 
16  * limitations under the License.
17  */
18
19 package gov.nasa.jpf.vm.choice;
20
21 import gov.nasa.jpf.vm.ChoiceGeneratorBase;
22 import gov.nasa.jpf.vm.LongChoiceGenerator;
23
24 /**
25  *
26  */
27 public class RandomOrderLongCG extends ChoiceGeneratorBase<Long> implements LongChoiceGenerator {
28   protected long[] choices;
29
30   protected int nextIdx;
31
32   public RandomOrderLongCG (LongChoiceGenerator sub) {
33     super(sub.getId());
34     setPreviousChoiceGenerator(sub.getPreviousChoiceGenerator());
35     choices = new long[sub.getTotalNumberOfChoices()];
36     for (int i = 0; i < choices.length; i++) {
37       sub.advance();
38       choices[i] = sub.getNextChoice();
39     }
40     for (int i = choices.length - 1; i > 0; i--) { // all but first
41       int j = random.nextInt(i + 1);
42       long tmp = choices[i];
43       choices[i] = choices[j];
44       choices[j] = tmp;
45     }
46     nextIdx = -1;
47   }
48   
49   @Override
50   public Long getChoice (int idx){
51     if (idx >= 0 && idx < choices.length){
52       return choices[idx];
53     } else {
54       throw new IllegalArgumentException("choice index out of range: " + idx);
55     }
56   }
57
58
59   @Override
60   public Long getNextChoice() {
61     return new Long(choices[nextIdx]);
62   }
63
64   @Override
65   public void advance() {
66     if (nextIdx + 1 < choices.length) nextIdx++;
67   }
68
69   @Override
70   public int getProcessedNumberOfChoices() {
71     return nextIdx+1;
72   }
73
74   @Override
75   public int getTotalNumberOfChoices() {
76     return choices.length;
77   }
78
79   @Override
80   public boolean hasMoreChoices() {
81     return !isDone && (nextIdx + 1 < choices.length);
82   }
83
84   @Override
85   public void reset() {
86     nextIdx = -1;
87
88     isDone = false;
89   }
90
91   @Override
92   public Class<Long> getChoiceType() {
93     return Long.class;
94   }
95 }