]> Creatis software - gdcm.git/blobdiff - src/gdcmSQItem.cxx
* Add GetFirstValEntry + GetNexxtValEntry, for Python users
[gdcm.git] / src / gdcmSQItem.cxx
index 0431202ca3bbf3c16c1f69236af1d0baa5c45fb6..1b46a482946cdb1a6ae49a1c2f78d21b90d7270c 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmSQItem.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/01/25 15:44:24 $
-  Version:   $Revision: 1.60 $
+  Date:      $Date: 2005/02/04 14:49:01 $
+  Version:   $Revision: 1.67 $
   
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -50,45 +50,7 @@ SQItem::~SQItem()
 }
 
 //-----------------------------------------------------------------------------
-// Print
-/*
- * \brief   canonical Printer
- * @param os     Stream to print to. 
- * @param indent Indentation string to be prepended during printing.
- */
-void SQItem::Print(std::ostream &os, std::string const &)
-{
-   std::ostringstream s;
-
-   if (SQDepthLevel > 0)
-   {
-      for (int i = 0; i < SQDepthLevel; ++i)
-      {
-         s << "   | " ;
-      }
-   }
-   os << s.str() << " --- SQItem number " << SQItemNumber  << std::endl;
-   for (ListDocEntry::iterator i  = DocEntries.begin();
-                               i != DocEntries.end();
-                             ++i)
-   {
-      DocEntry *Entry = *i;
-      bool PrintEndLine = true;
-
-      os << s.str();
-      Entry->SetPrintLevel(PrintLevel);
-      Entry->Print(os); 
-      if ( dynamic_cast<SeqEntry*>(Entry) )
-      {
-         PrintEndLine = false;
-      }
-      if (PrintEndLine)
-      {
-         os << std::endl;
-      }
-   } 
-}
-
+// Public
 /*
  * \brief   canonical Writer
  * @param fp     file pointer to an already open file. 
@@ -108,7 +70,7 @@ void SQItem::WriteContent(std::ofstream *fp, FileType filetype)
    }
      
    for (ListDocEntry::iterator it = DocEntries.begin();  
-                              it != DocEntries.end();
+                               it != DocEntries.end();
                              ++it)
    {   
       // we skip delimitors (start and end one) because 
@@ -134,34 +96,43 @@ void SQItem::WriteContent(std::ofstream *fp, FileType filetype)
    for(j=0;j<4;++j)
    {
       binary_write( *fp, itemt[j]);  // fffe e000 ffff ffff 
-   }
+   } 
 }
 
-//-----------------------------------------------------------------------------
-// Public
 /**
- * \brief  Remove all entry in the Sequence Item 
+ * \brief   Inserts *in the right place* any Entry (Dicom Element)
+ *          into the Sequence Item
+ * @param entry Entry to add
  */
