X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmDocEntryArchive.cxx;h=d3213c26164a01137aa76aa2100575b19ad59f6c;hb=bd7bec4c367d671a9da358584e98a8ec29bb641e;hp=6d74f9155cec0625ac0ad526b7f58447c107001d;hpb=c094e185dd6404df031524ccae8e1b51e3b84871;p=gdcm.git diff --git a/src/gdcmDocEntryArchive.cxx b/src/gdcmDocEntryArchive.cxx index 6d74f915..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: 2005/01/21 11:40:55 $ - Version: $Revision: 1.8 $ + 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 @@ -22,18 +22,18 @@ #include -namespace gdcm +namespace GDCM_NAME_SPACE { //----------------------------------------------------------------------------- +// Constructor / Destructor /** * \brief Constructor */ -DocEntryArchive::DocEntryArchive(File *header): - HeaderHT(header->TagHT) +DocEntryArchive::DocEntryArchive(File *file) { + ArchFile = file; } -//----------------------------------------------------------------------------- /** * \brief Destructor */ @@ -42,57 +42,42 @@ 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 archive + * \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 archived 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) + 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() ) - { - Archive[key] = it->second; - } - else + DocEntry *old = ArchFile->GetDocEntry(group, elem); + Archive[key] = old; + if ( old ) { - Archive[key] = NULL; + old->Register(); + ArchFile->RemoveEntry(old); } // Set the new DocEntry - HeaderHT[key] = newEntry; + ArchFile->AddEntry(newEntry); return true; } @@ -100,25 +85,26 @@ bool DocEntryArchive::Push(DocEntry *newEntry) } /** - * \brief Replace in the Header a DocEntry by the new DocEntry. The last - * DocEntry is kept in archieve - * @param group Group number of the Entry - * @param elem Element number of the Entry - * @return FALSE when an other DocEntry is already archived 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 elem) +bool DocEntryArchive::Push(uint16_t group, uint16_t elem) { - std::string key = DictEntry::TranslateToKey(group,elem); - - 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; @@ -127,33 +113,32 @@ bool DocEntryArchive::Push(uint16_t group,uint16_t elem) } /** - * \brief Restore in the Header the DocEntry that have the generalized key. - * The old entry is destroyed. - * @param group Group number of the Entry - * @param elem Element number of the Entry - * @return FALSE when the generalized key isn't in the archive, + * \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 elem) +bool DocEntryArchive::Restore(uint16_t group, uint16_t elem) { - std::string key=DictEntry::TranslateToKey(group,elem); - + //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); @@ -164,8 +149,8 @@ bool DocEntryArchive::Restore(uint16_t group,uint16_t elem) } /** - * \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( ) { @@ -173,7 +158,8 @@ void DocEntryArchive::ClearArchive( ) it!=Archive.end(); ++it) { - delete it->second; + if(it->second) + it->second->Unregister(); } Archive.clear(); } @@ -185,5 +171,22 @@ void DocEntryArchive::ClearArchive( ) // 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