#pragma DCPS_SUPPORT_ZERO_COPY_READ
#pragma DCPS_GEN_ZERO_COPY_READ
#pragma DCPS_DATA_SEQUENCE_TYPE "<%SCOPED_NOT_GLOBAL%><%SEQ%>"
typedef sequence<<%SCOPED%>> <%TYPE%><%SEQ%>;

/** Support topic registration for <%TYPE%> data type.
 *
 * See the DDS specification, OMG formal/2015-04-10, for a description of
 * this interface.
 */
local interface <%TYPE%>TypeSupport : OpenDDS::DCPS::TypeSupport {
};

/** DataWriter interface for <%TYPE%> data type.
 *
 * See the DDS specifications, OMG formal/2015-04-10 and formal/07-01-01,
 * for a description of this interface.
 */
local interface <%TYPE%>DataWriter : ::DDS::DataWriter {
    ::DDS::InstanceHandle_t register_instance(
                in <%SCOPED%> instance);

    ::DDS::InstanceHandle_t register_instance_w_timestamp(
                in <%SCOPED%> instance,
                in ::DDS::Time_t timestamp);

    ::DDS::ReturnCode_t unregister_instance(
                in <%SCOPED%> instance,
                in ::DDS::InstanceHandle_t handle);

    ::DDS::ReturnCode_t unregister_instance_w_timestamp(
                in <%SCOPED%> instance,
                in ::DDS::InstanceHandle_t handle,
                in ::DDS::Time_t timestamp);

    //WARNING: If the handle is non-nil and the instance is not registered
    //         then this operation may cause an access violation.
    //         This lack of safety helps performance.
    ::DDS::ReturnCode_t write(
                in <%SCOPED%> instance_data,
                in ::DDS::InstanceHandle_t handle);

    //WARNING: If the handle is non-nil and the instance is not registered
    //         then this operation may cause an access violation.
    //         This lack of safety helps performance.
    ::DDS::ReturnCode_t write_w_timestamp(
                in <%SCOPED%> instance_data,
                in ::DDS::InstanceHandle_t handle,
                in ::DDS::Time_t source_timestamp);

    ::DDS::ReturnCode_t dispose(
                in <%SCOPED%> instance_data,
                in ::DDS::InstanceHandle_t instance_handle);

    ::DDS::ReturnCode_t dispose_w_timestamp(
                in <%SCOPED%> instance_data,
                in ::DDS::InstanceHandle_t instance_handle,
                in ::DDS::Time_t source_timestamp);

    ::DDS::ReturnCode_t get_key_value(
                inout <%SCOPED%> key_holder,
                in ::DDS::InstanceHandle_t handle);

    ::DDS::InstanceHandle_t lookup_instance(
                in <%SCOPED%> instance_data);
};

/** DataReader interface for <%TYPE%> data type.
 *
 * See the DDS specification, OMG formal/2015-04-10, for a description of
 * this interface.
 */
