Made Filestorage able to not own its CvFileStorage instance.
authorRoman Donchenko <roman.donchenko@itseez.com>
Wed, 14 Aug 2013 08:44:58 +0000 (12:44 +0400)
committerRoman Donchenko <roman.donchenko@itseez.com>
Thu, 5 Sep 2013 15:03:00 +0000 (19:03 +0400)
This allows to get rid of the last remaining Ptr<T>::addref calls.

modules/core/include/opencv2/core/persistence.hpp
modules/core/src/persistence.cpp
modules/legacy/src/em.cpp
modules/objdetect/src/hog.cpp

index 73ba2fc..f568761 100644 (file)
@@ -186,7 +186,7 @@ public:
     //! the full constructor that opens file storage for reading or writing
     CV_WRAP FileStorage(const String& source, int flags, const String& encoding=String());
     //! the constructor that takes pointer to the C FileStorage structure
-    FileStorage(CvFileStorage* fs);
+    FileStorage(CvFileStorage* fs, bool owning=true);
     //! the destructor. calls release()
     virtual ~FileStorage();
 
index a21ee5a..39ce633 100644 (file)
@@ -5129,9 +5129,11 @@ FileStorage::FileStorage(const String& filename, int flags, const String& encodi
     open( filename, flags, encoding );
 }
 
-FileStorage::FileStorage(CvFileStorage* _fs)
+FileStorage::FileStorage(CvFileStorage* _fs, bool owning)
 {
-    fs = Ptr<CvFileStorage>(_fs);
+    if (owning) fs.reset(_fs);
+    else fs = Ptr<CvFileStorage>(Ptr<CvFileStorage>(), _fs);
+
     state = _fs ? NAME_EXPECTED + INSIDE_MAP : UNDEFINED;
 }
 
index c11c235..b49eb91 100644 (file)
@@ -85,13 +85,12 @@ void CvEM::read( CvFileStorage* fs, CvFileNode* node )
 
 void CvEM::write( CvFileStorage* _fs, const char* name ) const
 {
-    FileStorage fs = _fs;
+    FileStorage fs(_fs, false);
     if(name)
         fs << name << "{";
     emObj.write(fs);
     if(name)
         fs << "}";
-    fs.fs.obj = 0;
 }
 
 double CvEM::calcLikelihood( const Mat &input_sample ) const
index 80b5972..5cc7f6a 100644 (file)
@@ -1353,8 +1353,7 @@ public:
     {
         if(ptr && _fs)
         {
-            FileStorage fs(_fs);
-            fs.fs.addref();
+            FileStorage fs(_fs, false);
             ((const _ClsName*)ptr)->write(fs, String(name));
         }
     }