]> Creatis software - clitk.git/blob - segmentation/clitkAnatomicalFeatureDatabase.txx
add cache for read image
[clitk.git] / segmentation / clitkAnatomicalFeatureDatabase.txx
1 /*=========================================================================
2   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
3
4   Authors belong to: 
5   - University of LYON              http://www.universite-lyon.fr/
6   - Léon Bérard cancer center       http://oncora1.lyon.fnclcc.fr
7   - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
8
9   This software is distributed WITHOUT ANY WARRANTY; without even
10   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11   PURPOSE.  See the copyright notices for more information.
12
13   It is distributed under dual licence
14
15   - BSD        See included LICENSE.txt file
16   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17   ======================================================================-====*/
18
19
20 //--------------------------------------------------------------------
21 template<class ImageType>
22 typename ImageType::Pointer AnatomicalFeatureDatabase::
23 GetImage(std::string tag)
24 {
25   if (m_MapOfTag.find(tag) == m_MapOfTag.end()) {
26     clitkExceptionMacro("Could not find the tag <" << tag << "> of type 'Image' in the DB ('"
27                         << GetFilename() << "')");
28   }
29   else {
30     typename ImageType::Pointer image;
31     if (m_MapOfImage[tag]) {
32       image = static_cast<ImageType *>(m_MapOfImage[tag]);
33     }
34     else {
35       std::string s = m_MapOfTag[tag];
36       // Read the file
37       image = readImage<ImageType>(s);
38       // I add a reference count because the cache is not a smartpointer
39       image->SetReferenceCount(image->GetReferenceCount()+1);
40       // Insert into the cache 
41       m_MapOfImage[tag] = &(*image); // pointer
42     }
43     return image;
44   }
45 }
46 //--------------------------------------------------------------------
47
48
49 //--------------------------------------------------------------------
50 template<class ImageType>
51 void AnatomicalFeatureDatabase::
52 SetImage(TagType tag, std::string f, typename ImageType::Pointer image, bool write)
53 {
54   SetImageFilename(tag, f);
55   m_MapOfImage[tag] = &(*image);
56   if (write) {
57     writeImage<ImageType>(image, f);
58   }
59 }
60 //--------------------------------------------------------------------
61
62
63 //--------------------------------------------------------------------
64 template<class ImageType>
65 void AnatomicalFeatureDatabase::
66 ReleaseImage(std::string tag)
67 {
68   if (m_MapOfTag.find(tag) == m_MapOfTag.end()) {
69     clitkExceptionMacro("Could not find the tag <" << tag << "> of type Image Filename in the DB");
70   }
71   else {
72     DD("TODO");
73     exit(0);
74      if (m_MapOfImage[tag]) {
75       DD(m_MapOfImage[tag]->GetReferenceCount());
76       ImageType * image = static_cast<ImageType*>(m_MapOfImage[tag]);
77       image->SetReferenceCount(image->GetReferenceCount()-1);
78       m_MapOfImage.erase(tag);
79       /*
80       DD(image->GetReferenceCount());
81       image->Delete();
82       */
83       //      DD(image->GetReferenceCount());
84     }
85     else {
86       // Do nothing in this case (image not loaded)
87     }
88   }
89 }
90 //--------------------------------------------------------------------