1 (* Copyright (C) 2014,2017 Matthew Fluet.
2 * Copyright (C) 2004-2007 Henry Cejtin, Matthew Fluet, Suresh
3 * Jagannathan, and Stephen Weeks.
5 * MLton is released under a BSD-style license.
6 * See the file MLton-LICENSE for details.
9 functor WordXVector (S: WORD_X_VECTOR_STRUCTS): WORD_X_VECTOR =
14 datatype t = T of {elementSize: WordSize.t,
15 elements: WordX.t vector}
18 fun make f (T r) = f r
20 val elementSize = make #elementSize
21 val elements = make #elements
24 fun layout (T {elements, elementSize}) =
29 Layout.fill (Layout.separateRight
31 (elements, WordX.layout),
37 Layout.str (String.escapeSML (String.implodeV cs)),
40 if WordSize.equals (elementSize, WordSize.word8)
42 val cs = Vector.map (elements, WordX.toChar)
43 val l = Vector.length cs
44 val n = Vector.fold (cs, 0, fn (c, n) =>
50 if l = 0 orelse (10 * n) div l > 9
57 val toString = Layout.toString o layout
59 val hash = String.hash o toString
62 WordSize.equals (elementSize v, elementSize v')
63 andalso Vector.equals (elements v, elements v', WordX.equals)
66 if WordSize.equals (elementSize v, elementSize v')
67 then case Int.compare (Vector.length (elements v), Vector.length (elements v')) of
69 | EQUAL => Vector.compare (elements v, elements v', fn (w, w') =>
70 WordX.compare (w, w', {signed = false}))
72 else Error.bug "WordXVector.compare"
75 case compare (v, v') of
80 fun foldFrom (v, start, b, f) = Vector.foldFrom (elements v, start, b, f)
82 fun forall (v, f) = Vector.forall (elements v, f)
84 fun fromVector ({elementSize}, v) =
85 T {elementSize = elementSize,
88 fun fromList ({elementSize}, l) =
89 T {elementSize = elementSize,
90 elements = Vector.fromList l}
92 fun fromListRev ({elementSize}, l) =
93 T {elementSize = elementSize,
94 elements = Vector.fromListRev l}
97 T {elementSize = WordSize.byte,
98 elements = Vector.tabulate (String.size s, fn i =>
99 WordX.fromChar (String.sub (s, i)))}
101 fun length v = Vector.length (elements v)
103 fun sub (v, i) = Vector.sub (elements v, i)
105 fun tabulate ({elementSize}, n, f) =
106 T {elementSize = elementSize,
107 elements = Vector.tabulate (n, f)}
109 fun toListMap (v, f) = Vector.toListMap (elements v, f)