Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /sml/trunk/src/MLRISC/library/bitset.sml
ViewVC logotype

Annotation of /sml/trunk/src/MLRISC/library/bitset.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 245 - (view) (download)
Original Path: sml/branches/SMLNJ/src/MLRISC/library/bitset.sml

1 : monnier 245 structure BitSet :> BITSET =
2 :     struct
3 :    
4 :     structure A = Word8Array
5 :     structure W = Word8
6 :     open A
7 :    
8 :     infix << >> & ||
9 :     infix sub
10 :    
11 :     type bitset = array
12 :    
13 :     val word = Word.fromInt
14 :     val int = Word.toInt
15 :     val op & = Word.andb
16 :     val op >> = Word.>>
17 :     val op << = W.<<
18 :    
19 :     fun create n = array((n+7) div 8, 0wx0)
20 :    
21 :     fun size a = length(a) * 8
22 :    
23 :     fun set (a, i) =
24 :     let val byte = int((word i) >> 0w3)
25 :     val mask = W.<< (0w1, (word i) & 0w7)
26 :     in update(a, byte, W.orb(a sub byte, mask)) end
27 :    
28 :     fun reset (a, i) =
29 :     let val byte = int((word i) >> 0w3)
30 :     val mask = W.notb(W.<< (0w1, (word i) & 0w7))
31 :     in update(a, byte, W.andb(a sub byte, mask)) end
32 :    
33 :     fun clear a = modify (fn _ => 0wx0) a
34 :    
35 :     fun copy (a) = tabulate (length a, fn i => a sub i)
36 :    
37 :     fun toString (a) =
38 :     let fun f i = if i < length a then W.toString(a sub i)::f(i+1) else []
39 :     val s = String.concat(f 0)
40 :     in "[" ^ s ^ "]" end
41 :    
42 :     fun contains (a, i) =
43 :     let val byte = int((word i) >> 0w3)
44 :     val mask = W.<<(0w1, (word i) & 0w7)
45 :     in W.andb(A.sub(a, byte), mask) <> 0wx0 end
46 :    
47 :     fun markAndTest (a, i) =
48 :     let val byte = int((word i) >> 0w3)
49 :     val mask = W.<<(0w1, (word i) & 0w7)
50 :     val word = A.sub(a,byte)
51 :     in if W.andb(word, mask) <> 0wx0 then
52 :     true
53 :     else
54 :     (A.update(a, byte, W.orb(word, mask)); false)
55 :     end
56 :    
57 :     fun unmarkAndTest (a, i) =
58 :     let val byte = int(word i >> 0w3)
59 :     val mask = W.<<(0w1, (word i) & 0w7)
60 :     val word = A.sub(a,byte)
61 :     in if W.andb(word, mask) <> 0wx0 then
62 :     (A.update(a, byte, W.andb(word,W.notb mask)); true)
63 :     else
64 :     false
65 :     end
66 :    
67 :     end
68 :    
69 :     (*
70 :     * $Log$
71 :     *)

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0