]> Creatis software - gdcm.git/blob - src/gdcmElementSet.cxx
dbf05c6065215f64dcf39c1dadd5bc4f271ede86
[gdcm.git] / src / gdcmElementSet.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   gdcm
4   Module:    $RCSfile: gdcmElementSet.cxx,v $
5   Language:  C++
6   Date:      $Date: 2005/01/25 15:44:24 $
7   Version:   $Revision: 1.51 $
8                                                                                 
9   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
10   l'Image). All rights reserved. See Doc/License.txt or
11   http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details.
12                                                                                 
13      This software is distributed WITHOUT ANY WARRANTY; without even
14      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15      PURPOSE.  See the above copyright notices for more information.
16                                                                                 
17 =========================================================================*/
18
19 #include "gdcmElementSet.h"
20 #include "gdcmDebug.h"
21 #include "gdcmValEntry.h"
22 #include "gdcmBinEntry.h"
23 #include "gdcmSeqEntry.h"
24
25 namespace gdcm 
26 {
27
28 //-----------------------------------------------------------------------------
29 // Constructor / Destructor
30 /**
31  * \brief   Constructor for a given ElementSet
32  */
33 //BOZ depthLevel is not usefull anymore
34 ElementSet::ElementSet(int depthLevel) 
35               : DocEntrySet()
36 {
37   (void)depthLevel;
38 }
39
40 /**
41  * \brief   Canonical destructor.
42  */
43 ElementSet::~ElementSet() 
44 {
45    ClearEntry();
46 }
47
48 //-----------------------------------------------------------------------------
49 // Print
50 /**
51   * \brief   Prints the Header Entries (Dicom Elements) from the H Table
52   * @param os ostream to write to  
53   * @param indent Indentation string to be prepended during printing
54   */ 
55 void ElementSet::Print(std::ostream &os, std::string const & )
56 {
57    for( TagDocEntryHT::const_iterator i = TagHT.begin(); i != TagHT.end(); ++i)
58    {
59       DocEntry* entry = i->second;
60
61       entry->SetPrintLevel(PrintLevel);
62       entry->Print(os);   
63
64       if ( dynamic_cast<SeqEntry*>(entry) )
65       {
66          // Avoid the newline for a sequence:
67          continue;
68       }
69       os << std::endl;
70    }
71 }
72
73 //-----------------------------------------------------------------------------
74 // Public
75 /**
76   * \brief   Writes the Header Entries (Dicom Elements)
77   *          from the H Table
78   * @param fp ofstream to write to  
79   * @param filetype filetype
80   */ 
81 void ElementSet::WriteContent(std::ofstream *fp, FileType filetype)
82 {
83    for (TagDocEntryHT::const_iterator i = TagHT.begin(); 
84                                      i != TagHT.end(); 
85                                     ++i)
86    {
87       i->second->WriteContent(fp, filetype);
88    } 
89 }
90
91 /**
92  * \brief   delete all entries in the ElementSet
93  */
94 void ElementSet::ClearEntry()
95 {
96    for(TagDocEntryHT::iterator cc = TagHT.begin();cc != TagHT.end(); ++cc)
97    {
98       if ( cc->second )
99       {
100          delete cc->second;
101       }
102    }
103    TagHT.clear();
104 }
105
106 /**
107  * \brief   add a new Dicom Element pointer to the H Table
108  * @param   newEntry entry to add
109  */
110 bool ElementSet::AddEntry(DocEntry *newEntry)
111 {
112    const TagKey &key = newEntry->GetKey();
113
114    if( TagHT.count(key) == 1 )
115    {
116       gdcmVerboseMacro( "Key already present: " << key.c_str());
117       return false;
118    }
119    else
120    {
121       TagHT.insert(TagDocEntryHT::value_type(newEntry->GetKey(), newEntry));
122       return true;
123    }
124 }
125
126 /**
127  * \brief   Clear the hash table from given entry AND delete the entry.
128  * @param   entryToRemove Entry to remove AND delete.
129  */
130 bool ElementSet::RemoveEntry( DocEntry *entryToRemove)
131 {
132    const TagKey &key = entryToRemove->GetKey();
133    if( TagHT.count(key) == 1 )
134    {
135       TagHT.erase(key);
136       //gdcmVerboseMacro( "One element erased.");
137       delete entryToRemove;
138       return true;
139    }
140
141    gdcmVerboseMacro( "Key not present");
142    return false ;
143 }
144
145 /**
146  * \brief   Clear the hash table from given entry BUT keep the entry.
147  * @param   entryToRemove Entry to remove.
148  */
149 bool ElementSet::RemoveEntryNoDestroy(DocEntry *entryToRemove)
150 {
151    const TagKey &key = entryToRemove->GetKey();
152    if( TagHT.count(key) == 1 )
153    {
154       TagHT.erase(key);
155       //gdcmVerboseMacro( "One element erased.");
156       return true;
157    }
158
159    gdcmVerboseMacro( "Key not present");
160    return false ;
161 }
162
163 /**
164  * \brief   Get the first entry while visiting the DocEntrySet
165  * \return  The first DocEntry if found, otherwhise NULL
166  */
167 DocEntry *ElementSet::GetFirstEntry()
168 {
169    ItTagHT = TagHT.begin();
170    if (ItTagHT != TagHT.end())
171       return  ItTagHT->second;
172    return NULL;
173 }
174
175 /**
176  * \brief   Get the next entry while visiting the Hash table (TagHT)
177  * \note : meaningfull only if GetFirstEntry already called 
178  * \return  The next DocEntry if found, otherwhise NULL
179  */
180 DocEntry *ElementSet::GetNextEntry()
181 {
182    gdcmAssertMacro (ItTagHT != TagHT.end());
183
184    ++ItTagHT;
185    if (ItTagHT != TagHT.end())
186       return  ItTagHT->second;
187    return NULL;
188 }
189
190 /**
191  * \brief  retrieves a Dicom Element using (group, element)
192  * @param   group  Group number of the searched Dicom Element 
193  * @param   elem Element number of the searched Dicom Element 
194  * @return  
195  */
196 DocEntry *ElementSet::GetDocEntry(uint16_t group, uint16_t elem) 
197 {
198    TagKey key = DictEntry::TranslateToKey(group, elem);
199    TagDocEntryHT::iterator it = TagHT.find(key);
200
201    if ( it!=TagHT.end() )
202       return it->second;
203    return NULL;
204 }
205
206 //-----------------------------------------------------------------------------
207 // Protected
208
209 //-----------------------------------------------------------------------------
210 // Private
211
212 //-----------------------------------------------------------------------------
213 } // end namespace gdcm