001 package org.bridj.cpp.std;
002
003 import org.bridj.ann.Template;
004 import org.bridj.cpp.CPPObject;
005
006
007 import org.bridj.BridJ;
008 import org.bridj.Pointer;
009 import org.bridj.ann.Field;
010 import org.bridj.ann.Struct;
011 import org.bridj.cpp.CPPRuntime;
012
013 import java.lang.reflect.Type;
014 import org.bridj.BridJRuntime;
015
016 import static org.bridj.Pointer.*;
017
018 /**
019 * Binding for <a href="http://www.sgi.com/tech/stl/Vector.html">STL's std::vector</a> class.
020 * @author ochafik
021 * @param <T>
022 */
023 @Template({ Type.class })
024 @Struct(customizer = STL.class)
025 public class vector<T> extends CPPObject {
026 @Deprecated
027 @Field(0)
028 public Pointer<T> _M_start() {
029 return io.getPointerField(this, 0);
030 }
031 @Deprecated
032 @Field(1)
033 public Pointer<T> _M_finish() {
034 return io.getPointerField(this, 1);
035 }
036 @Deprecated
037 @Field(2)
038 public Pointer<T> _M_end_of_storage() {
039 return io.getPointerField(this, 2);
040 }
041 //@Constructor(-1)
042 public vector(Type t) {
043 super((Void)null, CPPRuntime.SKIP_CONSTRUCTOR, t);
044 }
045 public vector(Pointer<? extends vector<T>> peer) {
046 super(peer);
047 if (!isValid())
048 throw new RuntimeException("Invalid vector internal data ! Are you trying to use an unsupported version of the STL ?");
049 }
050
051 protected boolean isValid() {
052 long start = getPeer(_M_start());
053 long finish = getPeer(_M_finish());
054 long eos = getPeer(_M_end_of_storage());
055 if (start == 0 || finish == 0 || eos == 0)
056 return false;
057 return start <= finish && finish <= eos;
058 }
059
060 public T get(long index) {
061 // TODO make this unnecessary
062 Pointer<T> p = _M_start().as(T());
063 return p.get(index);
064 }
065 public T get(int index) {
066 return get((long)index);
067 }
068 public void push_back(T value) {
069 throw new UnsupportedOperationException();
070 }
071 protected Type T() {
072 return (Type)CPPRuntime.getInstance().getTemplateParameters(this, vector.class)[0];
073 }
074 protected long byteSize() {
075 return _M_finish().getPeer() - _M_start().getPeer();
076 }
077
078 public long size() {
079 long byteSize = byteSize();
080 long elementSize = BridJ.sizeOf(T());
081
082 return byteSize / elementSize;
083 }
084 }