@@ -74,7 +74,6 @@ static void readLUTfiles(LUT_TYPE LUT, NUMSOLN_TYPE numsoln)
7474{
7575 unsigned char charnum[256 ], line[32 ], *linep, c;
7676 FILE *fpwv, *fprt;
77- struct csoln * p;
7877 int d, i, j, k, kk, ns, nn;
7978
8079 for (i = 0 ; i <= 255 ; i++) {
@@ -114,12 +113,11 @@ static void readLUTfiles(LUT_TYPE LUT, NUMSOLN_TYPE numsoln)
114113 fscanf (fpwv, " %d" , &kk);
115114 fgetc (fpwv); // '/n'
116115 numsoln[d][k] = numsoln[d][kk];
117- LUT [d][k] = LUT [d][kk];
116+ (* LUT ) [d][k] = (* LUT ) [d][kk];
118117 } else {
119118 fgetc (fpwv); // '\n'
120119 numsoln[d][k] = ns;
121- p = (struct csoln *) malloc (ns * sizeof (struct csoln ));
122- LUT [d][k] = p;
120+ auto p = std::make_shared<struct csoln []>(ns);
123121 for (i = 1 ; i <= ns; i++) {
124122 linep = (unsigned char *) fgets ((char *) line, 32 , fpwv);
125123 p->parent = charnum[*(linep++)];
@@ -147,6 +145,7 @@ static void readLUTfiles(LUT_TYPE LUT, NUMSOLN_TYPE numsoln)
147145#endif
148146 p++;
149147 }
148+ (*LUT )[d][k] = std::move (p);
150149 }
151150 }
152151 }
@@ -189,15 +188,16 @@ void Flute::readLUT()
189188 makeLUT (LUT_ , numsoln_);
190189 initLUT (FLUTE_D , LUT_ , numsoln_);
191190 checkLUT (LUT , numsoln, LUT_ , numsoln_);
191+ deleteLUT (LUT_ , numsoln_);
192192#endif
193193}
194194
195195void Flute::makeLUT (LUT_TYPE & LUT , NUMSOLN_TYPE & numsoln)
196196{
197- LUT = new struct csoln **[FLUTE_D + 1 ];
197+ LUT = new boost::multi_array<std::shared_ptr<struct csoln []>, 2 >(
198+ boost::extents[FLUTE_D + 1 ][MGROUP ]);
198199 numsoln = new int *[FLUTE_D + 1 ];
199200 for (int d = 4 ; d <= FLUTE_D ; d++) {
200- LUT [d] = new struct csoln *[MGROUP ];
201201 numsoln[d] = new int [MGROUP ];
202202 }
203203}
@@ -210,13 +210,11 @@ void Flute::deleteLUT()
210210void Flute::deleteLUT (LUT_TYPE & LUT , NUMSOLN_TYPE & numsoln)
211211{
212212 if (LUT ) {
213+ delete LUT ;
213214 for (int d = 4 ; d <= FLUTE_D ; d++) {
214- delete[] LUT [d];
215215 delete[] numsoln[d];
216216 }
217217 delete[] numsoln;
218- delete[] LUT ;
219- LUT = nullptr ;
220218 }
221219}
222220
@@ -277,12 +275,12 @@ void Flute::initLUT(int to_d, LUT_TYPE LUT, NUMSOLN_TYPE numsoln)
277275 int kk;
278276 pwv = readDecimalInt (pwv, kk) + 1 ;
279277 numsoln[d][k] = numsoln[d][kk];
280- LUT [d][k] = LUT [d][kk];
278+ (* LUT ) [d][k] = (* LUT ) [d][kk];
281279 } else {
282280 pwv++; // '\n'
283281 numsoln[d][k] = ns;
284282 struct csoln * p = new struct csoln [ns];
285- LUT [d][k] = p ;
283+ (* LUT ) [d][k] = std::shared_ptr< struct csoln []>(p) ;
286284 for (int i = 1 ; i <= ns; i++) {
287285 p->parent = charNum (*pwv++);
288286
@@ -348,8 +346,8 @@ static void checkLUT(LUT_TYPE LUT1,
348346 int ns2 = numsoln2[d][k];
349347 if (ns1 != ns2)
350348 printf (" numsoln[%d][%d] mismatch\n " , d, k);
351- struct csoln * soln1 = LUT1 [d][k];
352- struct csoln * soln2 = LUT2 [d][k];
349+ struct csoln * soln1 = LUT1 [d][k]. get () ;
350+ struct csoln * soln2 = LUT2 [d][k]. get () ;
353351 if (soln1->parent != soln2->parent )
354352 printf (" LUT[%d][%d]->parent mismatch\n " , d, k);
355353 for (int j = 0 ; soln1->seg [j] != 0 ; j++) {
@@ -573,7 +571,7 @@ int Flute::flutes_wl_LD(int d,
573571 }
574572
575573 minl = l[0 ] = xs[d - 1 ] - xs[0 ] + ys[d - 1 ] - ys[0 ];
576- rlist = LUT [d][k];
574+ rlist = (* LUT ) [d][k]. get () ;
577575 for (i = 0 ; rlist->seg [i] > 0 ; i++) {
578576 minl += dd[rlist->seg [i]];
579577 }
@@ -1135,7 +1133,7 @@ Tree Flute::flutes_LD(int d,
11351133 }
11361134
11371135 minl = l[0 ] = xs[d - 1 ] - xs[0 ] + ys[d - 1 ] - ys[0 ];
1138- rlist = LUT [d][k];
1136+ rlist = (* LUT ) [d][k]. get () ;
11391137 for (i = 0 ; rlist->seg [i] > 0 ; i++) {
11401138 minl += dd[rlist->seg [i]];
11411139 }
0 commit comments