Initial import
[jpf-core.git] / src / main / gov / nasa / jpf / util / script / Repetition.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.util.script;
20
21
22 public class Repetition extends ScriptElementContainer {
23   int repeatCount;
24
25   class RepetitionIterator extends ScriptElementContainer.SECIterator {
26
27     int count;
28
29     RepetitionIterator () {
30       count = 0;
31       cur = firstChild;
32     }
33
34     @Override
35         public boolean hasNext() {
36       return ((cur != null) || (count<repeatCount) || (repeatCount < 0));
37     }
38
39     @Override
40         public ScriptElement next() {
41       if (cur != null) {
42         ScriptElement ret = cur;
43         cur = cur.nextSibling;
44         return ret;
45       } else {
46         if ((++count < repeatCount) || (repeatCount < 0) ) {
47           ScriptElement ret = firstChild;
48           cur = ret.nextSibling;
49           return ret;
50         } else {
51           return null;
52         }
53       }
54     }
55
56     @Override
57         public void remove() {
58       throw new UnsupportedOperationException("no ScriptElement removal supported");
59     }
60   }
61
62
63   public Repetition (ScriptElement parent, int n, int line) {
64     super(parent, line);
65     repeatCount = n;
66   }
67
68   @Override
69   public SECIterator iterator() {
70     return new RepetitionIterator();
71   }
72
73   @Override
74   public String toString() {
75     return toString("REPEAT " + repeatCount );
76   }
77
78   public int getRepeatCount() {
79     return repeatCount;
80   }
81
82   @Override
83   public void process (ElementProcessor p) {
84     p.process(this);
85   }
86 }