DYT/Tool/3rdParty_x64/include/dcmtk/ofstd/ofsetit.h
2024-11-22 23:19:31 +08:00

142 lines
4.0 KiB
C++

/*
*
* Copyright (C) 2003-2010, OFFIS e.V.
* All rights reserved. See COPYRIGHT file for details.
*
* This software and supporting documentation were developed by
*
* OFFIS e.V.
* R&D Division Health
* Escherweg 2
* D-26121 Oldenburg, Germany
*
*
* Module: ofstd
*
* Author: Thomas Wilkens
*
* Purpose: Template class which represents an iterator class for corres-
* ponding set data structures in ofstd.
*
*/
#ifndef OFSETIT_H
#define OFSETIT_H
#include "dcmtk/config/osconfig.h"
#include "dcmtk/ofstd/oftypes.h"
#include "dcmtk/ofstd/ofset.h"
/** This template class represents an iterator class for corresponding set data structures in ofstd.
* Note the following properties of this class:
* - even if the underlying set is unordered, it does have an internal order which can be used for
* iteration purposes
* - a reference to the set which shall be iterated over will be remembered inside an object of
* OFSetIterator<T>; the set will NOT be copied
* - it is possible to iterate from beginning to end or from end to beginning of the underlying set
* using Next() or Prev() (see below)
* - if an element from the set is removed during the iteration, the iteration process has to be
* cancelled and restarted
* - two OFSetIterators can be compared through operators == and !=; two iterators are considered
* to be identical, if and only if they operate on the exact same set (identical memory addresses)
* and they currently refer to the same element
*/
template <class T> class OFSetIterator
{
protected:
/// reference to the set instance
OFSet<T> &ofset;
/// current position in the set
unsigned int pos;
public:
/** Constructor. The iterator will be set to the set's first element.
* @param ofsetv Set to which the created object shall be an iterator.
*/
OFSetIterator( OFSet<T> &ofsetv )
: ofset( ofsetv ), pos( 0 )
{
}
/** Destructor.
*/
virtual ~OFSetIterator()
{
}
/** Resets the iterator to the set's first element.
*/
void ResetBeginning()
{
pos = 0;
}
/** Resets the iterator to the set's last element.
*/
void ResetEnd()
{
unsigned int num = ofset.NumberOfElements();
if( num == 0 )
pos = 0;
else
pos = num - 1;
}
/** Returns the current element.
* @return Pointer to the current original element in the set.
*/
T *Object()
{
if( pos == ofset.NumberOfElements() )
return( NULL );
else
return( &ofset[pos] );
}
/** Sets the iterator to the next element in the set.
*/
void Next()
{
if( pos < ofset.NumberOfElements() )
pos++;
}
/** Sets the iterator to the previous element in the set.
*/
void Prev()
{
unsigned int num = ofset.NumberOfElements();
if( pos == 0 || pos == num )
pos = num;
else
pos--;
}
/** Determines if two iterators are identical.
* @param other Iterator which shall be compared with this.
* @return OFTrue if iterators are identical, OFFalse otherwise.
*/
OFBool operator==( const OFSetIterator<T> &other ) const
{
// two iterators are considered to be identical, if and only if they operate on the
// exact same set (identical addresses) and they currently refer to the same element
if( &ofset == &other.ofset && pos == other.pos )
return( OFTrue );
else
return( OFFalse );
}
/** Determines if two iterators are not identical.
* @param other Iterator which shall be compared with this.
* @return OFTrue if iterators are not identical, OFFalse otherwise.
*/
OFBool operator!=( const OFSetIterator<T> &other ) const
{
return( !( *this == other ) );
}
};
#endif