D - Repost: bug in templates?
- Andres Rodriguez (100/108) Feb 03 2004 Since I am new here, I don't know what is the usual turn-around for
- Vathix (8/8) Feb 03 2004 It seems to work fine if you use this:
Since I am new here, I don't know what is the usual turn-around for questions, but since I see activity I am going to assume that my original question went unswered. I am to use D, I need to understand if the following code is a bug in D, in which case I will unpatiently wait for it to being fixed, or if I am making uncorrect assumptions. Below is my original post. Thanks is advance for your help and patience with re-explaining everything to someone new. Cheers, Andres ----- Here is a minimalist ArrayList implementation using templates. Everything compiles fine, until I throw the second test file in the mix. I tried using the same syntax from the Christopher E. Miller example of a linked list. The trouble seems to be the method 'addAll', because if I comment it out, eveything compiles. But the weird thing is that MyArrayList compiles fine without the test file at the end, is only after adding that file that I get the compilation error. I get the following error:cd c:/dev/d/util/src/sri/util/test/ make -k -f c:/dev/d/util/Makefile compile \dmd\bin\dmd -c -od\dev\d\util\bin -I\dev\d\util\src -release\dev\d\util\src\sri\util\MyArrayList\dmd\bin\dmd -c -od\dev\d\util\bin -I\dev\d\util\src -release\dev\d\util\src\sri\util\test\TestMyArrayListtemplate instance MyArrayList!(char[]) MyArrayList is not a templatedeclarationmake: *** [sri-util-test] Error 1 make: Target `compile' not remade because of errors. Compilation exited abnormally with code 2 at Sun Feb 01 08:40:29Thanks in advance, Andres ***** File MyArrayList module sri.util.MyArrayList; public class MyArrayList(T) { //~ ATTRIBUTE(S) private int length = 0; private T[] data; //~ CONSTRUCTOR(S) public this() { } public this(MyArrayList!(T) c) { addAll(c); } public this(int initialCapacity) { data.length = initialCapacity; } //~ METHOD(S) public boolean add(T o) { ensureCapacity(length+1); data[length++] = o; return true; } public void add(int index, T element) { ensureCapacity(length+1); for (int i = length - 1; i > index; i--) data[i] = data[i-1]; data[index] = element; } public boolean addAll(MyArrayList!(T) c) { boolean modified = false; for (int i = 0; i < c.length; i++) { if (add(c.get(i))) modified = true; } return modified; } public void clear() { data.length = 0; } public boolean contains(T o) { for (int i = 0; i < length; i++) if (o == data[i]) return true; return false; } public void ensureCapacity(int minCapacity) { if (minCapacity > data.length) { data.length = (data.length == 0? 10 : 2 * data.length); } } public T get(int index) { return data[index]; } public boolean isEmpty() { return length == 0; } public T remove(int index) { T o = data[index]; length--; for (int i = index; i < length; i++) data[i] = data[i+1]; return o; } public boolean remove(T o) { int lag = 0; for (int i = 0; i < length - lag; i++) { if (o == data[i]) lag++; if (lag > 0) data[i] = data[i+lag]; } length -= lag; return lag > 0; } public T set(int index, T element) { return data[index] = element; } public int size() { return length; } } ***** File TestMyArrayList module sri.util.test.TestMyArrayList; import sri.util.MyArrayList; public class TestMyArrayList { protected void buildArrayList() { MyArrayList!(char[]) al = new MyArrayList!(char[]); al.add("a"); al.add("c"); al.add("u"); al.add("n"); al.add("i"); al.add("a"); al.add(null); } }
Feb 03 2004
It seems to work fine if you use this: public boolean addAll(MyArrayList c) instead of public boolean addAll(MyArrayList!(T) c) Same with the constructor. -- Christopher E. Miller www.dprogramming.com
Feb 03 2004