7 #ifndef IFM3D_FG_Buffer_H
8 #define IFM3D_FG_Buffer_H
14 #include <ifm3d/common/json.hpp>
16 #include <ifm3d/fg/module_frame_grabber.h>
17 #include <ifm3d/device/device.h>
18 #include <ifm3d/fg/buffer_id.h>
105 std::uint32_t cols_{};
107 std::uint32_t rows_{};
109 std::uint32_t nchannel_{};
111 ifm3d::pixel_format data_format_{};
113 std::size_t data_size_in_bytes_{};
117 size_t bytes_per_pixel{};
119 size_t bytes_per_row{};
125 class BufferAllocator;
126 std::shared_ptr<BufferAllocator> buffer_allocator_;
146 Buffer(
const std::uint32_t cols,
147 const std::uint32_t rows,
148 const std::uint32_t nchannel,
149 ifm3d::pixel_format format,
150 const std::optional<ifm3d::json>& metadata = std::nullopt,
153 virtual ~
Buffer() =
default;
171 void create(
const std::uint32_t cols,
172 const std::uint32_t rows,
173 const std::uint32_t nchannel,
174 ifm3d::pixel_format format,
182 std::uint32_t height()
const;
183 std::uint32_t width()
const;
184 std::uint32_t nchannels()
const;
185 ifm3d::pixel_format dataFormat()
const;
196 template <
typename T = std::u
int8_t>
197 T* ptr(
const std::uint32_t row);
202 template <
typename T = std::u
int8_t>
203 T
const* ptr(
const std::uint32_t row)
const;
210 template <
typename T = std::u
int8_t>
211 T* ptr(
const std::uint32_t row,
const std::uint32_t col);
218 template <
typename T = std::u
int8_t>
219 T
const* ptr(
const std::uint32_t row,
const std::uint32_t col)
const;
225 template <
typename T>
226 T& at(
const std::size_t index);
231 template <
typename T>
232 T& at(
const std::uint32_t row,
const std::uint32_t col);
238 template <
typename T>
239 T
const& at(
const std::size_t index)
const;
244 template <
typename T>
245 T
const& at(
const std::uint32_t row,
const std::uint32_t col)
const;
253 template <
typename T>
259 template <
typename T>
262 using iterator_category = std::random_access_iterator_tag;
263 using difference_type = std::ptrdiff_t;
264 using value_type = T;
266 using reference = T&;
269 reference operator*()
const;
270 pointer operator->();
277 return a.m_ptr == b.m_ptr;
283 return a.m_ptr != b.m_ptr;
287 operator-(
const Iterator& rhs)
const noexcept
290 return this->m_ptr - rhs.m_ptr;
298 template <
typename T>
301 template <
typename T>
314 template <
typename T>
328 template <
typename Tp>
337 Buffer_(
const std::uint32_t cols,
338 const std::uint32_t rows,
339 std::optional<ifm3d::json> metadata = std::nullopt);
356 void create(
const std::uint32_t cols,
357 const std::uint32_t rows,
365 std::uint32_t height()
const;
366 std::uint32_t width()
const;
367 std::uint32_t nchannels()
const;
368 ifm3d::pixel_format dataFormat()
const;
374 Tp*
ptr(
const std::uint32_t row);
381 Tp*
ptr(
const std::uint32_t row,
const std::uint32_t col);
387 Tp& at(
const std::size_t index);
392 Tp& at(
const std::uint32_t row,
const std::uint32_t col);
411 template <
typename T,
int n>
415 using value_type = T;
418 template <
typename T>
421 template <
typename T>
428 static_assert(CHAR_BIT *
sizeof(
float) == 32,
"32 bit float required");
437 #include <ifm3d/fg/detail/buffer.hpp>
438 #endif // IFM3D_FG_Buffer_H