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.  */
28class PositionIterator;
29class PositionReverseIterator;
30
31/* This class denotes a set of byte positions, used to access a keyword.  */
32
33class Positions
34{
35  friend class PositionIterator;
36  friend class PositionReverseIterator;
37public:
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
94private:
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
106class PositionIterator
107{
108  friend class Positions;
109public:
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
123private:
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
136class PositionReverseIterator
137{
138  friend class Positions;
139public:
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
153private:
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