X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmDocEntryArchive.cxx;h=d3213c26164a01137aa76aa2100575b19ad59f6c;hb=721d134c6e594b9a23bf1ce002ed87bfbc1576a7;hp=9a5a498cee8d36921f7ae74244b29617850e8922;hpb=c42ce41966ee7a572752d7f45ddff25b90515119;p=gdcm.git diff --git a/src/gdcmDocEntryArchive.cxx b/src/gdcmDocEntryArchive.cxx index 9a5a498c..d3213c26 100644 --- a/src/gdcmDocEntryArchive.cxx +++ b/src/gdcmDocEntryArchive.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmDocEntryArchive.cxx,v $ Language: C++ - Date: $Date: 2004/11/24 10:23:47 $ - Version: $Revision: 1.3 $ + Date: $Date: 2007/05/23 14:18:09 $ + Version: $Revision: 1.19 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -18,21 +18,22 @@ #include "gdcmDocEntryArchive.h" #include "gdcmDebug.h" +#include "gdcmDocEntry.h" #include -namespace gdcm +namespace GDCM_NAME_SPACE { //----------------------------------------------------------------------------- +// Constructor / Destructor /** * \brief Constructor */ -DocEntryArchive::DocEntryArchive(Header *header): - HeaderHT(header->TagHT) +DocEntryArchive::DocEntryArchive(File *file) { + ArchFile = file; } -//----------------------------------------------------------------------------- /** * \brief Destructor */ @@ -41,136 +42,124 @@ DocEntryArchive::~DocEntryArchive() ClearArchive(); } -//----------------------------------------------------------------------------- -// Print -/** - * \brief Print all - * @param os The output stream to be written to. - */ -void DocEntryArchive::Print(std::ostream &os) -{ - os << "Elements in archives :" << std::endl; - for(TagDocEntryHT::iterator it = Archive.begin(); - it!=Archive.end(); - ++it) - { - if(it->second) - it->second->Print(os); - } -} - //----------------------------------------------------------------------------- // Public /** - * \brief Replace in the Header a DocEntry by the new DocEntry. The last - * DocEntry is kept in archieve + * \brief Replaces in the Header a DocEntry by the new DocEntry. + * The initial DocEntry is kept in archive. * @param newEntry New entry to substitute to an other entry of the Header - * @return FALSE when an other DocEntry is already archieved with the same - * generalized key, TRUE otherwise + * @return FALSE when an other DocEntry is already archived with the same key + * TRUE otherwise */ bool DocEntryArchive::Push(DocEntry *newEntry) { - if(!newEntry) - return(false); + if ( !newEntry ) + return false; - uint16_t gr = newEntry->GetDictEntry()->GetGroup(); - uint16_t elt = newEntry->GetDictEntry()->GetElement(); - std::string key = DictEntry::TranslateToKey(gr,elt); + //uint16_t group = newEntry->GetDictEntry()->GetGroup(); + //uint16_t elem = newEntry->GetDictEntry()->GetElement(); + //TagKey key = DictEntry::TranslateToKey(group,elem); - if( Archive.find(key)==Archive.end() ) + TagKey key = newEntry->GetKey(); + + if ( Archive.find(key) == Archive.end() ) { + uint16_t group = newEntry->GetGroup(); + uint16_t elem = newEntry->GetElement(); + // Save the old DocEntry if any - TagDocEntryHT::iterator it = HeaderHT.find(key); - if( it!=HeaderHT.end() ) + DocEntry *old = ArchFile->GetDocEntry(group, elem); + Archive[key] = old; + if ( old ) { - Archive[key] = it->second; - } - else - { - Archive[key] = NULL; + old->Register(); + ArchFile->RemoveEntry(old); } // Set the new DocEntry - HeaderHT[key] = newEntry; + ArchFile->AddEntry(newEntry); - return(true); + return true; } - return(false); + return false; } /** - * \brief Replace in the Header a DocEntry by the new DocEntry. The last - * DocEntry is kept in archieve - * @param newEntry New entry to substitute to an other entry of the Header - * @return FALSE when an other DocEntry is already archieved with the same - * generalized key, TRUE otherwise + * \brief Removes out of the Header a DocEntry. + * (it's kept in archive). + * @param group Group number of the Entry to remove + * @param elem Element number of the Entry to remove + * @return FALSE when an other DocEntry is already archived with the same key + * TRUE otherwise */ -bool DocEntryArchive::Push(uint16_t group,uint16_t element) +bool DocEntryArchive::Push(uint16_t group, uint16_t elem) { - std::string key = DictEntry::TranslateToKey(group,element); - - if( Archive.find(key)==Archive.end() ) + //TagKey key = DictEntry::TranslateToKey(group, elem); + TagKey key(group, elem); + if ( Archive.find(key)==Archive.end() ) { // Save the old DocEntry if any - TagDocEntryHT::iterator it = HeaderHT.find(key); - if( it!=HeaderHT.end() ) + DocEntry *old = ArchFile->GetDocEntry(group, elem); + Archive[key] = old; + if ( old ) { - Archive[key] = it->second; - HeaderHT.erase(it); + old->Register(); + ArchFile->RemoveEntry(old); } - return(true); + return true; } - return(false); + return false; } /** - * \brief Restore in the Header the DocEntry that have the generalized key. - * The old entry is destroyed. - * @param key Key of the DocEntry to restore - * @return FALSE when the generalized key isn't in the archieve, + * \brief Restore in the Header the DocEntry specified by (group,element). + * The archive entry is destroyed. + * @param group Group number of the Entry to restore + * @param elem Element number of the Entry to restore + * @return FALSE when the key isn't in the archive, * TRUE otherwise */ -bool DocEntryArchive::Restore(uint16_t group,uint16_t element) +bool DocEntryArchive::Restore(uint16_t group, uint16_t elem) { - std::string key=DictEntry::TranslateToKey(group,element); - + //TagKey key=DictEntry::TranslateToKey(group, elem); + TagKey key(group, elem); TagDocEntryHT::iterator restoreIt=Archive.find(key); - if( restoreIt!=Archive.end() ) + if ( restoreIt!=Archive.end() ) { - TagDocEntryHT::iterator restorePos = HeaderHT.find(key); - if( restorePos!=HeaderHT.end() ) + // Delete the new value + DocEntry *rem = ArchFile->GetDocEntry(group, elem); + if ( rem ) { - delete restorePos->second; + ArchFile->RemoveEntry(rem); } - if( Archive[key] ) + // Restore the old value + if ( restoreIt->second ) { - HeaderHT[key] = Archive[key]; - } - else - { - HeaderHT.erase(restorePos); + ArchFile->AddEntry(restoreIt->second); + restoreIt->second->Unregister(); } Archive.erase(restoreIt); - return(true); + return true; } - return(false); + return false; } /** - * \brief Remove all DocEntry that are in the archive. The entries aren't - * restored but only destroyed. + * \brief Removes all DocEntry from the archive, and destroy them. + * The archives entries aren't restored. */ -void DocEntryArchive::ClearArchive(void) +void DocEntryArchive::ClearArchive( ) { for(TagDocEntryHT::iterator it = Archive.begin(); it!=Archive.end(); ++it) { - delete it->second; + if(it->second) + it->second->Unregister(); } Archive.clear(); } @@ -182,5 +171,22 @@ void DocEntryArchive::ClearArchive(void) // Private //----------------------------------------------------------------------------- +// Print +/** + * \brief Print all + * @param os The output stream to be written to. + */ +void DocEntryArchive::Print(std::ostream &os) +{ + os << "Elements in archives :" << std::endl; + for(TagDocEntryHT::iterator it = Archive.begin(); + it!=Archive.end(); + ++it) + { + if ( it->second ) + it->second->Print(os); + } +} +//----------------------------------------------------------------------------- } // end namespace gdcm