eb2f33b50c4b81ff766cc9ec17e5d6f0a19b08f6
[jpf-core.git] / src / main / gov / nasa / jpf / vm / choice / IntChoiceFromSet.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 package gov.nasa.jpf.vm.choice;
19
20 import gov.nasa.jpf.Config;
21 /**
22  * @author cartho
23  *
24  * choose from a set of values provided in configuration as
25  * xxx.class = IntChoiceFromSet
26  * xxx.values = {1, 2, 3, 400}
27  * where "xxx" is the choice id.
28  * 
29  * choices can then made using: getInt("xxx");
30  */
31 public class IntChoiceFromSet extends IntChoiceFromList {
32
33         /**
34          * @param conf JPF configuration object
35          * @param id name used in choice config
36          */
37         public IntChoiceFromSet(Config conf, String id) {
38                 super(conf, id);
39                 removeDuplicates();
40         }
41
42         /* Remove duplicate values; currently implemented as iteration
43          * on array to avoid heavyweight TreeSet */
44         private void removeDuplicates() {
45                 int len = values.length;
46                 for (int i = 0; i < len; i++) {
47                         int j = i + 1;
48                         while (j < len) {
49                                 if (values[i] - values[j] == 0) { // strange comparison to avoid unboxing
50                                         values[j] = values[len - 1];
51                                         len--;
52                                         // don't increment j as new element has been placed there and needs to be re-tested
53                                 } else {
54                                         j++;
55                                 }
56                         }
57                 }
58                 if (len < values.length) {
59                         Integer[] uniqVals = new Integer[len];
60                         System.arraycopy(values, 0, uniqVals, 0, len);
61                         values = uniqVals;
62                 }
63         }
64
65   public IntChoiceFromSet(String id, int... val){
66     super(id, val);
67     removeDuplicates();
68     count = -1;
69   }
70
71   // TODO: Fix for Groovy's model-checking
72   // TODO: This is a setter to change the values of the ChoiceGenerator to implement POR
73   @Override
74   public void setNewValues(Integer[] vals) {
75     values = vals;
76   }
77
78   @Override
79   public Integer[] getAllChoices() {
80     return values;
81   }
82
83         /** super constructor for subclasses that want to configure themselves
84          * 
85          * @param id name used in choice config
86          */
87         protected IntChoiceFromSet(String id){
88                 super(id);
89         }
90 }