#ifndef _LIVOX_GEN1_PCLOUD_INTENSITY_STIMULUS_BUFFER_H
#define _LIVOX_GEN1_PCLOUD_INTENSITY_STIMULUS_BUFFER_H

#include <memory>
#include <user/stimulusBuffer.h>
#include <user/stagingBuffer.h>
#include <user/intrinThresholdParams.h>

namespace smo {
namespace stim_buff {

// Forward declaration
class StimulusProducer;

/**
 * PcloudIntensityStimulusBuffer is a specialized StimulusBuffer for intensity point cloud data.
 */
class PcloudIntensityStimulusBuffer
:	public StimulusBuffer
{
public:
	explicit PcloudIntensityStimulusBuffer(
		StimulusProducer& parent,
		const std::shared_ptr<device::DeviceAttachmentSpec>
			&deviceAttachmentSpec,
		int histbuffMs,
		const StagingBuffer::IOEngineConstraints& inputEngineConstraints,
		const StagingBuffer::IOEngineConstraints& outputEngineConstraints,
		const SmoCallbacks& callbacks,
		cl_mem_flags flags)
	:	StimulusBuffer(
			parent, deviceAttachmentSpec, histbuffMs,
			inputEngineConstraints, outputEngineConstraints,
			callbacks, flags)
	{
		intrin::validateNoIntrinParamsOnQualeIface(
			deviceAttachmentSpec->qualeIfaceApi,
			deviceAttachmentSpec->qualeIfaceApiParams);
	}

	~PcloudIntensityStimulusBuffer() = default;

	// Non-copyable, non-movable: inherited pinner lifetime is instance-bound
	PcloudIntensityStimulusBuffer(
		const PcloudIntensityStimulusBuffer&) = delete;
	PcloudIntensityStimulusBuffer& operator=(
		const PcloudIntensityStimulusBuffer&) = delete;
	PcloudIntensityStimulusBuffer(
		PcloudIntensityStimulusBuffer&&) = delete;
	PcloudIntensityStimulusBuffer& operator=(
		PcloudIntensityStimulusBuffer&&) = delete;
};

} // namespace stim_buff
} // namespace smo

#endif // _LIVOX_GEN1_PCLOUD_INTENSITY_STIMULUS_BUFFER_H
