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