summaryrefslogtreecommitdiff
path: root/src/positions.h
blob: 1c883a49d3f51a7d1f40d2aab94e1e6258c7ebe0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/* This may look like C code, but it is really -*- C++ -*- */

/* A set of byte positions.

   Copyright (C) 1989-1998, 2000, 2002 Free Software Foundation, Inc.
   Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
   and Bruno Haible <bruno@clisp.org>.

   This file is part of GNU GPERF.

   GNU GPERF is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2, or (at your option)
   any later version.

   GNU GPERF is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; see the file COPYING.
   If not, write to the Free Software Foundation, Inc.,
   59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */

#ifndef positions_h
#define positions_h 1

/* This class denotes a set of byte positions, used to access a keyword.  */

class Positions
{
  friend class PositionIterator;
  friend class PositionReverseIterator;
public:
  /* Denotes the last char of a keyword, depending on the keyword's length.  */
  enum {                LASTCHAR = 0 };

  /* Maximum key position specifiable by the user.
     Note that this must fit into the element type of _positions[], below.  */
  enum {                MAX_KEY_POS = 255 };

  /* Constructors.  */
                        Positions ();
                        Positions (int pos1);
                        Positions (int pos1, int pos2);

  /* Copy constructor.  */
                        Positions (const Positions& src);

  /* Assignment operator.  */
  Positions&            operator= (const Positions& src);

  /* Accessors.  */
  int                   operator[] (unsigned int index) const;
  unsigned int          get_size () const;

  /* Write access.  */
  unsigned char *       pointer ();
  void                  set_size (unsigned int size);

  /* Sorts the array in reverse order.
     Returns true if there are no duplicates, false otherwise.  */
  bool                  sort ();

  /* Set operations.  Assumes the array is in reverse order.  */
  bool                  contains (int pos) const;
  void                  add (int pos);
  void                  remove (int pos);

  /* Output in external syntax.  */
  void                  print () const;

private:
  /* Number of positions.  */
  unsigned int          _size;
  /* Array of positions.  1 for the first char, 2 for the second char etc.,
     LASTCHAR for the last char.
     Note that since duplicates are eliminated, the maximum possible size
     is MAX_KEY_POS + 1.  */
  unsigned char         _positions[MAX_KEY_POS + 1];
};

/* This class denotes an iterator through a set of byte positions.  */

class PositionIterator
{
public:
  /* Initializes an iterator through POSITIONS.  */
                        PositionIterator (Positions const& positions);

  /* End of iteration marker.  */
  enum {                EOS = -1 };

  /* Retrieves the next position, or EOS past the end.  */
  int                   next ();

private:
  const Positions&      _set;
  unsigned int          _index;
};

/* This class denotes an iterator in reverse direction through a set of
   byte positions.  */

class PositionReverseIterator
{
public:
  /* Initializes an iterator through POSITIONS.  */
                        PositionReverseIterator (Positions const& positions);

  /* End of iteration marker.  */
  enum {                EOS = -1 };

  /* Retrieves the next position, or EOS past the end.  */
  int                   next ();

private:
  const Positions&      _set;
  unsigned int          _index;
};

#ifdef __OPTIMIZE__

#include <string.h>
#define INLINE inline
#include "positions.icc"
#undef INLINE

#endif

#endif