-void SQItem::ClearEntry()
-{
-   for(ListDocEntry::iterator cc = DocEntries.begin();
-                             cc != DocEntries.end();
-                             ++cc)
+bool SQItem::AddEntry(DocEntry *entry)
+{   
+   if (DocEntries.empty() )
    {
-      delete *cc;
+      DocEntries.push_back(entry);
+      return true;
    }
-   DocEntries.clear();
-}
+   ListDocEntry::iterator insertSpot;
+   ListDocEntry::iterator it = DocEntries.end();
+   do
+   {
+      it--;
 
-/**
- * \brief   adds any Entry (Dicom Element) to the Sequence Item
- * @param entry Entry to add
- */
-bool SQItem::AddEntry(DocEntry *entry)
-{
-   DocEntries.push_back(entry);
-   //TODO : check if it worked
+      if ( (*it)->IsItemDelimitor() )
+      {
+         continue;
+      }
+      if ( (*it)->GetGroup() < entry->GetGroup() )
+         break;
+      else
+         if ( (*it)->GetGroup() == entry->GetGroup() &&
+              (*it)->GetElement() < entry->GetElement() )
+            break;
+   } while (it != DocEntries.begin() );
+  
+   insertSpot = it++;
+   insertSpot++; // ?!?
+   DocEntries.insert(insertSpot, entry); 
    return true;
 }   
 
@@ -170,13 +141,13 @@ bool SQItem::AddEntry(DocEntry *entry)
  * @param   entryToRemove Entry to remove AND delete.
  * @return true if the entry was found and removed; false otherwise
  */
-bool SQItem::RemoveEntry( DocEntry* entryToRemove)
+bool SQItem::RemoveEntry( DocEntry *entryToRemove )
 {
    for(ListDocEntry::iterator it = DocEntries.begin();
-       it != DocEntries.end();
-       ++it)
+                              it != DocEntries.end();
+                            ++it)
    {
-      if( *it == entryToRemove)
+      if( *it == entryToRemove )
       {
          DocEntries.erase(it);
          gdcmVerboseMacro( "One element erased: " << entryToRemove->GetKey() );
@@ -193,13 +164,13 @@ bool SQItem::RemoveEntry( DocEntry* entryToRemove)
  * @param   entryToRemove Entry to remove.
  * @return true if the entry was found and removed; false otherwise
  */
-bool SQItem::RemoveEntryNoDestroy(DocEntryentryToRemove)
+bool SQItem::RemoveEntryNoDestroy(DocEntry *entryToRemove)
 {
-   for(ListDocEntry::iterator it = DocEntries.begin();
-       it != DocEntries.end();
-       ++it)
+   for(ListDocEntry::iterator it =  DocEntries.begin();
+                              it != DocEntries.end();
+                            ++it)
    {
-      if( *it == entryToRemove)
+      if( *it == entryToRemove )
       {
          DocEntries.erase(it);
          gdcmVerboseMacro( "One element erased, no destroyed: "
@@ -212,45 +183,93 @@ bool SQItem::RemoveEntryNoDestroy(DocEntry* entryToRemove)
    return false ;
 }
                                                                                 
+/**
+ * \brief  Remove all entry in the Sequence Item 
+ */
+void SQItem::ClearEntry()
+{
+   for(ListDocEntry::iterator cc = DocEntries.begin();
+                              cc != DocEntries.end();
+                            ++cc)
+   {
+      delete *cc;
+   }
+   DocEntries.clear();
+}
+
 /**
  * \brief   Get the first Dicom entry while visiting the SQItem
  * \return  The first DocEntry if found, otherwhise 0
  */
-DocEntry * SQItem::GetFirstEntry()
+DocEntry *SQItem::GetFirstEntry()
 {
    ItDocEntries = DocEntries.begin();
-   if (ItDocEntries != DocEntries.end())
+   if( ItDocEntries != DocEntries.end() )
       return *ItDocEntries;
    return 0;   
 }
                                                                                 
 /**
- * \brief   Get the next Dicom entry while visiting the chained list
+ * \brief   Get the next Dicom entry while visiting the SQItem
  * \return  The next DocEntry if found, otherwhise NULL
  */
 DocEntry *SQItem::GetNextEntry()
 {
-  // gdcmAssertMacro (ItDocEntries != DocEntries.end());
+   ++ItDocEntries;
+   if( ItDocEntries != DocEntries.end() )
+      return  *ItDocEntries;
+   return NULL;
+}
+
+/**
+ * \brief   Get the first ValEntry while visiting theSQItem
+ *              This method is designed for Python users
+ * \return  The first ValEntry if found, otherwhise NULL
+ */
+ValEntry *SQItem::GetFirstValEntry()
+{
+   gdcm::ValEntry *valEntry;
+   gdcm::DocEntry *d = GetFirstEntry();
+   // an other iterator is needed to allow user iterate 
+   // at the same time both on DocEntries and ValEntries 
+   ItValEntries = ItDocEntries;
+   if ( valEntry = dynamic_cast<gdcm::ValEntry*>(d))
+      return valEntry;
+   return  GetNextValEntry();
+}
+                                                                                
+/**
+ * \brief   Get the next ValEntry while visiting the SQItem
+ * \return  The next ValEntry if found, otherwhise NULL
+ */
+ValEntry *SQItem::GetNextValEntry()
+{
+   gdcm::ValEntry *valEntry;
+   gdcm::DocEntry *d = *ItValEntries;
+   ++ItValEntries; 
+   while( d )
    {
-      ++ItDocEntries;
-      if (ItDocEntries != DocEntries.end())
-         return  *ItDocEntries;
-      return NULL;
+      if ( valEntry = dynamic_cast<gdcm::ValEntry*>(d))
+         return valEntry;
+      else
+     return GetNextValEntry(); 
    }
+   return 0;
 }
 
 /**
  * \brief   Gets a Dicom Element inside a SQ Item Entry
- * @param   group Group number of the Entry
+ * @param   group   Group number of the Entry
  * @param   elem  Element number of the Entry
  * @return Entry whose (group,elem) was passed. 0 if not found
  */
 DocEntry *SQItem::GetDocEntry(uint16_t group, uint16_t elem)
 {
-   for(ListDocEntry::iterator i = DocEntries.begin();
-                              i != DocEntries.end(); ++i)
+   for(ListDocEntry::iterator i =  DocEntries.begin();
+                              i != DocEntries.end(); 
+                            ++i)
    {
-      if ( (*i)->GetGroup()==group && (*i)->GetElement()==elem )
+      if ( (*i)->GetGroup() == group && (*i)->GetElement() == elem )
          return *i;
    }
    return NULL;
@@ -262,7 +281,45 @@ DocEntry *SQItem::GetDocEntry(uint16_t group, uint16_t elem)
 //-----------------------------------------------------------------------------
 // Private
 
-
 //-----------------------------------------------------------------------------
+// Print
+/*
+ * \brief   canonical Printer
+ * @param os     Stream to print to. 
+ * @param indent Indentation string to be prepended during printing.
+ */
+void SQItem::Print(std::ostream &os, std::string const &)
+{
+   std::ostringstream s;
 
+   if (SQDepthLevel > 0)
+   {
+      for (int i = 0; i < SQDepthLevel; ++i)
+      {
+         s << "   | " ;
+      }
+   }
+   os << s.str() << " --- SQItem number " << SQItemNumber  << std::endl;
+   for (ListDocEntry::iterator i  = DocEntries.begin();
+                               i != DocEntries.end();
+                             ++i)
+   {
+      DocEntry *Entry = *i;
+      bool PrintEndLine = true;
+
+      os << s.str();
+      Entry->SetPrintLevel(PrintLevel);
+      Entry->Print(os); 
+      if ( dynamic_cast<SeqEntry*>(Entry) )
+      {
+         PrintEndLine = false;
+      }
+      if (PrintEndLine)
+      {
+         os << std::endl;
+      }
+   } 
+}
+
+//-----------------------------------------------------------------------------
 } // end namespace gdcm