C++ rvalue, std::move . , - Cython , .
peak_detection_.pyx.
std::move. (vector<Peak>), .
cdef extern from "<utility>":
vector[Peak]&& move(vector[Peak]&&) # just define for peak rather than anything else
-, . Python, , .
cdef class PyPeakVector:
cdef vector[Peak] vec
cdef move_from(self, vector[Peak]&& move_this):
self.vec = move(move_this)
def __getitem__(self,idx):
return PyPeak2(self,idx)
def __len__(self):
return self.vec.size()
Peak. , Peak, ( ).
cdef class PyPeak2:
cdef int idx
cdef PyPeakVector vector
def __cinit__(self,PyPeakVector vec,idx):
self.vector = vec
self.idx = idx
cdef Peak* getthisptr(self):
return &self.vector.vec[self.idx]
, getPeaks()
cdef class PyPeakDetection:
def getPeaks(self, data):
cdef Peak peak
cdef PyPeak new_peak
cdef vector[Peak] peaks = self.thisptr.getPeaks(data)
retval = PyPeakVector()
retval.move_from(move(peaks))
return retval
:
Peak , , move Peak, , PyPeak. , , "".
C++ 11, . , C++ getPeaks , ( PyPeakVector) . .