[英]How would I convert a c++ vector to a lisp vector in a 0(1) operation
我有C ++ vector<int>
這些C綁定,我已經用CFFI包裝了它。
我知道如何創建vector<int>
s的std_carrayTovector
和數據轉換回int
與指針std_vectorToCArray
這樣我就可以在Lisp中使用CFFI功能從中檢索數據MEM-AREF
。 我有正確的defcfun
s為下面寫的。
我的問題是:如何將我的defcfun
for std_vectorToCArray
的輸出轉換為Lisp向量(例如#(1 2 3)
)並使其成為O(1)操作 - 即同時復制所有數據。
vector_int* std_carrayTovector(int* a, size_t len) {
vector<int>* v = new vector<int>;
for(size_t i = 0; i < len; i++)
v->push_back(a[i]);
return v;
}
int* std_vectorToCArray(vector_int* s) {
return s->data();
}
(defcfun ("std_vectori_to_carray" %vector-int-to-c-array) :pointer
(s (:pointer vector-int)))
我沒試過這個,但我認為以下內容應該有效。 關於std::vector
我們可以使用的重要一點是,它保證有一個誠實的上帝陣列支持。 也就是說, & my_vector [0]
指向my_vector
對象的my_vector
。 (這不適用於例如std::list
或其他任何東西,當然)
所以你要做的就是創建一個CFFI可以調用的函數(在你的C ++代碼中),它返回一個指向向量開頭的指針。 大概是這樣的:
extern "C"
Foo*
start_of_foo_vector (std::vector<Foo> vec)
{
return & vec[0];
}
你需要一個extern "C"
這樣你就不用擔心名字錯了。 當然,你必須為每種類型編寫不同的函數(並且不能使用帶有extern "C"
模板,我不認為)。
在下次修改向量之前,您獲得的指針有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.