warshall.c revision 1.6
1/*	$NetBSD: warshall.c,v 1.6 2011/09/10 21:29:04 christos Exp $	*/
2/* Id: warshall.c,v 1.7 2010/06/06 22:48:51 tom Exp */
3
4#include "defs.h"
5
6#include <sys/cdefs.h>
7__RCSID("$NetBSD: warshall.c,v 1.6 2011/09/10 21:29:04 christos Exp $");
8
9static void
10transitive_closure(unsigned *R, int n)
11{
12    int rowsize;
13    unsigned i;
14    unsigned *rowj;
15    unsigned *rp;
16    unsigned *rend;
17    unsigned *ccol;
18    unsigned *relend;
19    unsigned *cword;
20    unsigned *rowi;
21
22    rowsize = WORDSIZE(n);
23    relend = R + n * rowsize;
24
25    cword = R;
26    i = 0;
27    rowi = R;
28    while (rowi < relend)
29    {
30	ccol = cword;
31	rowj = R;
32
33	while (rowj < relend)
34	{
35	    if (*ccol & (unsigned)(1 << i))
36	    {
37		rp = rowi;
38		rend = rowj + rowsize;
39		while (rowj < rend)
40		    *rowj++ |= *rp++;
41	    }
42	    else
43	    {
44		rowj += rowsize;
45	    }
46
47	    ccol += rowsize;
48	}
49
50	if (++i >= BITS_PER_WORD)
51	{
52	    i = 0;
53	    cword++;
54	}
55
56	rowi += rowsize;
57    }
58}
59
60void
61reflexive_transitive_closure(unsigned *R, int n)
62{
63    int rowsize;
64    unsigned i;
65    unsigned *rp;
66    unsigned *relend;
67
68    transitive_closure(R, n);
69
70    rowsize = WORDSIZE(n);
71    relend = R + n * rowsize;
72
73    i = 0;
74    rp = R;
75    while (rp < relend)
76    {
77	*rp |= (unsigned)(1 << i);
78	if (++i >= BITS_PER_WORD)
79	{
80	    i = 0;
81	    rp++;
82	}
83
84	rp += rowsize;
85    }
86}
87