168 lines
4.7 KiB
C
168 lines
4.7 KiB
C
|
/*
|
||
|
*
|
||
|
* Copyright (C) 2016, J. Riesmeier, Oldenburg, Germany
|
||
|
* All rights reserved. See COPYRIGHT file for details.
|
||
|
*
|
||
|
* This software and supporting documentation are maintained by
|
||
|
*
|
||
|
* OFFIS e.V.
|
||
|
* R&D Division Health
|
||
|
* Escherweg 2
|
||
|
* D-26121 Oldenburg, Germany
|
||
|
*
|
||
|
*
|
||
|
* Module: dcmsr
|
||
|
*
|
||
|
* Author: Joerg Riesmeier
|
||
|
*
|
||
|
* Purpose:
|
||
|
* classes: DSRPositionCounter
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
|
||
|
#ifndef DSRPOSCN_H
|
||
|
#define DSRPOSCN_H
|
||
|
|
||
|
#include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */
|
||
|
|
||
|
#include "dcmtk/dcmsr/dsdefine.h"
|
||
|
|
||
|
#include "dcmtk/ofstd/ofstring.h"
|
||
|
#include "dcmtk/ofstd/oflist.h"
|
||
|
|
||
|
|
||
|
/*---------------------*
|
||
|
* class declaration *
|
||
|
*---------------------*/
|
||
|
|
||
|
/** Class implementing a position counter to be used for iterating a tree of nodes
|
||
|
*/
|
||
|
class DCMTK_DCMSR_EXPORT DSRPositionCounter
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
/** (default) constructor
|
||
|
** @param flags optional flags used to customize the processing of the counter.
|
||
|
* These flags are only stored but not evaluated by this class.
|
||
|
*/
|
||
|
DSRPositionCounter(const size_t flags = 0);
|
||
|
|
||
|
/** copy constructor
|
||
|
** @param counter object to be copied
|
||
|
*/
|
||
|
DSRPositionCounter(const DSRPositionCounter &counter);
|
||
|
|
||
|
/** destructor
|
||
|
*/
|
||
|
virtual ~DSRPositionCounter();
|
||
|
|
||
|
/** assignment operator
|
||
|
** @param counter object to be copied
|
||
|
** @return reference to modified cursor (this object)
|
||
|
*/
|
||
|
DSRPositionCounter &operator=(const DSRPositionCounter &counter);
|
||
|
|
||
|
/** conversion operator that returns the position on the current level
|
||
|
* (0 if the position counter is invalid)
|
||
|
*/
|
||
|
inline operator size_t () const
|
||
|
{
|
||
|
return Position;
|
||
|
}
|
||
|
|
||
|
/** pre-increment operator. Increases the position on the current level by 1.
|
||
|
* Also makes the position counter valid if it was invalid before.
|
||
|
*/
|
||
|
inline DSRPositionCounter &operator++()
|
||
|
{
|
||
|
++Position;
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
/** pre-decrement operator. Decreases the position on the current level by 1.
|
||
|
* This makes the position counter invalid if the position was 1 before.
|
||
|
*/
|
||
|
inline DSRPositionCounter &operator--()
|
||
|
{
|
||
|
/* avoid underflow */
|
||
|
if (Position > 0) --Position;
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
/** clear all member variables.
|
||
|
* The position counter becomes invalid afterwards (same state as after default
|
||
|
* construction). Also see initialize().
|
||
|
*/
|
||
|
void clear();
|
||
|
|
||
|
/** initialize the position counter
|
||
|
** @param valid flag specifying whether the counter should be initialized as
|
||
|
* valid (default) or invalid
|
||
|
* @param flags optional flags used to customize the processing of the counter.
|
||
|
* These flags are only stored but not evaluated by this class.
|
||
|
*/
|
||
|
void initialize(const OFBool valid = OFTrue,
|
||
|
const size_t flags = 0);
|
||
|
|
||
|
/** check whether position counter is valid (i.e.\ has been initialized)
|
||
|
** @return OFTrue if valid, OFFalse otherwise
|
||
|
*/
|
||
|
inline OFBool isValid() const
|
||
|
{
|
||
|
return (Position > 0);
|
||
|
}
|
||
|
|
||
|
/** go one level up, i.e.\ restore the position on the next upper level and forget
|
||
|
* about the current level
|
||
|
** @return OFTrue if successful, OFFalse otherwise
|
||
|
*/
|
||
|
OFBool goUp();
|
||
|
|
||
|
/** go one level down, i.e.\ store the position on the current level and start with
|
||
|
* 1 on the new level
|
||
|
** @return OFTrue if successful, OFFalse otherwise
|
||
|
*/
|
||
|
OFBool goDown();
|
||
|
|
||
|
/** get specified flags that can be used to customize the counter
|
||
|
** @return flags used to customize the counter
|
||
|
*/
|
||
|
inline size_t getFlags() const
|
||
|
{
|
||
|
return Flags;
|
||
|
}
|
||
|
|
||
|
/** get current level of the position counter.
|
||
|
* The top most (root) level is 1, the next lower level is 2, etc.
|
||
|
** @return number of the current level if valid, 0 otherwise
|
||
|
*/
|
||
|
inline size_t getLevel() const
|
||
|
{
|
||
|
/* check for valid counter */
|
||
|
return isValid() ? PositionList.size() + 1 : 0;
|
||
|
}
|
||
|
|
||
|
/** get string representing the current state of the position counter.
|
||
|
* See DSRTreeNodeCursor::getPosition() for details.
|
||
|
** @param position variable where the position string should be stored
|
||
|
* @param separator character used to separate the figures (default: '.')
|
||
|
** @return reference to the resulting position string (empty if invalid)
|
||
|
*/
|
||
|
const OFString &getString(OFString &position,
|
||
|
const char separator = '.') const;
|
||
|
|
||
|
|
||
|
private:
|
||
|
|
||
|
/// current position within the current level
|
||
|
size_t Position;
|
||
|
/// list of position counters in upper levels
|
||
|
OFList<size_t> PositionList;
|
||
|
/// flags used to customize the counter
|
||
|
size_t Flags;
|
||
|
};
|
||
|
|
||
|
|
||
|
#endif
|