using System;
using System.Runtime.InteropServices;

public class PclPointCloudXYZ : IDisposable {
    private IntPtr handle;

    public PclPointCloudXYZ() => handle = create_pointcloud_xyz();
    // 构造函数用于内部封装 handle 对象
    public PclPointCloudXYZ(IntPtr handle) => this.handle = handle;
    public void Dispose() { delete_pointcloud(handle); handle = IntPtr.Zero; }

    public bool Load(string path) => load_pcd_xyz( path,handle);
    public int Save(string path) => save_pcd_xyz(path,handle);
    public IntPtr Handle => handle;

    [DllImport("./pcl/libpclwrapper.dylib")] private static extern IntPtr create_pointcloud_xyz();
    [DllImport("./pcl/libpclwrapper.dylib")] private static extern void delete_pointcloud(IntPtr ptr);
    [DllImport("./pcl/libpclwrapper.dylib")] private static extern bool load_pcd_xyz(string path,IntPtr ptr);
    [DllImport("./pcl/libpclwrapper.dylib")] private static extern int save_pcd_xyz(string path,IntPtr ptr);
}

public class PclVoxelGridXYZ : IDisposable {
    private IntPtr handle;

    public PclVoxelGridXYZ() => handle = create_voxel_filter_xyz();
    public void Dispose() { delete_voxel_filter(handle); handle = IntPtr.Zero; }

    public void SetLeafSize(float x, float y, float z) => set_voxel_leaf_size(handle, x, y, z);
    public void SetInputCloud(PclPointCloudXYZ cloud) => set_voxel_input_cloud(handle, cloud.Handle);
    public PclPointCloudXYZ Filter() => new PclPointCloudXYZ(apply_voxel_filter_xyz(handle));

    [DllImport("./pcl/libpclwrapper.dylib")] private static extern IntPtr create_voxel_filter_xyz();
    [DllImport("./pcl/libpclwrapper.dylib")] private static extern void delete_voxel_filter(IntPtr ptr);
    [DllImport("./pcl/libpclwrapper.dylib")] private static extern void set_voxel_leaf_size(IntPtr ptr, float x, float y, float z);
    [DllImport("./pcl/libpclwrapper.dylib")] private static extern void set_voxel_input_cloud(IntPtr filterPtr, IntPtr cloudPtr);
    [DllImport("./pcl/libpclwrapper.dylib")] private static extern IntPtr apply_voxel_filter_xyz(IntPtr filterPtr);

    
}