1 #include "defs.h" 2 transitive_closure(unsigned * R,int n)3void transitive_closure(unsigned *R, int n) 4 { 5 int rowsize; 6 unsigned mask; 7 unsigned *rowj; 8 unsigned *rp; 9 unsigned *rend; 10 unsigned *ccol; 11 unsigned *relend; 12 unsigned *cword; 13 unsigned *rowi; 14 15 rowsize = WORDSIZE(n); 16 relend = R + n*rowsize; 17 18 cword = R; 19 mask = 1; 20 rowi = R; 21 while (rowi < relend) 22 { 23 ccol = cword; 24 rowj = R; 25 26 while (rowj < relend) 27 { 28 if (*ccol & mask) 29 { 30 rp = rowi; 31 rend = rowj + rowsize; 32 while (rowj < rend) 33 *rowj++ |= *rp++; 34 } 35 else 36 { 37 rowj += rowsize; 38 } 39 40 ccol += rowsize; 41 } 42 43 mask <<= 1; 44 if (mask == 0) 45 { 46 mask = 1; 47 cword++; 48 } 49 50 rowi += rowsize; 51 } 52 } 53 reflexive_transitive_closure(unsigned * R,int n)54void reflexive_transitive_closure(unsigned *R, int n) 55 { 56 int rowsize; 57 unsigned mask; 58 unsigned *rp; 59 unsigned *relend; 60 61 transitive_closure(R, n); 62 63 rowsize = WORDSIZE(n); 64 relend = R + n*rowsize; 65 66 mask = 1; 67 rp = R; 68 while (rp < relend) 69 { 70 *rp |= mask; 71 mask <<= 1; 72 if (mask == 0) 73 { 74 mask = 1; 75 rp++; 76 } 77 78 rp += rowsize; 79 } 80 } 81 82