1616// along with this program. If not, see <http://www.gnu.org/licenses/>.
1717
1818
19- %include " shared/keep_reference.i"
2019%include " shared/private_data.i"
2120
2221
23- // Macro to wrap data iterators
24- %define DATA_ITERATOR (container_type, datum_type)
22+ // Macro to store weak references to pointers and invalidate the
23+ // pointers when data is deleted
24+ %define POINTER_STORE (container_type, datum_type)
2525
2626#if SWIG_VERSION >= 0x040400
27- // Functions to store weak references to iterators (swig >= v4.4)
28- %fragment(" iterator_store " , " header" , fragment=" private_data" ) {
27+ // Functions to store weak references to pointers (swig >= v4.4)
28+ %fragment(" pointer_store " , " header" , fragment=" private_data" ) {
2929static void _process_list (PyObject* list, bool invalidate_all,
3030 Exiv2::container_type::iterator* beg,
3131 Exiv2::container_type::iterator* end) {
32- PyObject* py_it = NULL ;
33- container_type##_iterator* cpp_it = NULL ;
32+ PyObject* py_ptr = NULL ;
33+ datum_type##_pointer* cpp_ptr = NULL ;
3434 for (Py_ssize_t idx = PyList_Size (list); idx > 0 ; idx--) {
35- py_it = PyWeakref_GetObject (PyList_GetItem (list, idx-1 ));
36- if (py_it == Py_None)
35+ py_ptr = PyWeakref_GetObject (PyList_GetItem (list, idx-1 ));
36+ if (py_ptr == Py_None)
3737 goto forget;
3838 if (!(invalidate_all || beg))
3939 continue ;
40- if (SWIG_IsOK (SWIG_ConvertPtr (
41- py_it, (void **)&cpp_it,
42- $descriptor (container_type##_iterator*), 0 ))) {
40+ if (SWIG_IsOK (SWIG_ConvertPtr (py_ptr, (void **)&cpp_ptr,
41+ $descriptor (datum_type##_pointer*), 0 ))) {
4342 if (invalidate_all) {
44- cpp_it ->_invalidate ();
43+ cpp_ptr ->_invalidate ();
4544 goto forget;
4645 }
4746 for (Exiv2::container_type::iterator it=*beg; it!=*end; it++)
48- if (cpp_it ->_invalidate (it))
47+ if (cpp_ptr ->_invalidate (* it))
4948 goto forget;
5049 }
5150 continue ;
@@ -54,44 +53,44 @@ forget:
5453 continue ;
5554 }
5655};
57- static void purge_iterators (PyObject* list) {
56+ static void purge_pointers (PyObject* list) {
5857 _process_list (list, false , NULL , NULL );
5958};
60- static void invalidate_iterators (PyObject* py_self) {
61- PyObject* list = private_store_get (py_self, " iterators " );
59+ static void invalidate_pointers (PyObject* py_self) {
60+ PyObject* list = private_store_get (py_self, " pointers " );
6261 if (list)
6362 _process_list (list, true , NULL , NULL );
6463};
65- static void invalidate_iterators (PyObject* py_self,
66- Exiv2::container_type::iterator pos) {
67- PyObject* list = private_store_get (py_self, " iterators " );
64+ static void invalidate_pointers (PyObject* py_self,
65+ Exiv2::container_type::iterator pos) {
66+ PyObject* list = private_store_get (py_self, " pointers " );
6867 if (list) {
6968 Exiv2::container_type::iterator end = pos;
7069 end++;
7170 _process_list (list, false , &pos, &end);
7271 }
7372};
74- static void invalidate_iterators (PyObject* py_self,
75- Exiv2::container_type::iterator beg,
76- Exiv2::container_type::iterator end) {
77- PyObject* list = private_store_get (py_self, " iterators " );
73+ static void invalidate_pointers (PyObject* py_self,
74+ Exiv2::container_type::iterator beg,
75+ Exiv2::container_type::iterator end) {
76+ PyObject* list = private_store_get (py_self, " pointers " );
7877 if (list)
7978 _process_list (list, false , &beg, &end);
8079};
81- static int store_iterator (PyObject* py_self, PyObject* iterator ) {
82- PyObject* list = private_store_get (py_self, " iterators " );
80+ static int store_pointer (PyObject* py_self, PyObject* py_ptr ) {
81+ PyObject* list = private_store_get (py_self, " pointers " );
8382 if (list)
84- purge_iterators (list);
83+ purge_pointers (list);
8584 else {
8685 list = PyList_New (0 );
8786 if (!list)
8887 return -1 ;
89- int error = private_store_set (py_self, " iterators " , list);
88+ int error = private_store_set (py_self, " pointers " , list);
9089 Py_DECREF (list);
9190 if (error)
9291 return -1 ;
9392 }
94- PyObject* ref = PyWeakref_NewRef (iterator , NULL );
93+ PyObject* ref = PyWeakref_NewRef (py_ptr , NULL );
9594 if (!ref)
9695 return -1 ;
9796 int result = PyList_Append (list, ref);
@@ -113,24 +112,24 @@ static int store_iterator(PyObject* py_self, PyObject* iterator) {
113112#endif
114113
115114#if SWIG_VERSION >= 0x040400
116- // clear() invalidates all iterators
117- %typemap(ret, fragment=" iterator_store " ) void clear {
118- invalidate_iterators (self);
115+ // clear() invalidates all pointers
116+ %typemap(ret, fragment=" pointer_store " ) void clear {
117+ invalidate_pointers (self);
119118}
120- // erase() and eraseFamily() invalidate some iterators
121- %typemap(check, fragment=" iterator_store " )
119+ // erase() and eraseFamily() invalidate some pointers
120+ %typemap(check, fragment=" pointer_store " )
122121 Exiv2::container_type::iterator pos {
123- invalidate_iterators (self, $1 );
122+ invalidate_pointers (self, $1 );
124123}
125- %typemap(check, fragment=" iterator_store " )
124+ %typemap(check, fragment=" pointer_store " )
126125 (Exiv2::container_type::iterator beg,
127126 Exiv2::container_type::iterator end) {
128- invalidate_iterators (self, $1 , $2 );
127+ invalidate_pointers (self, $1 , $2 );
129128}
130- %typemap(check, fragment=" iterator_store " )
129+ %typemap(check, fragment=" pointer_store " )
131130 Exiv2::container_type::iterator& pos {
132- invalidate_iterators (self, *$1 , arg1->end ());
131+ invalidate_pointers (self, *$1 , arg1->end ());
133132}
134133#endif // SWIG_VERSION
135134
136- %enddef // DATA_ITERATOR
135+ %enddef // POINTER_STORE
0 commit comments