array capacities
Thomas Kuehne
thomas-dloop at kuehne.cn
Tue Oct 24 12:16:25 PDT 2006
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Ever wondered about the capacity of an array?
# import internal.gc.gcbits;
# import internal.gc.gclinux;
# import internal.gc.gcx;
# import std.gc;
#
# /* return the maximum number of storable elements that
# * would cause no relocation
# *
# * 0 for memory not allocated via the GC
# *
# * array/pointer kludge: "specialization not allowed for deduced parameter"
# */
# template getCapacity(T){
# size_t getCapacity(T data){
# gc_t engine = cast(gc_t) getGCHandle();
# static if(isArrayType!(T)){
# // plain array
# size_t size = engine.capacity(data.ptr);
# return size ? (size / data[0].sizeof) - 1 : 0;
# }else static if(is(T : void*)){
# // pointer
# size_t size = engine.capacity(data);
# return size ? (size / data[0].sizeof) - 1 : 0;
# }else static if(is(typeof(data.length))
# && is(typeof(data.rehash) == T)
# && is(typeof(data.keys))
# && is(typeof(data.values))
# && !is(typeof(data.ptr))
# )
# {
# // most likely an associative array
# return data.length;
# }else{
# static assert(0, "neither array nor pointer");
# }
# }
# }
#
# template isArrayType( T ) { const bool isArrayType = false; }
# template isArrayType( T : T[] ) { const bool isArrayType = true; }
#
usage sample:
# import std.stdio, std.c.stdlib;
#
# int main(){
# writefln("test\t\tcapacity\tcomment");
# writefln("----");
#
# short[char[]] aa;
# aa["eins"] = 1;
# aa["sechs"] = 6;
# writefln("aa(2)\t\t%s", getCapacity(aa));
# aa["vier"] = 4;
# writefln("aa(3)\t\t%s", getCapacity(aa));
#
# writefln("----");
#
# dchar[] array = "Hallo";
# writefln("literal\t\t%s", getCapacity(array));
#
# writefln("----");
#
# array = new dchar[5];
# writefln("dynamic(5)\t%s\t(stored at 0x%X)", getCapacity(array), array.ptr);
# array.length = 7;
# writefln("dynamic(7)\t%s\t(stored at 0x%X)", getCapacity(array), array.ptr);
# array.length = 8;
# writefln("dynamic(8)\t%s\t(stored at 0x%X)", getCapacity(array), array.ptr);
# array.length = 1;
# writefln("dynamic(1)\t%s\t(stored at 0x%X)", getCapacity(array), array.ptr);
#
# writefln("----");
#
# array = (cast(dchar*)std.c.stdlib.malloc(5 * dchar.sizeof))[0 .. 4];
# writefln("malloced\t%s", getCapacity(array));
#
# return 0;
# }
output:
> test capacity comment
> ----
> aa(2) 2
> aa(3) 3
> ----
> literal 0
> ----
> dynamic(5) 7 (stored at 0xF7C86F80)
> dynamic(7) 7 (stored at 0xF7C86F80)
> dynamic(8) 15 (stored at 0xF7C87FC0)
> dynamic(1) 15 (stored at 0xF7C87FC0)
> ----
> malloced 0
Thomas
-----BEGIN PGP SIGNATURE-----
iD8DBQFFPnOOLK5blCcjpWoRAg8GAJ9WReBKgw9GBBVNzdmKnbq51ciERgCgp8r9
zyFlZrAzOCt91ofZF5d8aO8=
=+qPG
-----END PGP SIGNATURE-----
More information about the Digitalmars-d
mailing list