VCCC  2024.05
VisualCamp Common C++ library
cv_vec.hpp
Go to the documentation of this file.
1 # /*
2 # * Created by YongGyu Lee on 2020/12/08.
3 # */
4 #
5 # ifndef VCCC_TYPE_SUPPORT_OPENCV_CV_VEC_HPP
6 # define VCCC_TYPE_SUPPORT_OPENCV_CV_VEC_HPP
7 #
8 # include <tuple>
9 # include <type_traits>
10 # include <utility>
11 #
12 # include "opencv2/opencv.hpp"
13 #
15 
16 
22 namespace vccc {
23 namespace internal {
24 
25 template<size_t I, bool size_check>
26 struct get_cv_vec;
27 
28 template<size_t I>
29 struct get_cv_vec<I, true> {
30  template<typename T, int cn> static constexpr T& get( cv::Vec<T, cn>& v) noexcept { return v[I]; }
31  template<typename T, int cn> static constexpr const T& get(const cv::Vec<T, cn>& v) noexcept { return v[I]; }
32  template<typename T, int cn> static constexpr T&& get( cv::Vec<T, cn>&& v) noexcept { return std::move(v[I]); }
33  template<typename T, int cn> static constexpr const T&& get(const cv::Vec<T, cn>&& v) noexcept { return std::move(v[I]); }
34 };
35 
36 template<size_t I, typename T, int n>
37 struct tuple_element_impl<I, cv::Vec<T, n>, true> {
38  using type = T;
39 };
40 
41 } // namespace internal
42 } // namespace vccc
43 
44 namespace std {
45 
52 template<typename T, int cn>
53 struct tuple_size<cv::Vec<T, cn>> : std::integral_constant<size_t, cn> {};
56 
63 template<size_t I, typename T, int cn>
64 struct tuple_element<I, cv::Vec<T, cn>> : vccc::internal::tuple_element_impl<I, cv::Vec<T, cn>, (I < cn)> {};
67 
68 
75 template<std::size_t i, typename T, int n>
76 constexpr inline tuple_element_t<i, cv::Vec<T, n>>&
77 get(cv::Vec<T, n>& vec) {
78  return vec[i];
79 }
80 
81 template<std::size_t i, typename T, int n>
82 constexpr inline const tuple_element_t<i, cv::Vec<T, n>>&
83 get(const cv::Vec<T, n>& vec) {
84  return vec[i];
85 }
86 
87 template<std::size_t i, typename T, int n>
88 constexpr inline tuple_element_t<i, cv::Vec<T, n>>&&
89 get(cv::Vec<T, n>&& vec) {
90  return std::move(vec[i]);
91 }
92 
93 template<std::size_t i, typename T, int n>
94 constexpr inline const tuple_element_t<i, cv::Vec<T, n>>&&
95 get(const cv::Vec<T, n>&& vec) {
96  return std::move(vec[i]);
97 }
98 
100 
101 } // namespace std
102 
103 namespace vccc {
104 
107 template<typename T, int cn, typename N>
108 cv::Vec<T, cn> add(const cv::Vec<T, cn>& vec, N n)
109 {
110  auto copy = vec;
111  for(int i=0; i<cn; ++i)
112  copy[i] += n;
113  return copy;
114 }
115 
116 } // namespace vccc
117 
119 
120 # endif // VCCC_TYPE_SUPPORT_OPENCV_CV_VEC_HPP
constexpr variant_alternative_t< I, variant< Types... > > & get(variant< Types... > &v)
Definition: variant.hpp:770
Definition: matrix.hpp:495
Definition: directory.h:12