Mercurial > hg > CbC > CbC_gcc
diff libphobos/libdruntime/gc/bits.d @ 145:1830386684a0
gcc-9.2.0
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 11:34:05 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libphobos/libdruntime/gc/bits.d Thu Feb 13 11:34:05 2020 +0900 @@ -0,0 +1,129 @@ +/** + * Contains a bitfield used by the GC. + * + * Copyright: Copyright Digital Mars 2005 - 2013. + * License: $(WEB www.boost.org/LICENSE_1_0.txt, Boost License 1.0). + * Authors: Walter Bright, David Friedman, Sean Kelly + */ + +/* Copyright Digital Mars 2005 - 2013. + * Distributed under the Boost Software License, Version 1.0. + * (See accompanying file LICENSE or copy at + * http://www.boost.org/LICENSE_1_0.txt) + */ +module gc.bits; + + +import core.bitop; +import core.stdc.string; +import core.stdc.stdlib; +import core.exception : onOutOfMemoryError; + +struct GCBits +{ + alias size_t wordtype; + + enum BITS_PER_WORD = (wordtype.sizeof * 8); + enum BITS_SHIFT = (wordtype.sizeof == 8 ? 6 : 5); + enum BITS_MASK = (BITS_PER_WORD - 1); + enum BITS_1 = cast(wordtype)1; + + wordtype* data; + size_t nbits; + + void Dtor() nothrow + { + if (data) + { + free(data); + data = null; + } + } + + void alloc(size_t nbits) nothrow + { + this.nbits = nbits; + data = cast(typeof(data[0])*)calloc(nwords, data[0].sizeof); + if (!data) + onOutOfMemoryError(); + } + + wordtype test(size_t i) const nothrow + in + { + assert(i < nbits); + } + body + { + return core.bitop.bt(data, i); + } + + int set(size_t i) nothrow + in + { + assert(i < nbits); + } + body + { + return core.bitop.bts(data, i); + } + + int clear(size_t i) nothrow + in + { + assert(i <= nbits); + } + body + { + return core.bitop.btr(data, i); + } + + void zero() nothrow + { + memset(data, 0, nwords * wordtype.sizeof); + } + + void copy(GCBits *f) nothrow + in + { + assert(nwords == f.nwords); + } + body + { + memcpy(data, f.data, nwords * wordtype.sizeof); + } + + @property size_t nwords() const pure nothrow + { + return (nbits + (BITS_PER_WORD - 1)) >> BITS_SHIFT; + } +} + +unittest +{ + GCBits b; + + b.alloc(786); + assert(!b.test(123)); + assert(!b.clear(123)); + assert(!b.set(123)); + assert(b.test(123)); + assert(b.clear(123)); + assert(!b.test(123)); + + b.set(785); + b.set(0); + assert(b.test(785)); + assert(b.test(0)); + b.zero(); + assert(!b.test(785)); + assert(!b.test(0)); + + GCBits b2; + b2.alloc(786); + b2.set(38); + b.copy(&b2); + assert(b.test(38)); + b2.Dtor(); + b.Dtor(); +}