Mercurial > projects > dwt-linux
diff dwt/dwthelper/System.d @ 25:fc2b263b8a3f
Merged back the System.arraycopy and use a System class
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Tue, 08 Jan 2008 01:23:25 +0100 |
parents | |
children | 09f5459a5014 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dwt/dwthelper/System.d Tue Jan 08 01:23:25 2008 +0100 @@ -0,0 +1,118 @@ +module dwt.dwthelper.System; + +import tango.core.Exception; + +template SimpleType(T) { + debug{ + static void validCheck(uint SrcLen, uint DestLen, uint copyLen){ + if(SrcLen < copyLen || DestLen < copyLen|| SrcLen < 0 || DestLen < 0){ + Util.trace("Error : SimpleType.arraycopy(), out of bounds."); + assert(0); + } + } + } + + static void remove(inout T[] items, int index) { + if(items.length == 0) + return; + + if(index < 0 || index >= items.length){ + throw new ArrayBoundsException(__FILE__, __LINE__); + } + + T element = items[index]; + + int length = items.length; + if(length == 1){ + items.length = 0; + return;// element; + } + + if(index == 0) + items = items[1 .. $]; + else if(index == length - 1) + items = items[0 .. index]; + else + items = items[0 .. index] ~ items[index + 1 .. $]; + } + + static void insert(inout T[] items, T item, int index = -1) { + if(index == -1) + index = items.length; + + if(index < 0 || index > items.length ){ + throw new ArrayBoundsException(__FILE__, __LINE__); + } + + if(index == items.length){ + items ~= item; + }else if(index == 0){ + T[] newVect; + newVect ~= item; + items = newVect ~ items; + }else if(index < items.length ){ + T[] arr1 = items[0 .. index]; + T[] arr2 = items[index .. $]; + + // Important : if you write like the following commented, + // you get wrong data + // code: T[] arr1 = items[0..index]; + // T[] arr2 = items[index..$]; + // items = arr1 ~ item; // error, !!! + // items ~= arr2; // item replace the arrr2[0] here + items = arr1 ~ item ~ arr2; + } + } + + static void arraycopy(T[] src, uint srcPos, T[] dest, uint destPos, uint len) + { + if(len == 0) return; + + assert(src); + assert(dest); + debug{validCheck(src.length - srcPos, dest.length - destPos, len);} + + if(src is dest){ + for(int i=0; i<len; ++i){ + dest[destPos+i] = src[srcPos+i]; + } + }else{ + dest[destPos..(len+destPos)] = src[srcPos..(len+srcPos)]; + } + } +} + + +class System { + + alias SimpleType!(int).arraycopy arraycopy; + alias SimpleType!(byte).arraycopy arraycopy; + alias SimpleType!(double).arraycopy arraycopy; + alias SimpleType!(float).arraycopy arraycopy; + alias SimpleType!(short).arraycopy arraycopy; + alias SimpleType!(long).arraycopy arraycopy; + alias SimpleType!(uint).arraycopy arraycopy; + alias SimpleType!(ushort).arraycopy arraycopy; + alias SimpleType!(ubyte).arraycopy arraycopy; + alias SimpleType!(ulong).arraycopy arraycopy; + alias SimpleType!(char).arraycopy arraycopy; + alias SimpleType!(wchar).arraycopy arraycopy; + alias SimpleType!(Object).arraycopy arraycopy; + alias SimpleType!(void*).arraycopy arraycopy; + + alias SimpleType!(int[]).arraycopy arraycopy; + alias SimpleType!(byte[]).arraycopy arraycopy; + alias SimpleType!(double[]).arraycopy arraycopy; + alias SimpleType!(float[]).arraycopy arraycopy; + alias SimpleType!(short[]).arraycopy arraycopy; + alias SimpleType!(long[]).arraycopy arraycopy; + alias SimpleType!(uint[]).arraycopy arraycopy; + alias SimpleType!(ushort[]).arraycopy arraycopy; + alias SimpleType!(ubyte[]).arraycopy arraycopy; + alias SimpleType!(ulong[]).arraycopy arraycopy; + alias SimpleType!(char[]).arraycopy arraycopy; + alias SimpleType!(wchar[]).arraycopy arraycopy; + alias SimpleType!(Object[]).arraycopy arraycopy; + alias SimpleType!(void*[]).arraycopy arraycopy; +} +