Merge branch 'releases/Release_2_11_3_Branch'
[jalview.git] / src / com / stevesoft / pat / Or.java
1 //
2 // This software is now distributed according to
3 // the Lesser Gnu Public License.  Please see
4 // http://www.gnu.org/copyleft/lesser.txt for
5 // the details.
6 //    -- Happy Computing!
7 //
8 package com.stevesoft.pat;
9
10 import java.util.Hashtable;
11 import java.util.Vector;
12
13 /**
14  * This class implements the (?: ... ) extended Pattern. It provides a base
15  * class from which we derive the [ ... ], ( ... ), (?! ... ), and (?= ... )
16  * patterns.
17  */
18 class Or extends Pattern
19 {
20   Vector v;
21
22   Pattern[] pv = null;
23
24   Or()
25   {
26     v = new Vector();
27   }
28
29   String leftForm()
30   {
31     return "(?:";
32   }
33
34   String rightForm()
35   {
36     return ")";
37   }
38
39   String sepForm()
40   {
41     return "|";
42   }
43
44   public Or addOr(Pattern p)
45   {
46     pv = null;
47     v.addElement(p);
48     p.setParent(this);
49     return this;
50   }
51
52   public String toString()
53   {
54     int i;
55     StringBuffer sb = new StringBuffer();
56     sb.append(leftForm());
57     if (v.size() > 0)
58     {
59       sb.append(((Pattern) v.elementAt(0)).toString());
60     }
61     for (i = 1; i < v.size(); i++)
62     {
63       sb.append(sepForm());
64       sb.append(((Pattern) v.elementAt(i)).toString());
65     }
66     sb.append(rightForm());
67     sb.append(nextString());
68     return sb.toString();
69   }
70
71   public int matchInternal(int pos, Pthings pt)
72   {
73     if (pv == null)
74     {
75       pv = new Pattern[v.size()];
76       v.copyInto(pv);
77     }
78     for (int i = 0; i < v.size(); i++)
79     {
80       Pattern p = pv[i]; // (Pattern)v.elementAt(i);
81       int r = p.matchInternal(pos, pt);
82       if (r >= 0)
83       {
84         return r;
85       }
86     }
87     return -1;
88   }
89
90   public patInt minChars()
91   {
92     if (v.size() == 0)
93     {
94       return new patInt(0);
95     }
96     patInt m = ((Pattern) v.elementAt(0)).countMinChars();
97     for (int i = 1; i < v.size(); i++)
98     {
99       Pattern p = (Pattern) v.elementAt(i);
100       m.mineq(p.countMinChars());
101     }
102     return m;
103   }
104
105   public patInt maxChars()
106   {
107     if (v.size() == 0)
108     {
109       return new patInt(0);
110     }
111     patInt m = ((Pattern) v.elementAt(0)).countMaxChars();
112     for (int i = 1; i < v.size(); i++)
113     {
114       Pattern p = (Pattern) v.elementAt(i);
115       m.maxeq(p.countMaxChars());
116     }
117     return m;
118   }
119
120   Pattern clone1(Hashtable h)
121   {
122     Or o = new Or();
123     h.put(this, o);
124     h.put(o, o);
125     for (int i = 0; i < v.size(); i++)
126     {
127       o.v.addElement(((Pattern) v.elementAt(i)).clone(h));
128     }
129     return o;
130   }
131 };