7#include "../exception.hpp"
8#include "../shims/stdtype_traits.hpp"
9#include "../shims/stdvariant.hpp"
22 using AccessVariant = variant<ArrayAccess, LinearAccessData, Vpat>;
25 using RowVariant = variant<ArrayAccess::Row, LinearAccessData::Row, Vpat::Row>;
28 using ColumnVariant = variant<ArrayAccess::Column, LinearAccessData::Column, Vpat::Column>;
37 template <
class FITER>
38 bool AllValid(FITER first, FITER last);
54 static_assert(K > 1,
"CVB: empty or single plane scatter access not allowed");
57 using Variant = Internal::AccessVariant;
63 static Variant MoveTo(
const Variant &planeAccess,
const Cvb::Rect<int> newAoi)
65 return visit([newAoi](
auto access) {
return Variant{access.NewMoved(newAoi)}; }, planeAccess);
68 template <
size_t... INDICES>
69 ScatterAccess<K> NewMoved(
const Cvb::Rect<int> newAoi, std::index_sequence<INDICES...>)
const noexcept
71 return ScatterAccess<K>{MoveTo(planeAccesses_[INDICES], newAoi)...};
74 static const void *At(
const Variant &planeAccess,
int x,
int y)
noexcept
76 return visit([x, y](
auto access) {
return access(x, y); }, planeAccess);
79 template <
size_t... INDICES>
85 static void *At(Variant &planeAccess,
int x,
int y)
noexcept
87 return visit([x, y](
auto access) {
return access(x, y); }, planeAccess);
90 template <
size_t... INDICES>
96 static const void *At(
const Variant &planeAccess,
int idx)
noexcept
98 return visit([idx](
auto access) {
return access[idx]; }, planeAccess);
101 template <
size_t... INDICES>
107 static void *At(Variant &planeAccess,
int idx)
noexcept
109 return visit([idx](
auto access) {
return access[idx]; }, planeAccess);
112 template <
size_t... INDICES>
120 std::enable_if_t<!conjunction<std::is_same<remove_cvref_t<ACCESSES>, ScatterAccess<K>>...>::value,
int> = 0>
121 explicit ScatterAccess(ACCESSES &&...planeAccesses)
122 : planeAccesses_{{planeAccesses...}}
124 static_assert(
sizeof...(ACCESSES) == K,
"CVB: plane initialization must match plane count K");
138 template <
class... ACCESSES>
139 static ScatterAccess<K>
FromAccess(ACCESSES &&...planeAccesses)
142 return ScatterAccess<K>{Variant(planeAccesses)...};
139 static ScatterAccess<K>
FromAccess(ACCESSES &&...planeAccesses) {
…}
146 : planeAccesses_(other.planeAccesses_)
151 ScatterAccess &operator=(
const ScatterAccess &other)
noexcept
155 planeAccesses_ = other.planeAccesses_;
160 ScatterAccess(ScatterAccess &&other)
noexcept =
default;
161 ScatterAccess &operator=(ScatterAccess &&other)
noexcept =
default;
162 ~ScatterAccess() =
default;
185 return NewMoved(newAoi, std::make_index_sequence<K>{});
196 return Internal::AllValid(planeAccesses_.begin(), planeAccesses_.end());
200 explicit operator bool() const noexcept
200 explicit operator bool() const noexcept {
…}
217 return At(x, y, std::make_index_sequence<K>{});
232 return At(x, y, std::make_index_sequence<K>{});
246 return At(idx, std::make_index_sequence<K>{});
260 return At(idx, std::make_index_sequence<K>{});
269 friend class ScatterAccess;
273 static Internal::RowVariant RowAt(
const Variant &planeAccess,
int y)
275 return visit([y](
auto access) {
return Internal::RowVariant{access.RowAt(y)}; }, planeAccess);
278 template <
size_t... INDICES>
279 explicit Row(
const ScatterAccess<K> &parent,
int y, std::index_sequence<INDICES...>)
280 : rows_{{RowAt(parent.planeAccesses_[INDICES], y)...}}
285 explicit Row(
const ScatterAccess<K> &parent,
int y)
286 :
Row(parent, y, std::make_index_sequence<K>{})
290 static const void *ColumnAt(
const Internal::RowVariant &row,
int x)
292 return visit([x](
auto rowAccess) {
return rowAccess[x]; }, row);
295 static void *ColumnAt(Internal::RowVariant &row,
int x)
297 return visit([x](
auto rowAccess) {
return rowAccess[x]; }, row);
300 template <
size_t... INDICES>
306 template <
size_t... INDICES>
316 Row(const Row &other) = default;
317 Row &operator=(const Row &other) = default;
318 Row(Row &&other) noexcept = default;
319 Row &operator=(Row &&other) noexcept = default;
331 std::array<
void *, K> operator[](
int x) noexcept
333 return ColumnAt(x, std::make_index_sequence<K>{});
331 std::array<
void *, K> operator[](
int x) noexcept {
…}
347 return ColumnAt(x, std::make_index_sequence<K>{});
359 return Row{*
this, y};
368 friend class ScatterAccess;
372 static Internal::ColumnVariant ColumnAt(
const Variant &planeAccess,
int x)
374 return visit([x](
auto access) {
return Internal::ColumnVariant{access.ColumnAt(x)}; }, planeAccess);
377 template <
size_t... INDICES>
378 explicit Column(
const ScatterAccess<K> &parent,
int x, std::index_sequence<INDICES...>)
379 : columns_{{ColumnAt(parent.planeAccesses_[INDICES], x)...}}
384 explicit Column(
const ScatterAccess<K> &parent,
int x)
385 :
Column(parent, x, std::make_index_sequence<K>{})
389 static const void *RowAt(
const Internal::ColumnVariant &column,
int y)
391 return visit([y](
auto colAccess) {
return colAccess[y]; }, column);
394 static void *RowAt(Internal::ColumnVariant &column,
int y)
396 return visit([y](
auto colAccess) {
return colAccess[y]; }, column);
399 template <
size_t... INDICES>
405 template <
size_t... INDICES>
415 Column(const Column &other) = default;
416 Column &operator=(const Column &other) = default;
417 Column(Column &&other) noexcept = default;
418 Column &operator=(Column &&other) noexcept = default;
430 std::array<
void *, K> operator[](
int y) noexcept
432 return RowAt(y, std::make_index_sequence<K>{});
430 std::array<
void *, K> operator[](
int y) noexcept {
…}
446 return RowAt(y, std::make_index_sequence<K>{});
52 class ScatterAccess {
…};
469 template <
class... ACCESSES>
482 using Variant = Internal::AccessVariant;
497 template <
class FITER>
499 : planeAccesses_(first, last)
501 if (planeAccesses_.size() <= 1)
512 : planeAccesses_(std::move(planeAccesses))
514 if (planeAccesses_.size() <= 1)
518 template <
class... ACCESSES>
519 static ScatterAccess<Dynamic>
FromAccess(ACCESSES &&...planeAccesses)
521 return ScatterAccess<Dynamic>{{Variant(planeAccesses)...}};
524 ScatterAccess(
const ScatterAccess &other)
525 : planeAccesses_(other.planeAccesses_)
530 ScatterAccess &operator=(
const ScatterAccess &other)
534 planeAccesses_ = other.planeAccesses_;
539 ScatterAccess(ScatterAccess &&other)
noexcept =
default;
540 ScatterAccess &operator=(ScatterAccess &&other)
noexcept =
default;
541 ~ScatterAccess() =
default;
550 return planeAccesses_.size();
562 ScatterAccess<Dynamic> NewMoved(
const Cvb::Rect<int> newAoi)
const
564 std::vector<Variant> newMoved;
565 newMoved.reserve(planeAccesses_.size());
566 for (
const auto &planeAccess : planeAccesses_)
568 visit([&newMoved, newAoi](
auto access) { newMoved.emplace_back(access.NewMoved(newAoi)); }, planeAccess);
571 return ScatterAccess<Dynamic>{std::move(newMoved)};
580 bool Valid() const noexcept
582 return Internal::AllValid(planeAccesses_.begin(), planeAccesses_.end());
586 explicit operator bool() const noexcept
601 std::vector<const void *>
operator()(
int x,
int y)
const noexcept
603 std::vector<const void *> pixAddresses;
604 pixAddresses.reserve(planeAccesses_.size());
605 for (
const auto &planeAccess : planeAccesses_)
607 pixAddresses.emplace_back(
visit([x, y](
auto access) {
return access(x, y); }, planeAccess));
623 std::vector<void *>
operator()(
int x,
int y)
noexcept
625 std::vector<void *> pixAddresses;
626 pixAddresses.reserve(planeAccesses_.size());
627 for (
auto &planeAccess : planeAccesses_)
629 pixAddresses.emplace_back(
visit([x, y](
auto access) {
return access(x, y); }, planeAccess));
643 std::vector<const void *>
operator[](
int idx)
const noexcept
645 std::vector<const void *> pixAddresses;
646 pixAddresses.reserve(planeAccesses_.size());
647 for (
auto &planeAccess : planeAccesses_)
649 pixAddresses.emplace_back(
visit([idx](
auto access) {
return access[idx]; }, planeAccess));
664 std::vector<void *>
operator[](
int idx)
noexcept
666 std::vector<void *> pixAddresses;
667 pixAddresses.reserve(planeAccesses_.size());
668 for (
auto &planeAccess : planeAccesses_)
670 pixAddresses.emplace_back(
visit([idx](
auto access) {
return access[idx]; }, planeAccess));
682 friend class ScatterAccess;
684 std::vector<Internal::RowVariant> rows_;
686 explicit Row(
const ScatterAccess<Dynamic> &parent,
int y)
688 rows_.reserve(parent.planeAccesses_.size());
689 for (
const auto &planeAccess : parent.planeAccesses_)
691 visit([
this, y](
auto access) { rows_.emplace_back(access.RowAt(y)); }, planeAccess);
697 Row() noexcept = default;
699 Row(const Row &other) = default;
700 Row &operator=(const Row &other) = default;
701 Row(Row &&other) noexcept = default;
702 Row &operator=(Row &&other) noexcept = default;
714 std::vector<
void *> operator[](
int x) noexcept
716 std::vector<void *> pixel;
717 pixel.reserve(rows_.size());
719 for (
auto &row : rows_)
721 pixel.emplace_back(
visit([x](
auto rowAccess) {
return rowAccess[x]; }, row));
736 std::vector<const void *>
operator[](
int x)
const noexcept
738 std::vector<const void *> pixel;
739 pixel.reserve(rows_.size());
741 for (
auto &row : rows_)
743 pixel.emplace_back(
visit([x](
auto rowAccess) {
return rowAccess[x]; }, row));
758 return Row{*
this, y};
767 friend class ScatterAccess;
769 std::vector<Internal::ColumnVariant> columns_;
771 explicit Column(
const ScatterAccess<Dynamic> &parent,
int x)
773 columns_.reserve(parent.planeAccesses_.size());
774 for (
const auto &planeAccess : parent.planeAccesses_)
776 visit([
this, x](
auto access) { columns_.emplace_back(access.ColumnAt(x)); }, planeAccess);
782 Column() noexcept = default;
784 Column(const Column &other) = default;
785 Column &operator=(const Column &other) = default;
786 Column(Column &&other) noexcept = default;
787 Column &operator=(Column &&other) noexcept = default;
799 std::vector<
void *> operator[](
int y) noexcept
801 std::vector<void *> pixel;
802 pixel.reserve(columns_.size());
804 for (
auto &column : columns_)
806 pixel.emplace_back(
visit([y](
auto colAccess) {
return colAccess[y]; }, column));
821 std::vector<const void *>
operator[](
int y)
const noexcept
823 std::vector<const void *> pixel;
824 pixel.reserve(columns_.size());
826 for (
auto &column : columns_)
828 pixel.emplace_back(
visit([y](
auto colAccess) {
return colAccess[y]; }, column));
Access trait for contiguous linear CVB image planes.
Definition decl_array_access.hpp:27
Linear access properties.
Definition decl_linear_access.hpp:25
Rectangle object.
Definition rect.hpp:24
A single column.
Definition decl_scatter_access.hpp:367
Column() noexcept=default
Default ctor of invalid Column.
std::array< const void *, K > operator[](int y) const noexcept
Value access.
Definition decl_scatter_access.hpp:444
std::array< void *, K > operator[](int y) noexcept
Value access.
Definition decl_scatter_access.hpp:430
A single row.
Definition decl_scatter_access.hpp:268
std::array< const void *, K > operator[](int x) const noexcept
Value access.
Definition decl_scatter_access.hpp:345
Row() noexcept=default
Default ctor of invalid row.
std::array< void *, K > operator[](int x) noexcept
Value access.
Definition decl_scatter_access.hpp:331
Access trait for multiple, possibly scattered planes.
Definition decl_scatter_access.hpp:53
std::array< void *, K > operator()(int x, int y) noexcept
Coordinate pixel access operator.
Definition decl_scatter_access.hpp:230
constexpr size_t PlanesCount() const
Gets the number of planes stored.
Definition decl_scatter_access.hpp:169
Row RowAt(int y) const
Gets the Row at line y.
Definition decl_scatter_access.hpp:357
static ScatterAccess< K > FromAccess(ACCESSES &&...planeAccesses)
Creates a ScatterAccess from the given access planes.
Definition decl_scatter_access.hpp:139
bool Valid() const noexcept
Gets whether the aggregated access objects are all valid.
Definition decl_scatter_access.hpp:194
std::array< const void *, K > operator[](int idx) const noexcept
Index pixel access operator.
Definition decl_scatter_access.hpp:244
std::array< void *, K > operator[](int idx) noexcept
Index pixel access operator.
Definition decl_scatter_access.hpp:258
std::array< const void *, K > operator()(int x, int y) const noexcept
Coordinate pixel access operator.
Definition decl_scatter_access.hpp:215
Column ColumnAt(int x) const
Gets the Column at x.
Definition decl_scatter_access.hpp:456
ScatterAccess< K > NewMoved(const Cvb::Rect< int > newAoi) const noexcept
Creates a new, moved scatter access object.
Definition decl_scatter_access.hpp:183
auto MakeStaticScatterAccess(ACCESSES &&...planeAccesses) -> ScatterAccess< sizeof...(ACCESSES)>
Creates a static scatter access with the given planes.
Definition decl_scatter_access.hpp:470
Virtual Pixel Access Table.
Definition decl_vpat.hpp:24
Root namespace for the Image Manager interface.
Definition c_bayer_to_rgb.h:17
auto visit(VISITOR &&visitor, VARIANT &&var) -> decltype(visitor(get< 0 >(var)))
Visits the given Shims::variant var. Cvb::Shims::visit can only visit one variant (not multiple like ...
Definition variant.hpp:622
static const constexpr int Dynamic
Use with ScatterAccess for runtime variable number of planes.
Definition decl_scatter_access.hpp:42