繁体   English   中英

为CxxWrap矢量编写迭代器

[英]Writing an iterator for a CxxWrap vector

我正在为我正在研究的Julia(1.x)项目评估CxxWrap。 我对让我的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方面创建了一个迭代器,但没有详细说明。 我看到的有关创建Julia迭代器的描述非常艰巨,而且如何导入我要导入的CxxWrap类型也一点也不明显。 任何提示将不胜感激。

在Jan Strube在Julia Discourse网站上的大量帮助下,我想到了一种可行的方法:

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

我包括了很多细节,因为事实证明名称解析等方面涉及一些微妙之处。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM