99
1010#pragma once
1111#include < Array.hpp>
12+ #include < memory.hpp>
1213
1314namespace cpu
1415{
@@ -103,7 +104,8 @@ void regions(Array<T> out, const Array<char> in, af_connectivity connectivity)
103104 T *out_ptr = out.get ();
104105
105106 // Map labels
106- typedef typename std::map<T, LabelNode<T>* > label_map_t ;
107+ typedef typename std::unique_ptr< LabelNode<T> > UnqLabelPtr;
108+ typedef typename std::map<T, UnqLabelPtr > label_map_t ;
107109 typedef typename label_map_t ::iterator label_map_iterator_t ;
108110
109111 label_map_t lmap;
@@ -134,18 +136,16 @@ void regions(Array<T> out, const Array<char> in, af_connectivity connectivity)
134136 for (size_t k = 0 ; k < l.size (); k++) {
135137 minl = min (l[k], minl);
136138 label_map_iterator_t cur_map = lmap.find (l[k]);
137- LabelNode<T> *node = cur_map->second ;
139+ LabelNode<T> *node = cur_map->second . get () ;
138140 // Group labels of the same region under a disjoint set
139141 for (size_t m = k+1 ; m < l.size (); m++)
140- setUnion (node, lmap.find (l[m])->second );
142+ setUnion (node, lmap.find (l[m])->second . get () );
141143 }
142144 // Set label to smallest neighbor label
143145 out_ptr[idx] = minl;
144- }
145- else {
146+ } else {
146147 // Insert new label in map
147- LabelNode<T> *node = new LabelNode<T>(label);
148- lmap.insert (std::pair<T, LabelNode<T>* >(label, node));
148+ lmap.insert (std::pair<T, UnqLabelPtr>(label, UnqLabelPtr (new LabelNode<T>(label))));
149149 out_ptr[idx] = label++;
150150 }
151151 }
@@ -162,7 +162,7 @@ void regions(Array<T> out, const Array<char> in, af_connectivity connectivity)
162162 label_map_iterator_t cur_map = lmap.find (l);
163163
164164 if (cur_map != lmap.end ()) {
165- LabelNode<T>* node = cur_map->second ;
165+ LabelNode<T>* node = cur_map->second . get () ;
166166
167167 LabelNode<T>* node_root = find (node);
168168 out_ptr[idx] = node_root->getMinLabel ();
0 commit comments