%module{Slic3r::XS}; %{ #include #include "ZTable.hpp" #include #include %} %name{Slic3r::Object::XS::ZTable} class ZTable { ZTable(std::vector* z_array); ~ZTable(); %{ std::vector get_range(THIS, min_z, max_z) ZTable* THIS; unsigned int min_z; unsigned int max_z; CODE: RETVAL.resize(2); unsigned int bottom = 0; unsigned int top = THIS->z.size()-1; while (1) { unsigned int mid = bottom + floor((top - bottom)/2.0); if (mid == top || mid == bottom) { RETVAL[0] = mid; break; } if (THIS->z[mid] > min_z) { top = mid; } else { bottom = mid; } } top = THIS->z.size()-1; while (1) { unsigned int mid = bottom + ceil((top - bottom)/2.0); if (mid == top || mid == bottom) { RETVAL[1] = mid; break; } if (THIS->z[mid] < max_z) { bottom = mid; } else { top = mid; } } OUTPUT: RETVAL unsigned int ZTable::lower_bound(z, offset = 0) unsigned int z unsigned int offset CODE: RETVAL = std::lower_bound(THIS->z.begin() + offset, THIS->z.end(), z) - THIS->z.begin(); OUTPUT: RETVAL unsigned int ZTable::upper_bound(z, offset = 0) unsigned int z unsigned int offset CODE: RETVAL = std::upper_bound(THIS->z.begin() + offset, THIS->z.end(), z) - THIS->z.begin(); OUTPUT: RETVAL %} }; %package{Slic3r::Object::XS}; %{ #include #include %}