I don't know this is the best way to make `iterator mitems*[T](a: var 
Vector[T]):var T` works, but this code works. It looks like nim just replace 
calling `proc `[]`*[T](this:var Vector[T]; index: int): var T` to `v[i]`. 
`std::vector[T]::operator[ ](size_type pos)` returns reference to a element. 
But a iterator returns `var T` is mapped to pointer to T in C++ code. `(addr 
a[i])[]` returns `var T` in Nim and become `&(v[i])` in C++ code.
    
    
    {.emit: """
    using namespace std;
    """.}
    
    type
      Vector* {.importcpp: "std::vector", header: "<vector>".}[T] = object
    
    proc constructVector*[T](size: cuint): Vector[T] {.
        importcpp: "vector<'*0>(@)", header: "<vector>", constructor.}
    proc constructVector*[T](size: cuint; data:var T): Vector[T] {.
        importcpp: "vector<'*0>(@)", header: "<vector>", constructor.}
    proc constructVector*[T](vector: Vector[T]): Vector[T] {.
        importcpp: "vector<'*0>(@)", header: "<vector>", constructor.}
    proc destroyVector*[T](this: var Vector[T]) {.importcpp: "#.~Vector()",
        header: "<vector>".}
    
    proc `[]`*[T](this:var Vector[T]; index: int): var T {.importcpp: "#[@]",
        header: "<vector>".}
    
    proc size*[T](this: var Vector[T]): var int {.importcpp: "size", header: 
"<vector>".}
    iterator mitems*[T](a: var Vector[T]):var T =
      for i in 0..<a.size:
        yield (addr a[i])[]
    #    yield a[i]
    
    type
      testObj = object
        x: int
        y: float
    
    proc main =
      var t = testObj(x: 7, y: 7)
      var v:Vector[testObj] = constructVector[testObj](2, t)
      
      echo v[0]
      
      for i in v.mitems:
        i.x = 123
      
      for i in v.mitems:
        echo i.x
    
    main()
    
    
    Run

Reply via email to