1 | /* This may look like C code, but it is really -*- C++ -*- */ |
2 | |
3 | /* A set of byte positions. |
4 | |
5 | Copyright (C) 1989-1998, 2000, 2002, 2005 Free Software Foundation, Inc. |
6 | Written by Douglas C. Schmidt <schmidt@ics.uci.edu> |
7 | and Bruno Haible <bruno@clisp.org>. |
8 | |
9 | This file is part of GNU GPERF. |
10 | |
11 | This program is free software: you can redistribute it and/or modify |
12 | it under the terms of the GNU General Public License as published by |
13 | the Free Software Foundation; either version 3 of the License, or |
14 | (at your option) any later version. |
15 | |
16 | This program is distributed in the hope that it will be useful, |
17 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
18 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
19 | GNU General Public License for more details. |
20 | |
21 | You should have received a copy of the GNU General Public License |
22 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
23 | |
24 | #ifndef positions_h |
25 | #define positions_h 1 |
26 | |
27 | /* Classes defined below. */ |
28 | class PositionIterator; |
29 | class PositionReverseIterator; |
30 | |
31 | /* This class denotes a set of byte positions, used to access a keyword. */ |
32 | |
33 | class Positions |
34 | { |
35 | friend class PositionIterator; |
36 | friend class PositionReverseIterator; |
37 | public: |
38 | /* Denotes the last char of a keyword, depending on the keyword's length. */ |
39 | enum { LASTCHAR = -1 }; |
40 | |
41 | /* Maximum key position specifiable by the user, 1-based. |
42 | Note that MAX_KEY_POS-1 must fit into the element type of _positions[], |
43 | below. */ |
44 | enum { MAX_KEY_POS = 255 }; |
45 | |
46 | /* Maximum possible size. Since duplicates are eliminated and the possible |
47 | 0-based positions are -1 .. MAX_KEY_POS-1, this is: */ |
48 | enum { MAX_SIZE = MAX_KEY_POS + 1 }; |
49 | |
50 | /* Constructors. */ |
51 | Positions (); |
52 | Positions (int pos1); |
53 | Positions (int pos1, int pos2); |
54 | |
55 | /* Copy constructor. */ |
56 | Positions (const Positions& src); |
57 | |
58 | /* Assignment operator. */ |
59 | Positions& operator= (const Positions& src); |
60 | |
61 | /* Accessors. */ |
62 | bool is_useall () const; |
63 | int operator[] (unsigned int index) const; |
64 | unsigned int get_size () const; |
65 | |
66 | /* Write access. */ |
67 | void set_useall (bool useall); |
68 | int * pointer (); |
69 | void set_size (unsigned int size); |
70 | |
71 | /* Sorts the array in reverse order. |
72 | Returns true if there are no duplicates, false otherwise. */ |
73 | bool sort (); |
74 | |
75 | /* Creates an iterator, returning the positions in descending order. */ |
76 | PositionIterator iterator () const; |
77 | /* Creates an iterator, returning the positions in descending order, |
78 | that apply to strings of length <= maxlen. */ |
79 | PositionIterator iterator (int maxlen) const; |
80 | /* Creates an iterator, returning the positions in ascending order. */ |
81 | PositionReverseIterator reviterator () const; |
82 | /* Creates an iterator, returning the positions in ascending order, |
83 | that apply to strings of length <= maxlen. */ |
84 | PositionReverseIterator reviterator (int maxlen) const; |
85 | |
86 | /* Set operations. Assumes the array is in reverse order. */ |
87 | bool contains (int pos) const; |
88 | void add (int pos); |
89 | void remove (int pos); |
90 | |
91 | /* Output in external syntax. */ |
92 | void print () const; |
93 | |
94 | private: |
95 | /* The special case denoted by '*'. */ |
96 | bool _useall; |
97 | /* Number of positions. */ |
98 | unsigned int _size; |
99 | /* Array of positions. 0 for the first char, 1 for the second char etc., |
100 | LASTCHAR for the last char. */ |
101 | int _positions[MAX_SIZE]; |
102 | }; |
103 | |
104 | /* This class denotes an iterator through a set of byte positions. */ |
105 | |
106 | class PositionIterator |
107 | { |
108 | friend class Positions; |
109 | public: |
110 | /* Copy constructor. */ |
111 | PositionIterator (const PositionIterator& src); |
112 | |
113 | /* End of iteration marker. */ |
114 | enum { EOS = -2 }; |
115 | |
116 | /* Retrieves the next position, or EOS past the end. */ |
117 | int next (); |
118 | |
119 | /* Returns the number of remaining positions, i.e. how often next() will |
120 | return a value != EOS. */ |
121 | unsigned int remaining () const; |
122 | |
123 | private: |
124 | /* Initializes an iterator through POSITIONS. */ |
125 | PositionIterator (Positions const& positions); |
126 | /* Initializes an iterator through POSITIONS, ignoring positions >= maxlen. */ |
127 | PositionIterator (Positions const& positions, int maxlen); |
128 | |
129 | const Positions& _set; |
130 | unsigned int _index; |
131 | }; |
132 | |
133 | /* This class denotes an iterator in reverse direction through a set of |
134 | byte positions. */ |
135 | |
136 | class PositionReverseIterator |
137 | { |
138 | friend class Positions; |
139 | public: |
140 | /* Copy constructor. */ |
141 | PositionReverseIterator (const PositionReverseIterator& src); |
142 | |
143 | /* End of iteration marker. */ |
144 | enum { EOS = -2 }; |
145 | |
146 | /* Retrieves the next position, or EOS past the end. */ |
147 | int next (); |
148 | |
149 | /* Returns the number of remaining positions, i.e. how often next() will |
150 | return a value != EOS. */ |
151 | unsigned int remaining () const; |
152 | |
153 | private: |
154 | /* Initializes an iterator through POSITIONS. */ |
155 | PositionReverseIterator (Positions const& positions); |
156 | /* Initializes an iterator through POSITIONS, ignoring positions >= maxlen. */ |
157 | PositionReverseIterator (Positions const& positions, int maxlen); |
158 | |
159 | const Positions& _set; |
160 | unsigned int _index; |
161 | unsigned int _minindex; |
162 | }; |
163 | |
164 | #ifdef __OPTIMIZE__ |
165 | |
166 | #include <string.h> |
167 | #define INLINE inline |
168 | #include "positions.icc" |
169 | #undef INLINE |
170 | |
171 | #endif |
172 | |
173 | #endif |
174 | |