|
Packit Service |
75d76b |
/*
|
|
Packit Service |
75d76b |
* Copyright (c) 2020 Red Hat, Inc.
|
|
Packit Service |
75d76b |
*
|
|
Packit Service |
75d76b |
* This program is free software; you can redistribute it and/or
|
|
Packit Service |
75d76b |
* modify it under the terms of the GNU General Public License
|
|
Packit Service |
75d76b |
* as published by the Free Software Foundation; either version 2
|
|
Packit Service |
75d76b |
* of the License, or (at your option) any later version.
|
|
Packit Service |
75d76b |
*
|
|
Packit Service |
75d76b |
* This program is distributed in the hope that it will be useful,
|
|
Packit Service |
75d76b |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
75d76b |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit Service |
75d76b |
* GNU General Public License for more details.
|
|
Packit Service |
75d76b |
*
|
|
Packit Service |
75d76b |
* You should have received a copy of the GNU General Public License
|
|
Packit Service |
75d76b |
* along with this program; if not, write to the Free Software
|
|
Packit Service |
75d76b |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
Packit Service |
75d76b |
* 02110-1301, USA.
|
|
Packit Service |
75d76b |
*
|
|
Packit Service |
75d76b |
* $Id: //eng/vdo-releases/aluminum/src/c++/vdo/base/slabIterator.h#1 $
|
|
Packit Service |
75d76b |
*/
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
#ifndef SLAB_ITERATOR_H
|
|
Packit Service |
75d76b |
#define SLAB_ITERATOR_H
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
#include "slab.h"
|
|
Packit Service |
75d76b |
#include "types.h"
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**
|
|
Packit Service |
75d76b |
* SlabIterator is a structure for iterating over a set of slabs.
|
|
Packit Service |
75d76b |
**/
|
|
Packit Service |
75d76b |
typedef struct {
|
|
Packit Service |
75d76b |
Slab **slabs;
|
|
Packit Service |
75d76b |
Slab *next;
|
|
Packit Service |
75d76b |
SlabCount end;
|
|
Packit Service |
75d76b |
SlabCount stride;
|
|
Packit Service |
75d76b |
} SlabIterator;
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**
|
|
Packit Service |
75d76b |
* Return a SlabIterator initialized to iterate over an array of slabs
|
|
Packit Service |
75d76b |
* with a given stride. Iteration always occurs from higher to lower numbered
|
|
Packit Service |
75d76b |
* slabs.
|
|
Packit Service |
75d76b |
*
|
|
Packit Service |
75d76b |
* @param slabs The array of slabs
|
|
Packit Service |
75d76b |
* @param start The number of the slab to start iterating from
|
|
Packit Service |
75d76b |
* @param end The number of the last slab which may be returned
|
|
Packit Service |
75d76b |
* @param stride The difference in slab number between successive slabs
|
|
Packit Service |
75d76b |
*
|
|
Packit Service |
75d76b |
* @return an initialized iterator structure
|
|
Packit Service |
75d76b |
**/
|
|
Packit Service |
75d76b |
static inline SlabIterator iterateSlabs(Slab **slabs,
|
|
Packit Service |
75d76b |
SlabCount start,
|
|
Packit Service |
75d76b |
SlabCount end,
|
|
Packit Service |
75d76b |
SlabCount stride)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
return (SlabIterator) {
|
|
Packit Service |
75d76b |
.slabs = slabs,
|
|
Packit Service |
75d76b |
.next = (((slabs == NULL) || (start < end)) ? NULL : slabs[start]),
|
|
Packit Service |
75d76b |
.end = end,
|
|
Packit Service |
75d76b |
.stride = stride,
|
|
Packit Service |
75d76b |
};
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**
|
|
Packit Service |
75d76b |
* Check whether another Slab would be returned by the iterator.
|
|
Packit Service |
75d76b |
*
|
|
Packit Service |
75d76b |
* @param iterator The iterator to poll
|
|
Packit Service |
75d76b |
*
|
|
Packit Service |
75d76b |
* @return true if the next call to nextSlab
|
|
Packit Service |
75d76b |
* will return a Slab
|
|
Packit Service |
75d76b |
**/
|
|
Packit Service |
75d76b |
static inline bool hasNextSlab(const SlabIterator *iterator)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
return (iterator->next != NULL);
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**
|
|
Packit Service |
75d76b |
* Get the next Slab, advancing the iterator.
|
|
Packit Service |
75d76b |
*
|
|
Packit Service |
75d76b |
* @param iterator The iterator over the Slab chain
|
|
Packit Service |
75d76b |
*
|
|
Packit Service |
75d76b |
* @return the next Slab or NULL if the array of slabs is empty
|
|
Packit Service |
75d76b |
* or if all the appropriate Slabs have been returned
|
|
Packit Service |
75d76b |
**/
|
|
Packit Service |
75d76b |
static inline Slab *nextSlab(SlabIterator *iterator)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
Slab *slab = iterator->next;
|
|
Packit Service |
75d76b |
if ((slab == NULL)
|
|
Packit Service |
75d76b |
|| (slab->slabNumber < iterator->end + iterator->stride)) {
|
|
Packit Service |
75d76b |
iterator->next = NULL;
|
|
Packit Service |
75d76b |
} else {
|
|
Packit Service |
75d76b |
iterator->next = iterator->slabs[slab->slabNumber - iterator->stride];
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
return slab;
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
#endif // SLAB_ITERATOR_H
|