annotate libphobos/libdruntime/gc/bits.d @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 /**
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 * Contains a bitfield used by the GC.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 *
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 * Copyright: Copyright Digital Mars 2005 - 2013.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 * License: $(WEB www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 * Authors: Walter Bright, David Friedman, Sean Kelly
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 /* Copyright Digital Mars 2005 - 2013.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 * Distributed under the Boost Software License, Version 1.0.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 * (See accompanying file LICENSE or copy at
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 * http://www.boost.org/LICENSE_1_0.txt)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 module gc.bits;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 import core.bitop;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 import core.stdc.string;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 import core.stdc.stdlib;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 import core.exception : onOutOfMemoryError;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 struct GCBits
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 alias size_t wordtype;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 enum BITS_PER_WORD = (wordtype.sizeof * 8);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 enum BITS_SHIFT = (wordtype.sizeof == 8 ? 6 : 5);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 enum BITS_MASK = (BITS_PER_WORD - 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 enum BITS_1 = cast(wordtype)1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 wordtype* data;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 size_t nbits;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 void Dtor() nothrow
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 if (data)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 free(data);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 data = null;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 void alloc(size_t nbits) nothrow
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 this.nbits = nbits;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 data = cast(typeof(data[0])*)calloc(nwords, data[0].sizeof);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 if (!data)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 onOutOfMemoryError();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 wordtype test(size_t i) const nothrow
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 in
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 assert(i < nbits);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 body
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 return core.bitop.bt(data, i);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 int set(size_t i) nothrow
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 in
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 assert(i < nbits);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 body
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 return core.bitop.bts(data, i);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 int clear(size_t i) nothrow
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 in
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 assert(i <= nbits);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 body
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 return core.bitop.btr(data, i);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 void zero() nothrow
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 memset(data, 0, nwords * wordtype.sizeof);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 void copy(GCBits *f) nothrow
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 in
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 assert(nwords == f.nwords);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 body
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 memcpy(data, f.data, nwords * wordtype.sizeof);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 @property size_t nwords() const pure nothrow
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 return (nbits + (BITS_PER_WORD - 1)) >> BITS_SHIFT;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 unittest
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 GCBits b;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 b.alloc(786);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 assert(!b.test(123));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 assert(!b.clear(123));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 assert(!b.set(123));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110 assert(b.test(123));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111 assert(b.clear(123));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 assert(!b.test(123));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 b.set(785);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115 b.set(0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 assert(b.test(785));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 assert(b.test(0));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 b.zero();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119 assert(!b.test(785));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 assert(!b.test(0));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 GCBits b2;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 b2.alloc(786);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 b2.set(38);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 b.copy(&b2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126 assert(b.test(38));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127 b2.Dtor();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 b.Dtor();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 }