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    }