Написание итератора для вектора CxxWrap - PullRequest
0 голосов
/ 06 марта 2019

Я оцениваю CxxWrap для проекта Julia (1.x), над которым я работаю.Я заинтересован в том, чтобы мой код CxxWrap возвращал тип std :: vector и выполнял итерацию по вектору в моем коде Julia.Часть c ++ выглядит примерно так:

using PointVec = std::vector<Point2D>;
.
.
.
JLCXX_MODULE define_julia_module(jlcxx::Module& types) {
.
.
.
    types.add_type<PointVec>("PointVec")
      .method("length", &PointVec::size)
      .method("getindex", [](const PointVec& vec, size_t index) {
                        return vec.at(index);
                    });
.
.
.
}

Это основано на поиске, который я уже сделал.Пример, который я использовал для намека на создание итератора на стороне Юлии, но не уточнил.Описания создания итераторов Julia, которые я видел, довольно устрашающие, и совсем не очевидно, как использовать тип CxxWrap, который я импортирую.Любые советы будут оценены.

1 Ответ

0 голосов
/ 08 марта 2019

С большой помощью Яна Струба на сайте Джулии Дискурс я разработал подход, который работает:

module BoostWrapper
using CxxWrap
@wrapmodule("libboost_wrap")
function __init__()
    @initcxx
end
export Point2D, PointVec, getx, gety,
    Polygon2D, PolygonVec, add_vertex, scale_polygon, get_vertices,
    poly_intersection, intersection_point
end
using Main.BoostWrapper

import Base: getindex, length, convert, iterate, size

iterate(it::PointVec) = length(it) > 0 ? (it[1], 2) : nothing
iterate(it::PointVec, i) = i <= length(it) ? (it[i], i+1) : nothing
length(it::PointVec) = Main.BoostWrapper.size(it)
getindex(it::PointVec, i) = Main.BoostWrapper.at(it, convert(UInt64, i - 1))

eltype(::Type{PointVec}) = Point2D

p1 = Point2D(-10.0, 10.0)
p2 = Point2D(10.0, 10.0)
p3 = Point2D(10.0, -10.0)
p4 = Point2D(-10.0, -10.0)
obstacle = Polygon2D()
add_vertex(obstacle, p1)
add_vertex(obstacle, p2)
add_vertex(obstacle, p3)
add_vertex(obstacle, p4)

pts = get_vertices(obstacle)

for pt in pts
    println("current pt: ", getx(pt), ", ", gety(pt))
end

Я включил много деталей, потому что оказалось, что былитонкости, связанные с разрешением имен и т. д.

...