@@ -114,12 +114,12 @@ static void readLUTfiles(LUT_TYPE LUT, NUMSOLN_TYPE numsoln)
114114 fscanf (fpwv, " %d" , &kk);
115115 fgetc (fpwv); // '/n'
116116 numsoln[d][k] = numsoln[d][kk];
117- LUT [d][k] = LUT [d][kk];
117+ (* LUT ) [d][k] = (* LUT ) [d][kk];
118118 } else {
119119 fgetc (fpwv); // '\n'
120120 numsoln[d][k] = ns;
121- p = ( struct csoln *) malloc (ns * sizeof ( struct csoln )) ;
122- LUT [d][k] = p ;
121+ p = new struct csoln [ns] ;
122+ (* LUT ) [d][k] = std::shared_ptr< struct csoln []>(p) ;
123123 for (i = 1 ; i <= ns; i++) {
124124 linep = (unsigned char *) fgets ((char *) line, 32 , fpwv);
125125 p->parent = charnum[*(linep++)];
@@ -189,15 +189,16 @@ void Flute::readLUT()
189189 makeLUT (LUT_ , numsoln_);
190190 initLUT (FLUTE_D , LUT_ , numsoln_);
191191 checkLUT (LUT , numsoln, LUT_ , numsoln_);
192+ deleteLUT (LUT_ , numsoln_);
192193#endif
193194}
194195
195196void Flute::makeLUT (LUT_TYPE & LUT , NUMSOLN_TYPE & numsoln)
196197{
197- LUT = new struct csoln **[FLUTE_D + 1 ];
198+ LUT = new boost::multi_array<std::shared_ptr<struct csoln []>, 2 >(
199+ boost::extents[FLUTE_D + 1 ][MGROUP ]);
198200 numsoln = new int *[FLUTE_D + 1 ];
199201 for (int d = 4 ; d <= FLUTE_D ; d++) {
200- LUT [d] = new struct csoln *[MGROUP ];
201202 numsoln[d] = new int [MGROUP ];
202203 }
203204}
@@ -210,13 +211,11 @@ void Flute::deleteLUT()
210211void Flute::deleteLUT (LUT_TYPE & LUT , NUMSOLN_TYPE & numsoln)
211212{
212213 if (LUT ) {
214+ delete LUT ;
213215 for (int d = 4 ; d <= FLUTE_D ; d++) {
214- delete[] LUT [d];
215216 delete[] numsoln[d];
216217 }
217218 delete[] numsoln;
218- delete[] LUT ;
219- LUT = nullptr ;
220219 }
221220}
222221
@@ -277,12 +276,12 @@ void Flute::initLUT(int to_d, LUT_TYPE LUT, NUMSOLN_TYPE numsoln)
277276 int kk;
278277 pwv = readDecimalInt (pwv, kk) + 1 ;
279278 numsoln[d][k] = numsoln[d][kk];
280- LUT [d][k] = LUT [d][kk];
279+ (* LUT ) [d][k] = (* LUT ) [d][kk];
281280 } else {
282281 pwv++; // '\n'
283282 numsoln[d][k] = ns;
284283 struct csoln * p = new struct csoln [ns];
285- LUT [d][k] = p ;
284+ (* LUT ) [d][k] = std::shared_ptr< struct csoln []>(p) ;
286285 for (int i = 1 ; i <= ns; i++) {
287286 p->parent = charNum (*pwv++);
288287
@@ -348,8 +347,8 @@ static void checkLUT(LUT_TYPE LUT1,
348347 int ns2 = numsoln2[d][k];
349348 if (ns1 != ns2)
350349 printf (" numsoln[%d][%d] mismatch\n " , d, k);
351- struct csoln * soln1 = LUT1 [d][k];
352- struct csoln * soln2 = LUT2 [d][k];
350+ struct csoln * soln1 = LUT1 [d][k]. get () ;
351+ struct csoln * soln2 = LUT2 [d][k]. get () ;
353352 if (soln1->parent != soln2->parent )
354353 printf (" LUT[%d][%d]->parent mismatch\n " , d, k);
355354 for (int j = 0 ; soln1->seg [j] != 0 ; j++) {
@@ -573,7 +572,7 @@ int Flute::flutes_wl_LD(int d,
573572 }
574573
575574 minl = l[0 ] = xs[d - 1 ] - xs[0 ] + ys[d - 1 ] - ys[0 ];
576- rlist = LUT [d][k];
575+ rlist = (* LUT ) [d][k]. get () ;
577576 for (i = 0 ; rlist->seg [i] > 0 ; i++) {
578577 minl += dd[rlist->seg [i]];
579578 }
@@ -1135,7 +1134,7 @@ Tree Flute::flutes_LD(int d,
11351134 }
11361135
11371136 minl = l[0 ] = xs[d - 1 ] - xs[0 ] + ys[d - 1 ] - ys[0 ];
1138- rlist = LUT [d][k];
1137+ rlist = (* LUT ) [d][k]. get () ;
11391138 for (i = 0 ; rlist->seg [i] > 0 ; i++) {
11401139 minl += dd[rlist->seg [i]];
11411140 }
0 commit comments