]> Creatis software - clitk.git/commitdiff
add cache for read image
authordsarrut <dsarrut>
Tue, 15 Feb 2011 11:30:53 +0000 (11:30 +0000)
committerdsarrut <dsarrut>
Tue, 15 Feb 2011 11:30:53 +0000 (11:30 +0000)
segmentation/clitkAnatomicalFeatureDatabase.cxx
segmentation/clitkAnatomicalFeatureDatabase.h
segmentation/clitkAnatomicalFeatureDatabase.txx

index 539e17012806a970984f667cd0df786acacf56b0..8bf17fbb57873f6f37150363512a7675ad9b7455 100644 (file)
@@ -28,7 +28,7 @@
 //--------------------------------------------------------------------
 clitk::AnatomicalFeatureDatabase::AnatomicalFeatureDatabase() 
 { 
-  SetFilename("noname.afdb"); 
+  SetFilename("default.afdb"); 
 }
 //--------------------------------------------------------------------
 
@@ -71,6 +71,7 @@ static inline std::string &trim(std::string &s) {
 //--------------------------------------------------------------------
 void clitk::AnatomicalFeatureDatabase::Load() 
 {
+  m_MapOfTag.clear();
   // open file
   std::ifstream is;
   openFileForReading(is, GetFilename());
@@ -78,11 +79,14 @@ void clitk::AnatomicalFeatureDatabase::Load()
   while (!is.fail()) {
     std::string tag;
     is >> tag; 
-    std::string value;
-    std::getline(is,value,'\n');
-    ltrim(value); // remove leading space
-    m_MapOfTag[tag] = value;
+    if (tag != "") {
+      std::string value;
+      std::getline(is,value,'\n');
+      ltrim(value); // remove leading space
+      m_MapOfTag[tag] = value;
+    }
   }
+  is.close();
 }
 //--------------------------------------------------------------------
 
@@ -106,6 +110,7 @@ double clitk::AnatomicalFeatureDatabase::GetPoint3D(std::string tag, int dim)
 }
 //--------------------------------------------------------------------
 
+
 //--------------------------------------------------------------------
 void clitk::AnatomicalFeatureDatabase::GetPoint3D(std::string tag, PointType3D & p)
 {
@@ -126,7 +131,13 @@ void clitk::AnatomicalFeatureDatabase::GetPoint3D(std::string tag, PointType3D &
 
     // parse the string into 3 doubles
     for(int i=0; i<3; i++) {
-      p[i] = atof(results[i].c_str());
+
+      if (!clitk::fromString<double>(p[i], results[i].c_str())) {
+        clitkExceptionMacro("Error while reading Point3D, could not convert '" 
+                            << results[i].c_str() << "' into double.");
+      }
+
+        //      p[i] = atof(results[i].c_str());
     }
 
     /*
@@ -155,3 +166,5 @@ void clitk::AnatomicalFeatureDatabase::SetImageFilename(std::string tag, std::st
 }
 //--------------------------------------------------------------------
 
+
+
index f1324cb687a86058cf61c6118e77e5f7800bec92..e2850e12259314053b1f49ac934df16dfd3cf80f 100644 (file)
@@ -56,6 +56,13 @@ namespace clitk {
     void SetImageFilename(TagType tag, std::string f);
     template<class ImageType>
     typename ImageType::Pointer GetImage(TagType tag);
+    template<class ImageType>
+    void  SetImage(TagType tag, 
+                   std::string f, 
+                   typename ImageType::Pointer image, 
+                   bool write=false);
+    template<class ImageType>
+    void ReleaseImage(TagType tag);
     
     // Set Get Double
     void SetDouble(TagType tag, double d);
@@ -63,8 +70,11 @@ namespace clitk {
 
   protected:
     std::string m_Filename;
+    typedef itk::ImageBase<3> ImageBaseType;
     typedef std::map<TagType, std::string> MapTagType;
+    typedef std::map<TagType, ImageBaseType*> MapTagImageType;
     MapTagType m_MapOfTag;
+    MapTagImageType m_MapOfImage;
 
   }; // end class
   //--------------------------------------------------------------------
index ae4567bab60b1c9a1dbc701ea59fce1e131fdc4e..f1ee25ebc8b863d855e4ecb052aaa77e02a1ef27 100644 (file)
@@ -23,13 +23,68 @@ typename ImageType::Pointer AnatomicalFeatureDatabase::
 GetImage(std::string tag)
 {
   if (m_MapOfTag.find(tag) == m_MapOfTag.end()) {
-    clitkExceptionMacro("Could not find the tag <" << tag << "> of type Image Filename in the DB");
+    clitkExceptionMacro("Could not find the tag <" << tag << "> of type 'Image' in the DB ('"
+                        << GetFilename() << "')");
   }
   else {
-    std::string s = m_MapOfTag[tag];
-    // Read the file
-    typename ImageType::Pointer image = readImage<ImageType>(s);
+    typename ImageType::Pointer image;
+    if (m_MapOfImage[tag]) {
+      image = static_cast<ImageType *>(m_MapOfImage[tag]);
+    }
+    else {
+      std::string s = m_MapOfTag[tag];
+      // Read the file
+      image = readImage<ImageType>(s);
+      // I add a reference count because the cache is not a smartpointer
+      image->SetReferenceCount(image->GetReferenceCount()+1);
+      // Insert into the cache 
+      m_MapOfImage[tag] = &(*image); // pointer
+    }
     return image;
   }
 }
 //--------------------------------------------------------------------
+
+
+//--------------------------------------------------------------------
+template<class ImageType>
+void AnatomicalFeatureDatabase::
+SetImage(TagType tag, std::string f, typename ImageType::Pointer image, bool write)
+{
+  SetImageFilename(tag, f);
+  m_MapOfImage[tag] = &(*image);
+  if (write) {
+    writeImage<ImageType>(image, f);
+  }
+}
+//--------------------------------------------------------------------
+
+
+//--------------------------------------------------------------------
+template<class ImageType>
+void AnatomicalFeatureDatabase::
+ReleaseImage(std::string tag)
+{
+  if (m_MapOfTag.find(tag) == m_MapOfTag.end()) {
+    clitkExceptionMacro("Could not find the tag <" << tag << "> of type Image Filename in the DB");
+  }
+  else {
+    DD("TODO");
+    exit(0);
+     if (m_MapOfImage[tag]) {
+      DD(m_MapOfImage[tag]->GetReferenceCount());
+      ImageType * image = static_cast<ImageType*>(m_MapOfImage[tag]);
+      image->SetReferenceCount(image->GetReferenceCount()-1);
+      m_MapOfImage.erase(tag);
+      /*
+      DD(image->GetReferenceCount());
+      image->Delete();
+      */
+      //      DD(image->GetReferenceCount());
+    }
+    else {
+      // Do nothing in this case (image not loaded)
+    }
+  }
+}
+//--------------------------------------------------------------------