Mercurial > hg > sv-dependency-builds
comparison src/fftw-3.3.8/kernel/rader.c @ 167:bd3cc4d1df30
Add FFTW 3.3.8 source, and a Linux build
author | Chris Cannam <cannam@all-day-breakfast.com> |
---|---|
date | Tue, 19 Nov 2019 14:52:55 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
166:cbd6d7e562c7 | 167:bd3cc4d1df30 |
---|---|
1 /* | |
2 * Copyright (c) 2003, 2007-14 Matteo Frigo | |
3 * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology | |
4 * | |
5 * This program is free software; you can redistribute it and/or modify | |
6 * it under the terms of the GNU General Public License as published by | |
7 * the Free Software Foundation; either version 2 of the License, or | |
8 * (at your option) any later version. | |
9 * | |
10 * This program is distributed in the hope that it will be useful, | |
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 * GNU General Public License for more details. | |
14 * | |
15 * You should have received a copy of the GNU General Public License | |
16 * along with this program; if not, write to the Free Software | |
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
18 * | |
19 */ | |
20 | |
21 #include "kernel/ifftw.h" | |
22 | |
23 /* | |
24 common routines for Rader solvers | |
25 */ | |
26 | |
27 | |
28 /* shared twiddle and omega lists, keyed by two/three integers. */ | |
29 struct rader_tls { | |
30 INT k1, k2, k3; | |
31 R *W; | |
32 int refcnt; | |
33 rader_tl *cdr; | |
34 }; | |
35 | |
36 void X(rader_tl_insert)(INT k1, INT k2, INT k3, R *W, rader_tl **tl) | |
37 { | |
38 rader_tl *t = (rader_tl *) MALLOC(sizeof(rader_tl), TWIDDLES); | |
39 t->k1 = k1; t->k2 = k2; t->k3 = k3; t->W = W; | |
40 t->refcnt = 1; t->cdr = *tl; *tl = t; | |
41 } | |
42 | |
43 R *X(rader_tl_find)(INT k1, INT k2, INT k3, rader_tl *t) | |
44 { | |
45 while (t && (t->k1 != k1 || t->k2 != k2 || t->k3 != k3)) | |
46 t = t->cdr; | |
47 if (t) { | |
48 ++t->refcnt; | |
49 return t->W; | |
50 } else | |
51 return 0; | |
52 } | |
53 | |
54 void X(rader_tl_delete)(R *W, rader_tl **tl) | |
55 { | |
56 if (W) { | |
57 rader_tl **tp, *t; | |
58 | |
59 for (tp = tl; (t = *tp) && t->W != W; tp = &t->cdr) | |
60 ; | |
61 | |
62 if (t && --t->refcnt <= 0) { | |
63 *tp = t->cdr; | |
64 X(ifree)(t->W); | |
65 X(ifree)(t); | |
66 } | |
67 } | |
68 } |