| Index: gperf/src/gperf/3.0.1/gperf-3.0.1-src/src/positions.icc |
| =================================================================== |
| --- gperf/src/gperf/3.0.1/gperf-3.0.1-src/src/positions.icc (revision 0) |
| +++ gperf/src/gperf/3.0.1/gperf-3.0.1-src/src/positions.icc (revision 0) |
| @@ -0,0 +1,285 @@ |
| +/* Inline Functions for positions.{h,cc}. |
| + |
| + 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. */ |
| + |
| +// This needs: |
| +//#include <string.h> |
| + |
| +/* ---------------------------- Class Positions ---------------------------- */ |
| + |
| +/* Constructors. */ |
| + |
| +INLINE |
| +Positions::Positions () |
| + : _useall (false), |
| + _size (0) |
| +{ |
| +} |
| + |
| +INLINE |
| +Positions::Positions (int pos1) |
| + : _useall (false), |
| + _size (1) |
| +{ |
| + _positions[0] = pos1; |
| +} |
| + |
| +INLINE |
| +Positions::Positions (int pos1, int pos2) |
| + : _useall (false), |
| + _size (2) |
| +{ |
| + _positions[0] = pos1; |
| + _positions[1] = pos2; |
| +} |
| + |
| +/* Copy constructor. */ |
| + |
| +INLINE |
| +Positions::Positions (const Positions& src) |
| + : _useall (src._useall), |
| + _size (src._size) |
| +{ |
| + memcpy (_positions, src._positions, _size * sizeof (_positions[0])); |
| +} |
| + |
| +/* Assignment operator. */ |
| + |
| +INLINE Positions& |
| +Positions::operator= (const Positions& src) |
| +{ |
| + _useall = src._useall; |
| + _size = src._size; |
| + memcpy (_positions, src._positions, _size * sizeof (_positions[0])); |
| + return *this; |
| +} |
| + |
| +/* Accessors. */ |
| + |
| +INLINE bool |
| +Positions::is_useall () const |
| +{ |
| + return _useall; |
| +} |
| + |
| +INLINE int |
| +Positions::operator[] (unsigned int index) const |
| +{ |
| + return _positions[index]; |
| +} |
| + |
| +INLINE unsigned int |
| +Positions::get_size () const |
| +{ |
| + return _size; |
| +} |
| + |
| +/* Write access. */ |
| + |
| +INLINE void |
| +Positions::set_useall (bool useall) |
| +{ |
| + _useall = useall; |
| + if (useall) |
| + { |
| + /* The positions are 0, 1, ..., MAX_KEY_POS-1, in descending order. */ |
| + _size = MAX_KEY_POS; |
| + int *ptr = _positions; |
| + for (int i = MAX_KEY_POS - 1; i >= 0; i--) |
| + *ptr++ = i; |
| + } |
| +} |
| + |
| +INLINE int * |
| +Positions::pointer () |
| +{ |
| + return _positions; |
| +} |
| + |
| +INLINE void |
| +Positions::set_size (unsigned int size) |
| +{ |
| + _size = size; |
| +} |
| + |
| +/* Sorts the array in reverse order. |
| + Returns true if there are no duplicates, false otherwise. */ |
| +INLINE bool |
| +Positions::sort () |
| +{ |
| + if (_useall) |
| + return true; |
| + |
| + /* Bubble sort. */ |
| + bool duplicate_free = true; |
| + int *base = _positions; |
| + unsigned int len = _size; |
| + |
| + for (unsigned int i = 1; i < len; i++) |
| + { |
| + unsigned int j; |
| + int tmp; |
| + |
| + for (j = i, tmp = base[j]; j > 0 && tmp >= base[j - 1]; j--) |
| + if ((base[j] = base[j - 1]) == tmp) /* oh no, a duplicate!!! */ |
| + duplicate_free = false; |
| + |
| + base[j] = tmp; |
| + } |
| + |
| + return duplicate_free; |
| +} |
| + |
| +/* Creates an iterator, returning the positions in descending order. */ |
| +INLINE PositionIterator |
| +Positions::iterator () const |
| +{ |
| + return PositionIterator (*this); |
| +} |
| + |
| +/* Creates an iterator, returning the positions in descending order, |
| + that apply to strings of length <= maxlen. */ |
| +INLINE PositionIterator |
| +Positions::iterator (int maxlen) const |
| +{ |
| + return PositionIterator (*this, maxlen); |
| +} |
| + |
| +/* Creates an iterator, returning the positions in ascending order. */ |
| +INLINE PositionReverseIterator |
| +Positions::reviterator () const |
| +{ |
| + return PositionReverseIterator (*this); |
| +} |
| + |
| +/* Creates an iterator, returning the positions in ascending order, |
| + that apply to strings of length <= maxlen. */ |
| +INLINE PositionReverseIterator |
| +Positions::reviterator (int maxlen) const |
| +{ |
| + return PositionReverseIterator (*this, maxlen); |
| +} |
| + |
| +/* ------------------------- Class PositionIterator ------------------------ */ |
| + |
| +/* Initializes an iterator through POSITIONS. */ |
| +INLINE |
| +PositionIterator::PositionIterator (Positions const& positions) |
| + : _set (positions), |
| + _index (0) |
| +{ |
| +} |
| + |
| +/* Initializes an iterator through POSITIONS, ignoring positions >= maxlen. */ |
| +INLINE |
| +PositionIterator::PositionIterator (Positions const& positions, int maxlen) |
| + : _set (positions) |
| +{ |
| + if (positions._useall) |
| + _index = (maxlen <= Positions::MAX_KEY_POS ? Positions::MAX_KEY_POS - maxlen : 0); |
| + else |
| + { |
| + unsigned int index; |
| + for (index = 0; |
| + index < positions._size && positions._positions[index] >= maxlen; |
| + index++) |
| + ; |
| + _index = index; |
| + } |
| +} |
| + |
| +/* Retrieves the next position, or EOS past the end. */ |
| +INLINE int |
| +PositionIterator::next () |
| +{ |
| + return (_index < _set._size ? _set._positions[_index++] : EOS); |
| +} |
| + |
| +/* Returns the number of remaining positions, i.e. how often next() will |
| + return a value != EOS. */ |
| +INLINE unsigned int |
| +PositionIterator::remaining () const |
| +{ |
| + return _set._size - _index; |
| +} |
| + |
| +/* Copy constructor. */ |
| +INLINE |
| +PositionIterator::PositionIterator (const PositionIterator& src) |
| + : _set (src._set), |
| + _index (src._index) |
| +{ |
| +} |
| + |
| +/* --------------------- Class PositionReverseIterator --------------------- */ |
| + |
| +/* Initializes an iterator through POSITIONS. */ |
| +INLINE |
| +PositionReverseIterator::PositionReverseIterator (Positions const& positions) |
| + : _set (positions), |
| + _index (_set._size), |
| + _minindex (0) |
| +{ |
| +} |
| + |
| +/* Initializes an iterator through POSITIONS, ignoring positions >= maxlen. */ |
| +INLINE |
| +PositionReverseIterator::PositionReverseIterator (Positions const& positions, int maxlen) |
| + : _set (positions), |
| + _index (_set._size) |
| +{ |
| + if (positions._useall) |
| + _minindex = (maxlen <= Positions::MAX_KEY_POS ? Positions::MAX_KEY_POS - maxlen : 0); |
| + else |
| + { |
| + unsigned int index; |
| + for (index = 0; |
| + index < positions._size && positions._positions[index] >= maxlen; |
| + index++) |
| + ; |
| + _minindex = index; |
| + } |
| +} |
| + |
| +/* Retrieves the next position, or EOS past the end. */ |
| +INLINE int |
| +PositionReverseIterator::next () |
| +{ |
| + return (_index > _minindex ? _set._positions[--_index] : EOS); |
| +} |
| + |
| +/* Returns the number of remaining positions, i.e. how often next() will |
| + return a value != EOS. */ |
| +INLINE unsigned int |
| +PositionReverseIterator::remaining () const |
| +{ |
| + return _index - _minindex; |
| +} |
| + |
| +/* Copy constructor. */ |
| +INLINE |
| +PositionReverseIterator::PositionReverseIterator (const PositionReverseIterator& src) |
| + : _set (src._set), |
| + _index (src._index), |
| + _minindex (src._minindex) |
| +{ |
| +} |
| |