local interface <%TYPE%>DataReader : OpenDDS::DCPS::DataReaderEx {
    ::DDS::ReturnCode_t read(
                inout <%TYPE%><%SEQ%> received_data,
                inout ::DDS::SampleInfoSeq info_seq,
                in long max_samples,
                in ::DDS::SampleStateMask sample_states,
                in ::DDS::ViewStateMask view_states,
                in ::DDS::InstanceStateMask instance_states);

    ::DDS::ReturnCode_t take(
                inout <%TYPE%><%SEQ%> received_data,
                inout ::DDS::SampleInfoSeq info_seq,
                in long max_samples,
                in ::DDS::SampleStateMask sample_states,
                in ::DDS::ViewStateMask view_states,
                in ::DDS::InstanceStateMask instance_states);

    ::DDS::ReturnCode_t read_w_condition(
                inout <%TYPE%><%SEQ%> data_values,
                inout ::DDS::SampleInfoSeq sample_infos,
                in long max_samples,
                in ::DDS::ReadCondition a_condition);

    ::DDS::ReturnCode_t take_w_condition(
                inout <%TYPE%><%SEQ%> data_values,
                inout ::DDS::SampleInfoSeq sample_infos,
                in long max_samples,
                in ::DDS::ReadCondition a_condition);

    ::DDS::ReturnCode_t read_next_sample(
                inout <%SCOPED%> received_data,
                inout ::DDS::SampleInfo sample_info);

    ::DDS::ReturnCode_t take_next_sample(
                inout <%SCOPED%> received_data,
                inout ::DDS::SampleInfo sample_info);

    ::DDS::ReturnCode_t read_instance(
                inout <%TYPE%><%SEQ%> received_data,
                inout ::DDS::SampleInfoSeq info_seq,
                in long max_samples,
                in ::DDS::InstanceHandle_t a_handle,
                in ::DDS::SampleStateMask sample_states,
                in ::DDS::ViewStateMask view_states,
                in ::DDS::InstanceStateMask instance_states);

    ::DDS::ReturnCode_t take_instance(
                inout <%TYPE%><%SEQ%> received_data,
                inout ::DDS::SampleInfoSeq info_seq,
                in long max_samples,
                in ::DDS::InstanceHandle_t a_handle,
                in ::DDS::SampleStateMask sample_states,
                in ::DDS::ViewStateMask view_states,
                in ::DDS::InstanceStateMask instance_states);

    ::DDS::ReturnCode_t read_instance_w_condition(
                inout <%TYPE%><%SEQ%> received_data,
                inout ::DDS::SampleInfoSeq sample_infos,
                in long max_samples,
                in ::DDS::InstanceHandle_t a_handle,
                in ::DDS::ReadCondition a_condition);

    ::DDS::ReturnCode_t take_instance_w_condition(
                inout <%TYPE%><%SEQ%> received_data,
                inout ::DDS::SampleInfoSeq sample_infos,
                in long max_samples,
                in ::DDS::InstanceHandle_t a_handle,
                in ::DDS::ReadCondition a_condition);

    ::DDS::ReturnCode_t read_next_instance(
                inout <%TYPE%><%SEQ%> received_data,
                inout ::DDS::SampleInfoSeq info_seq,
                in long max_samples,
                in ::DDS::InstanceHandle_t a_handle,
                in ::DDS::SampleStateMask sample_states,
                in ::DDS::ViewStateMask view_states,
                in ::DDS::InstanceStateMask instance_states);

    ::DDS::ReturnCode_t take_next_instance(
                inout <%TYPE%><%SEQ%> received_data,
                inout ::DDS::SampleInfoSeq info_seq,
                in long max_samples,
                in ::DDS::InstanceHandle_t a_handle,
                in ::DDS::SampleStateMask sample_states,
                in ::DDS::ViewStateMask view_states,
                in ::DDS::InstanceStateMask instance_states);

    ::DDS::ReturnCode_t read_next_instance_w_condition(
                inout <%TYPE%><%SEQ%> data_values,
                inout ::DDS::SampleInfoSeq sample_infos,
                in long max_samples,
                in ::DDS::InstanceHandle_t previous_handle,
                in ::DDS::ReadCondition a_condition);

    ::DDS::ReturnCode_t take_next_instance_w_condition(
                inout <%TYPE%><%SEQ%> data_values,
                inout ::DDS::SampleInfoSeq sample_infos,
                in long max_samples,
                in ::DDS::InstanceHandle_t previous_handle,
                in ::DDS::ReadCondition a_condition);

    ::DDS::ReturnCode_t return_loan(
                inout <%TYPE%><%SEQ%> received_data,
                inout ::DDS::SampleInfoSeq info_seq);

    ::DDS::ReturnCode_t get_key_value(
                inout <%SCOPED%> key_holder,
                in ::DDS::InstanceHandle_t handle);

    ::DDS::InstanceHandle_t lookup_instance(
                in <%SCOPED%> instance_data);
};
