Copyright test
[jalview.git] / src / com / stevesoft / pat / Or.java
1 /*******************************************************************************
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $(date) The Jalview Authors
4  *
5  * This file is part of Jalview.
6  *  
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *   
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  *******************************************************************************/
21 //
22 // This software is now distributed according to
23 // the Lesser Gnu Public License.  Please see
24 // http://www.gnu.org/copyleft/lesser.txt for
25 // the details.
26 //    -- Happy Computing!
27 //
28 package com.stevesoft.pat;
29
30 import java.util.Hashtable;
31 import java.util.Vector;
32
33 /**
34  * This class implements the (?: ... ) extended Pattern. It provides a base
35  * class from which we derive the [ ... ], ( ... ), (?! ... ), and (?= ... )
36  * patterns.
37  */
38 class Or extends Pattern
39 {
40   Vector v;
41
42   Pattern[] pv = null;
43
44   Or()
45   {
46     v = new Vector();
47   }
48
49   String leftForm()
50   {
51     return "(?:";
52   }
53
54   String rightForm()
55   {
56     return ")";
57   }
58
59   String sepForm()
60   {
61     return "|";
62   }
63
64   public Or addOr(Pattern p)
65   {
66     pv = null;
67     v.addElement(p);
68     p.setParent(this);
69     return this;
70   }
71
72   public String toString()
73   {
74     int i;
75     StringBuffer sb = new StringBuffer();
76     sb.append(leftForm());
77     if (v.size() > 0)
78     {
79       sb.append(((Pattern) v.elementAt(0)).toString());
80     }
81     for (i = 1; i < v.size(); i++)
82     {
83       sb.append(sepForm());
84       sb.append(((Pattern) v.elementAt(i)).toString());
85     }
86     sb.append(rightForm());
87     sb.append(nextString());
88     return sb.toString();
89   }
90
91   public int matchInternal(int pos, Pthings pt)
92   {
93     if (pv == null)
94     {
95       pv = new Pattern[v.size()];
96       v.copyInto(pv);
97     }
98     for (int i = 0; i < v.size(); i++)
99     {
100       Pattern p = pv[i]; // (Pattern)v.elementAt(i);
101       int r = p.matchInternal(pos, pt);
102       if (r >= 0)
103       {
104         return r;
105       }
106     }
107     return -1;
108   }
109
110   public patInt minChars()
111   {
112     if (v.size() == 0)
113     {
114       return new patInt(0);
115     }
116     patInt m = ((Pattern) v.elementAt(0)).countMinChars();
117     for (int i = 1; i < v.size(); i++)
118     {
119       Pattern p = (Pattern) v.elementAt(i);
120       m.mineq(p.countMinChars());
121     }
122     return m;
123   }
124
125   public patInt maxChars()
126   {
127     if (v.size() == 0)
128     {
129       return new patInt(0);
130     }
131     patInt m = ((Pattern) v.elementAt(0)).countMaxChars();
132     for (int i = 1; i < v.size(); i++)
133     {
134       Pattern p = (Pattern) v.elementAt(i);
135       m.maxeq(p.countMaxChars());
136     }
137     return m;
138   }
139
140   Pattern clone1(Hashtable h)
141   {
142     Or o = new Or();
143     h.put(this, o);
144     h.put(o, o);
145     for (int i = 0; i < v.size(); i++)
146     {
147       o.v.addElement(((Pattern) v.elementAt(i)).clone(h));
148     }
149     return o;
150   }
151 };