]> Creatis software - gdcm.git/blob - src/gdcmDocEntryArchive.cxx
* src/gdcmDocEntryArchive.cxx : complete the print function, that prints
[gdcm.git] / src / gdcmDocEntryArchive.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   gdcm
4   Module:    $RCSfile: gdcmDocEntryArchive.cxx,v $
5   Language:  C++
6   Date:      $Date: 2004/11/23 11:14:13 $
7   Version:   $Revision: 1.2 $
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 "gdcmDocEntryArchive.h"
20 #include "gdcmDebug.h"
21
22 #include <string>
23
24 namespace gdcm 
25 {
26 //-----------------------------------------------------------------------------
27 /**
28  * \brief Constructor
29  */
30 DocEntryArchive::DocEntryArchive(Header *header):
31    HeaderHT(header->TagHT)
32 {
33 }
34
35 //-----------------------------------------------------------------------------
36 /**
37  * \brief Destructor
38  */
39 DocEntryArchive::~DocEntryArchive()
40 {
41    ClearArchive();
42 }
43
44 //-----------------------------------------------------------------------------
45 // Print
46 /**
47  * \brief   Print all 
48  * @param   os The output stream to be written to.
49  */
50 void DocEntryArchive::Print(std::ostream &os) 
51 {
52    os << "Elements in archives :" << std::endl;
53    for(TagDocEntryHT::iterator it = Archive.begin();
54        it!=Archive.end();
55        ++it)
56    {
57       if(it->second)
58          it->second->Print(os);
59    }
60 }
61
62 //-----------------------------------------------------------------------------
63 // Public
64 /**
65  * \brief   Replace in the Header a DocEntry by the new DocEntry. The last
66  *          DocEntry is kept in archieve
67  * @param   newEntry New entry to substitute to an other entry of the Header
68  * @return  FALSE when an other DocEntry is already archieved with the same
69  *          generalized key, TRUE otherwise
70  */
71 bool DocEntryArchive::Push(DocEntry *newEntry)
72 {
73    if(!newEntry)
74       return(false);
75
76    uint16_t gr = newEntry->GetDictEntry()->GetGroup();
77    uint16_t elt = newEntry->GetDictEntry()->GetElement();
78    std::string key = DictEntry::TranslateToKey(gr,elt);
79
80    if( Archive.find(key)==Archive.end() )
81    {
82       // Save the old DocEntry if any
83       TagDocEntryHT::iterator it = HeaderHT.find(key);
84       if( it!=HeaderHT.end() )
85          Archive[key] = it->second;
86       else
87          Archive[key] = NULL;
88
89       // Set the new DocEntry
90       HeaderHT[key] = newEntry;
91
92       return(true);
93    }
94    return(false);
95 }
96
97 /**
98  * \brief   Restore in the Header the DocEntry that have the generalized key. 
99  *          The old entry is destroyed.
100  * @param   key Key of the DocEntry to restore
101  * @return  FALSE when the generalized key isn't in the archieve, 
102  *          TRUE otherwise
103  */
104 bool DocEntryArchive::Restore(uint16_t group,uint16_t element)
105 {
106    std::string key=DictEntry::TranslateToKey(group,element);
107
108    TagDocEntryHT::iterator restoreIt=Archive.find(key);
109    if( restoreIt!=Archive.end() )
110    {
111       TagDocEntryHT::iterator restorePos = HeaderHT.find(key);
112       if( restoreIt!=HeaderHT.end() )
113          delete restorePos->second;
114
115       if( Archive[key] )
116          HeaderHT[key] = Archive[key];
117       else
118          HeaderHT.erase(restorePos);
119
120       Archive.erase(restoreIt);
121
122       return(true);
123    }
124    return(false);
125 }
126
127 /**
128  * \brief   Remove all DocEntry that are in the archive. The entries aren't 
129  *          restored but only destroyed.
130  */
131 void DocEntryArchive::ClearArchive(void)
132 {
133    for(TagDocEntryHT::iterator it = Archive.begin();
134        it!=Archive.end();
135        ++it)
136    {
137       delete it->second;
138    }
139    Archive.clear();
140 }
141
142 //-----------------------------------------------------------------------------
143 // Protected
144
145 //-----------------------------------------------------------------------------
146 // Private
147
148 //-----------------------------------------------------------------------------
149
150 } // end namespace gdcm