38#ifndef PCL_IO_IMPL_BUFFERS_HPP
39#define PCL_IO_IMPL_BUFFERS_HPP
56 static float invalid () {
return std::numeric_limits<float>::quiet_NaN (); };
57 static bool is_invalid (
float value) {
return std::isnan (value); };
63 static double invalid () {
return std::numeric_limits<double>::quiet_NaN (); };
64 static bool is_invalid (
double value) {
return std::isnan (value); };
97template <
typename T> T
104template <
typename T>
void
107 assert (data.size () == size_);
108 std::lock_guard<std::mutex> lock (data_mutex_);
115 unsigned char window_size)
117, window_size_ (window_size)
118, midpoint_ (window_size_ / 2)
119, data_current_idx_ (window_size_ - 1)
122 assert (window_size_ > 0);
124 data_.resize (window_size_);
125 for (std::size_t i = 0; i < window_size_; ++i)
128 data_argsort_indices_.resize (
size_);
129 for (std::size_t i = 0; i <
size_; ++i)
131 data_argsort_indices_[i].resize (window_size_);
132 for (std::size_t j = 0; j < window_size_; ++j)
133 data_argsort_indices_[i][j] = j;
136 data_invalid_count_.resize (
size_, window_size_);
144template <
typename T> T
148 int midpoint = (window_size_ - data_invalid_count_[idx]) / 2;
149 return (data_[data_argsort_indices_[idx][
midpoint]][idx]);
152template <
typename T>
void
155 assert (data.size () == size_);
156 std::lock_guard<std::mutex> lock (data_mutex_);
158 if (++data_current_idx_ >= window_size_)
159 data_current_idx_ = 0;
164 for (std::size_t i = 0; i < size_; ++i)
167 const T&
old_value = data_[data_current_idx_][i];
172 std::vector<unsigned char>&
argsort_indices = data_argsort_indices_[i];
177 for (
int j = 0; j < window_size_; ++j)
191 for (
int j = window_size_ - 1; j >= 0; --j)
205 ++data_invalid_count_[i];
207 --data_invalid_count_[i];
211 data_[data_current_idx_].swap (data);
215template <
typename T>
int
228 return a > b ? 1 : -1;
233 unsigned char window_size)
235, window_size_ (window_size)
236, data_current_idx_ (window_size_ - 1)
239 assert (window_size_ > 0);
241 data_.resize (window_size_);
242 for (std::size_t i = 0; i < window_size_; ++i)
245 data_sum_.resize (
size_, 0);
246 data_invalid_count_.resize (
size_, window_size_);
254template <
typename T> T
258 if (data_invalid_count_[idx] == window_size_)
260 return (data_sum_[idx] /
static_cast<T
> (window_size_ - data_invalid_count_[idx]));
263template <
typename T>
void
266 assert (data.size () == size_);
267 std::lock_guard<std::mutex> lock (data_mutex_);
269 if (++data_current_idx_ >= window_size_)
270 data_current_idx_ = 0;
275 for (std::size_t i = 0; i < size_; ++i)
278 const float&
old_value = data_[data_current_idx_][i];
288 ++data_invalid_count_[i];
290 --data_invalid_count_[i];
294 data_[data_current_idx_].swap (data);
Iterator class for point clouds with or without given indices.
void push(std::vector< T > &data) override
Insert a new chunk of data into the buffer.
AverageBuffer(std::size_t size, unsigned char window_size)
Construct a buffer of given size with given running window size.
T operator[](std::size_t idx) const override
Access an element at a given index.
An abstract base class for fixed-size data buffers.
void push(std::vector< T > &data) override
Insert a new chunk of data into the buffer.
T operator[](std::size_t idx) const override
Access an element at a given index.
SingleBuffer(std::size_t size)
Construct a buffer of given size.
Defines all the PCL and non-PCL macros used.
static bool is_invalid(double value)
static bool is_invalid(float value)
static bool is_invalid(T value)