1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
|
/*
*
* Copyright (C) 2016-2017, 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: DSRIncludedTemplateNodeCursor
*
*/
#include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */
#include "dcmtk/dcmsr/dsritcsr.h"
#include "dcmtk/dcmsr/dsrdoctn.h"
#include "dcmtk/dcmsr/dsrtpltn.h"
#include "dcmtk/dcmsr/dsrstpl.h"
DSRIncludedTemplateNodeCursor::DSRIncludedTemplateNodeCursor()
: DSRTreeNodeCursor<DSRDocumentTreeNode>()
{
}
DSRIncludedTemplateNodeCursor::DSRIncludedTemplateNodeCursor(const DSRIncludedTemplateNodeCursor &cursor)
: DSRTreeNodeCursor<DSRDocumentTreeNode>(cursor)
{
}
DSRIncludedTemplateNodeCursor::DSRIncludedTemplateNodeCursor(DSRDocumentTreeNode *node,
const DSRPositionCounter *position)
: DSRTreeNodeCursor<DSRDocumentTreeNode>(node, position)
{
}
DSRIncludedTemplateNodeCursor::~DSRIncludedTemplateNodeCursor()
{
}
DSRIncludedTemplateNodeCursor &DSRIncludedTemplateNodeCursor::operator=(const DSRIncludedTemplateNodeCursor &cursor)
{
DSRTreeNodeCursor<DSRDocumentTreeNode>::operator=(cursor);
return *this;
}
DSRIncludedTemplateNodeCursor &DSRIncludedTemplateNodeCursor::operator=(DSRDocumentTreeNode *node)
{
DSRTreeNodeCursor<DSRDocumentTreeNode>::operator=(node);
return *this;
}
const DSRDocumentTreeNode *DSRIncludedTemplateNodeCursor::getChildNode() const
{
DSRDocumentTreeNode *node = NULL;
if (NodeCursor != NULL)
{
/* check for special case "included template" */
if (NodeCursor->getValueType() == DSRTypes::VT_includedTemplate)
{
DSRSubTemplate *subTempl = OFstatic_cast(DSRIncludedTemplateTreeNode *, NodeCursor)->getValue().get();
if (subTempl != NULL)
{
/* get root node of referenced subtree */
node = subTempl->getRoot();
}
} else {
/* standard case */
node = NodeCursor->getDown();
}
}
return node;
}
size_t DSRIncludedTemplateNodeCursor::countChildNodes(const OFBool searchIntoSub) const
{
size_t count = 0;
if (NodeCursor != NULL)
{
/* do we have any children at all? */
DSRDocumentTreeNodeCursor cursor(*this);
if (cursor.goDown())
{
/* iterate over all child nodes */
do {
++count;
} while (cursor.iterate(searchIntoSub));
}
}
return count;
}
size_t DSRIncludedTemplateNodeCursor::goDown()
{
size_t nodeID = 0;
if (NodeCursor != NULL)
{
/* check for special case "included template" */
if (NodeCursor->getValueType() == DSRTypes::VT_includedTemplate)
{
DSRSubTemplate *subTempl = OFstatic_cast(DSRIncludedTemplateTreeNode *, NodeCursor)->getValue().get();
if (subTempl != NULL)
{
NodeCursorStack.push(NodeCursor);
/* go to root node of referenced subtree */
NodeCursor = subTempl->getRoot();
nodeID = NodeCursor->getIdent();
Position.goDown();
}
}
/* standard case */
else if (NodeCursor->getDown() != NULL)
{
NodeCursorStack.push(NodeCursor);
NodeCursor = NodeCursor->getDown();
nodeID = NodeCursor->getIdent();
Position.goDown();
}
}
return nodeID;
}
size_t DSRIncludedTemplateNodeCursor::iterate(const OFBool searchIntoSub)
{
size_t nodeID = 0;
if (NodeCursor != NULL)
{
/* perform "deep search", if specified */
if (searchIntoSub && hasChildNodes())
nodeID = goDown();
else if (NodeCursor->getNext() != NULL)
{
NodeCursor = NodeCursor->getNext();
nodeID = NodeCursor->getIdent();
/* check for special case: do not count "included template" nodes? */
if ((NodeCursor->getValueType() != DSRTypes::VT_includedTemplate) || !(Position.getFlags() & DSRTypes::PF_dontCountIncludedTemplateNodes))
++Position;
}
else if (searchIntoSub && !NodeCursorStack.empty())
{
do {
if (!NodeCursorStack.empty())
{
NodeCursor = NodeCursorStack.top();
NodeCursorStack.pop();
Position.goUp();
} else
NodeCursor = NULL;
} while ((NodeCursor != NULL) && (NodeCursor->getNext() == NULL));
if (NodeCursor != NULL)
{
if (NodeCursor->getNext() != NULL)
{
NodeCursor = NodeCursor->getNext();
nodeID = NodeCursor->getIdent();
/* check for special case: do not count "included template" nodes? */
if ((NodeCursor->getValueType() != DSRTypes::VT_includedTemplate) || !(Position.getFlags() & DSRTypes::PF_dontCountIncludedTemplateNodes))
++Position;
}
}
}
}
return nodeID;
}
|