AliceVision
Photogrammetric Computer Vision Framework
Container.hpp
1 // This file is part of the AliceVision project.
2 // Copyright (c) 2023 AliceVision contributors.
3 // This Source Code Form is subject to the terms of the Mozilla Public License,
4 // v. 2.0. If a copy of the MPL was not distributed with this file,
5 // You can obtain one at https://mozilla.org/MPL/2.0/.
6 
7 #pragma once
8 
9 #include <aliceVision/numeric/numeric.hpp>
10 
11 namespace aliceVision {
12 
13 template<typename TMat>
14 size_t CountElements(const TMat& A)
15 {
16  static_assert(sizeof(TMat) != sizeof(TMat), "CountElements must be specialized");
17  return 0;
18 }
19 
20 template<>
21 size_t CountElements<Mat2X>(const Mat2X& A);
22 template<>
23 size_t CountElements<Mat3X>(const Mat3X& A);
24 template<>
25 size_t CountElements<Mat>(const Mat& A);
26 template<>
27 size_t CountElements<std::vector<Vec2>>(const std::vector<Vec2>& A);
28 
29 template<typename TMat>
30 size_t ElementSize(const TMat& A)
31 {
32  static_assert(sizeof(TMat) != sizeof(TMat), "CountElements must be specialized");
33  return 0;
34 }
35 
36 template<>
37 size_t ElementSize<Mat2X>(const Mat2X& A);
38 template<>
39 size_t ElementSize<Mat3X>(const Mat3X& A);
40 template<>
41 size_t ElementSize<Mat>(const Mat& A);
42 template<>
43 size_t ElementSize<std::vector<Vec2>>(const std::vector<Vec2>& A);
44 
45 template<typename T>
46 struct Element;
47 
48 template<>
49 struct Element<Mat2X>
50 {
51  typedef Mat2X::ConstColXpr const_type;
52  typedef Mat2X::ColXpr type;
53 
54  static Mat2X create(size_t elementSize, size_t count) { return Mat2X(elementSize, count); }
55 };
56 
57 template<>
58 struct Element<Mat3X>
59 {
60  typedef Mat3X::ConstColXpr const_type;
61  typedef Mat3X::ColXpr type;
62 
63  static Mat3X create(size_t elementSize, size_t count) { return Mat3X(elementSize, count); }
64 };
65 
66 template<>
67 struct Element<Mat>
68 {
69  typedef Mat::ConstColXpr const_type;
70  typedef Mat::ColXpr type;
71 
72  static Mat create(size_t elementSize, size_t count) { return Mat(elementSize, count); }
73 };
74 
75 template<>
76 struct Element<std::vector<Vec2>>
77 {
78  typedef const Vec2& const_type;
79  typedef Vec2& type;
80 
81  static std::vector<Vec2> create(size_t elementSize, size_t count) { return std::vector<Vec2>(count); }
82 };
83 
84 template<typename TMat>
85 typename Element<TMat>::const_type getElement(const TMat& A, size_t index)
86 {
87  static_assert(sizeof(TMat) != sizeof(TMat), "CountElements must be specialized");
88  return 0;
89 }
90 
91 template<typename TMat>
92 typename Element<TMat>::type getElement(TMat& A, size_t index)
93 {
94  static_assert(sizeof(TMat) != sizeof(TMat), "CountElements must be specialized");
95  return 0;
96 }
97 
98 template<>
99 typename Element<Mat2X>::const_type getElement<Mat2X>(const Mat2X& A, size_t index);
100 template<>
101 typename Element<Mat3X>::const_type getElement<Mat3X>(const Mat3X& A, size_t index);
102 template<>
103 typename Element<Mat>::const_type getElement<Mat>(const Mat& A, size_t index);
104 template<>
105 typename Element<std::vector<Vec2>>::const_type getElement<std::vector<Vec2>>(const std::vector<Vec2>& A, size_t index);
106 
107 template<>
108 typename Element<Mat2X>::type getElement<Mat2X>(Mat2X& A, size_t index);
109 template<>
110 typename Element<Mat3X>::type getElement<Mat3X>(Mat3X& A, size_t index);
111 template<>
112 typename Element<Mat>::type getElement<Mat>(Mat& A, size_t index);
113 template<>
114 typename Element<std::vector<Vec2>>::type getElement<std::vector<Vec2>>(std::vector<Vec2>& A, size_t index);
115 
123 template<typename TMat, typename TCols>
124 TMat buildSubsetMatrix(const TMat& A, const TCols& columns)
125 {
126  using T = Element<TMat>;
127  TMat compressed = T::create(ElementSize(A), columns.size());
128  for (std::size_t i = 0; i < static_cast<std::size_t>(columns.size()); ++i)
129  {
130  // check for indices out of range
131  assert(columns[i] < CountElements(A));
132  getElement(compressed, i) = getElement(A, columns[i]);
133  }
134 
135  return compressed;
136 }
137 
138 } // namespace aliceVision
aliceVision::buildSubsetMatrix
TMat buildSubsetMatrix(const TMat &A, const TCols &columns)
It extracts the columns of given indices from the given matrix.
Definition: Container.hpp:124
aliceVision::Element
Definition: Container.hpp:46
aliceVision
Definition: checkerDetector.cpp:32