mirror of
https://git.savannah.gnu.org/git/gperf.git
synced 2025-12-02 21:19:24 +00:00
Move positions handling to its own file.
This commit is contained in:
114
src/options.icc
114
src/options.icc
@@ -21,120 +21,6 @@
|
||||
If not, write to the Free Software Foundation, Inc.,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* ---------------------------- Class Positions ---------------------------- */
|
||||
|
||||
/* Constructors. */
|
||||
|
||||
INLINE
|
||||
Positions::Positions ()
|
||||
: _size (0)
|
||||
{
|
||||
}
|
||||
|
||||
INLINE
|
||||
Positions::Positions (int pos1)
|
||||
: _size (1)
|
||||
{
|
||||
_positions[0] = pos1;
|
||||
}
|
||||
|
||||
INLINE
|
||||
Positions::Positions (int pos1, int pos2)
|
||||
: _size (2)
|
||||
{
|
||||
_positions[0] = pos1;
|
||||
_positions[1] = pos2;
|
||||
}
|
||||
|
||||
/* Copy constructor. */
|
||||
|
||||
INLINE
|
||||
Positions::Positions (const Positions& src)
|
||||
: _size (src._size)
|
||||
{
|
||||
memcpy (_positions, src._positions, _size * sizeof (_positions[0]));
|
||||
}
|
||||
|
||||
/* Assignment operator. */
|
||||
|
||||
INLINE Positions&
|
||||
Positions::operator= (const Positions& src)
|
||||
{
|
||||
_size = src._size;
|
||||
memcpy (_positions, src._positions, _size * sizeof (_positions[0]));
|
||||
return *this;
|
||||
}
|
||||
|
||||
/* Accessors. */
|
||||
|
||||
INLINE int
|
||||
Positions::operator[] (unsigned int index) const
|
||||
{
|
||||
return _positions[index];
|
||||
}
|
||||
|
||||
INLINE unsigned int
|
||||
Positions::get_size () const
|
||||
{
|
||||
return _size;
|
||||
}
|
||||
|
||||
/* Write access. */
|
||||
|
||||
INLINE unsigned char *
|
||||
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 ()
|
||||
{
|
||||
/* Bubble sort. */
|
||||
bool duplicate_free = true;
|
||||
unsigned char *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;
|
||||
}
|
||||
|
||||
/* ------------------------- Class PositionIterator ------------------------ */
|
||||
|
||||
/* Initializes an iterator through POSITIONS. */
|
||||
INLINE
|
||||
PositionIterator::PositionIterator (Positions const& positions)
|
||||
: _set (positions),
|
||||
_index (0)
|
||||
{
|
||||
}
|
||||
|
||||
/* Retrieves the next position, or EOS past the end. */
|
||||
INLINE int
|
||||
PositionIterator::next ()
|
||||
{
|
||||
return (_index < _set._size ? _set._positions[_index++] : EOS);
|
||||
}
|
||||
|
||||
/* ----------------------------- Class Options ----------------------------- */
|
||||
|
||||
/* Tests a given boolean option. Returns true if set, false otherwise. */
|
||||
|
||||
Reference in New Issue
Block a user