1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
|
#ifndef _CONTENTFILTEREDTOPICEXAMPLE_MYCUSTOMFILTER_HPP_
#define _CONTENTFILTEREDTOPICEXAMPLE_MYCUSTOMFILTER_HPP_
#include <fastcdr/Cdr.h>
#include <fastdds/dds/topic/IContentFilter.hpp>
//! Custom filter class
//! It requieres two parameters 'low_mark_' and 'high_mark_'.
//! Filter samples which index is lower than 'low_mark_' and higher than 'high_mark_'.
class MyCustomFilter : public eprosima::fastdds::dds::IContentFilter
{
public:
/**
* @brief Construct a new MyCustomFilter object
*
* @param low_mark
* @param high_mark
*/
MyCustomFilter(
int low_mark,
int high_mark)
: low_mark_(low_mark)
, high_mark_(high_mark)
{
}
//! Destructor
virtual ~MyCustomFilter() = default;
/**
* @brief Evaluate filter discriminating whether the sample is relevant or not, i.e. whether it meets the filtering
* criteria
*
* @param payload Serialized sample
* @return true if sample meets filter requirements. false otherwise.
*/
bool evaluate(
const SerializedPayload& payload,
const FilterSampleInfo& /*sample_info*/,
const GUID_t& /*reader_guid*/) const override
{
// Deserialize the `index` field from the serialized sample.
eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload.data), payload.length);
eprosima::fastcdr::Cdr deser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN,
eprosima::fastcdr::Cdr::DDS_CDR);
// Deserialize encapsulation.
deser.read_encapsulation();
uint32_t index = 0;
// Deserialize `index` field.
try
{
deser >> index;
}
catch (eprosima::fastcdr::exception::NotEnoughMemoryException& /*exception*/)
{
return false;
}
// Custom filter: reject samples where index > low_mark_ and index < high_mark_.
if (index < low_mark_ || index > high_mark_)
{
return true;
}
return false;
}
private:
//! Low mark: lower threshold below which the samples are relevant
uint32_t low_mark_ = 0;
//! High mark: upper threshold over which the samples are relevant
uint32_t high_mark_ = 0;
};
#endif // _CONTENTFILTEREDTOPICEXAMPLE_MYCUSTOMFILTER_HPP_
|