binary_op.hpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. /*M///////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
  4. //
  5. // By downloading, copying, installing or using the software you agree to this license.
  6. // If you do not agree to this license, do not download, install,
  7. // copy or use the software.
  8. //
  9. //
  10. // License Agreement
  11. // For Open Source Computer Vision Library
  12. //
  13. // Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
  14. // Copyright (C) 2009, Willow Garage Inc., all rights reserved.
  15. // Copyright (C) 2013, OpenCV Foundation, all rights reserved.
  16. // Third party copyrights are property of their respective owners.
  17. //
  18. // Redistribution and use in source and binary forms, with or without modification,
  19. // are permitted provided that the following conditions are met:
  20. //
  21. // * Redistribution's of source code must retain the above copyright notice,
  22. // this list of conditions and the following disclaimer.
  23. //
  24. // * Redistribution's in binary form must reproduce the above copyright notice,
  25. // this list of conditions and the following disclaimer in the documentation
  26. // and/or other materials provided with the distribution.
  27. //
  28. // * The name of the copyright holders may not be used to endorse or promote products
  29. // derived from this software without specific prior written permission.
  30. //
  31. // This software is provided by the copyright holders and contributors "as is" and
  32. // any express or implied warranties, including, but not limited to, the implied
  33. // warranties of merchantability and fitness for a particular purpose are disclaimed.
  34. // In no event shall the Intel Corporation or contributors be liable for any direct,
  35. // indirect, incidental, special, exemplary, or consequential damages
  36. // (including, but not limited to, procurement of substitute goods or services;
  37. // loss of use, data, or profits; or business interruption) however caused
  38. // and on any theory of liability, whether in contract, strict liability,
  39. // or tort (including negligence or otherwise) arising in any way out of
  40. // the use of this software, even if advised of the possibility of such damage.
  41. //
  42. //M*/
  43. #pragma once
  44. #ifndef OPENCV_CUDEV_EXPR_BINARY_OP_HPP
  45. #define OPENCV_CUDEV_EXPR_BINARY_OP_HPP
  46. #include "../common.hpp"
  47. #include "../util/type_traits.hpp"
  48. #include "../ptr2d/traits.hpp"
  49. #include "../ptr2d/transform.hpp"
  50. #include "../ptr2d/gpumat.hpp"
  51. #include "../ptr2d/texture.hpp"
  52. #include "../ptr2d/glob.hpp"
  53. #include "../functional/functional.hpp"
  54. #include "expr.hpp"
  55. namespace cv { namespace cudev {
  56. //! @addtogroup cudev
  57. //! @{
  58. // Binary Operations
  59. #define CV_CUDEV_EXPR_BINOP_INST(op, functor) \
  60. template <typename T> \
  61. __host__ Expr<BinaryTransformPtrSz<typename PtrTraits<GpuMat_<T> >::ptr_type, typename PtrTraits<GpuMat_<T> >::ptr_type, functor<T> > > \
  62. operator op(const GpuMat_<T>& src1, const GpuMat_<T>& src2) \
  63. { \
  64. return makeExpr(transformPtr(src1, src2, functor<T>())); \
  65. } \
  66. template <typename T> \
  67. __host__ Expr<BinaryTransformPtrSz<typename PtrTraits<GpuMat_<T> >::ptr_type, typename PtrTraits<GlobPtrSz<T> >::ptr_type, functor<T> > > \
  68. operator op(const GpuMat_<T>& src1, const GlobPtrSz<T>& src2) \
  69. { \
  70. return makeExpr(transformPtr(src1, src2, functor<T>())); \
  71. } \
  72. template <typename T> \
  73. __host__ Expr<BinaryTransformPtrSz<typename PtrTraits<GlobPtrSz<T> >::ptr_type, typename PtrTraits<GpuMat_<T> >::ptr_type, functor<T> > > \
  74. operator op(const GlobPtrSz<T>& src1, const GpuMat_<T>& src2) \
  75. { \
  76. return makeExpr(transformPtr(src1, src2, functor<T>())); \
  77. } \
  78. template <typename T> \
  79. __host__ Expr<BinaryTransformPtrSz<typename PtrTraits<GpuMat_<T> >::ptr_type, typename PtrTraits<Texture<T> >::ptr_type, functor<T> > > \
  80. operator op(const GpuMat_<T>& src1, const Texture<T>& src2) \
  81. { \
  82. return makeExpr(transformPtr(src1, src2, functor<T>())); \
  83. } \
  84. template <typename T> \
  85. __host__ Expr<BinaryTransformPtrSz<typename PtrTraits<Texture<T> >::ptr_type, typename PtrTraits<GpuMat_<T> >::ptr_type, functor<T> > > \
  86. operator op(const Texture<T>& src1, const GpuMat_<T>& src2) \
  87. { \
  88. return makeExpr(transformPtr(src1, src2, functor<T>())); \
  89. } \
  90. template <typename T, class Body> \
  91. __host__ Expr<BinaryTransformPtrSz<typename PtrTraits<GpuMat_<T> >::ptr_type, typename PtrTraits<Body>::ptr_type, functor<typename LargerType<T, typename PtrTraits<Body>::value_type>::type> > > \
  92. operator op(const GpuMat_<T>& src1, const Expr<Body>& src2) \
  93. { \
  94. return makeExpr(transformPtr(src1, src2.body, functor<typename LargerType<T, typename PtrTraits<Body>::value_type>::type>())); \
  95. } \
  96. template <typename T, class Body> \
  97. __host__ Expr<BinaryTransformPtrSz<typename PtrTraits<Body>::ptr_type, typename PtrTraits<GpuMat_<T> >::ptr_type, functor<typename LargerType<T, typename PtrTraits<Body>::value_type>::type> > > \
  98. operator op(const Expr<Body>& src1, const GpuMat_<T>& src2) \
  99. { \
  100. return makeExpr(transformPtr(src1.body, src2, functor<typename LargerType<T, typename PtrTraits<Body>::value_type>::type>())); \
  101. } \
  102. template <typename T> \
  103. __host__ Expr<UnaryTransformPtrSz<typename PtrTraits<GpuMat_<T> >::ptr_type, Binder2nd< functor<T> > > > \
  104. operator op(const GpuMat_<T>& src, T val) \
  105. { \
  106. return makeExpr(transformPtr(src, bind2nd(functor<T>(), val))); \
  107. } \
  108. template <typename T> \
  109. __host__ Expr<UnaryTransformPtrSz<typename PtrTraits<GpuMat_<T> >::ptr_type, Binder1st< functor<T> > > > \
  110. operator op(T val, const GpuMat_<T>& src) \
  111. { \
  112. return makeExpr(transformPtr(src, bind1st(functor<T>(), val))); \
  113. } \
  114. template <typename T> \
  115. __host__ Expr<BinaryTransformPtrSz<typename PtrTraits<GlobPtrSz<T> >::ptr_type, typename PtrTraits<GlobPtrSz<T> >::ptr_type, functor<T> > > \
  116. operator op(const GlobPtrSz<T>& src1, const GlobPtrSz<T>& src2) \
  117. { \
  118. return makeExpr(transformPtr(src1, src2, functor<T>())); \
  119. } \
  120. template <typename T> \
  121. __host__ Expr<BinaryTransformPtrSz<typename PtrTraits<GlobPtrSz<T> >::ptr_type, typename PtrTraits<Texture<T> >::ptr_type, functor<T> > > \
  122. operator op(const GlobPtrSz<T>& src1, const Texture<T>& src2) \
  123. { \
  124. return makeExpr(transformPtr(src1, src2, functor<T>())); \
  125. } \
  126. template <typename T> \
  127. __host__ Expr<BinaryTransformPtrSz<typename PtrTraits<Texture<T> >::ptr_type, typename PtrTraits<GlobPtrSz<T> >::ptr_type, functor<T> > > \
  128. operator op(const Texture<T>& src1, const GlobPtrSz<T>& src2) \
  129. { \
  130. return makeExpr(transformPtr(src1, src2, functor<T>())); \
  131. } \
  132. template <typename T, class Body> \
  133. __host__ Expr<BinaryTransformPtrSz<typename PtrTraits<GlobPtrSz<T> >::ptr_type, typename PtrTraits<Body>::ptr_type, functor<typename LargerType<T, typename PtrTraits<Body>::value_type>::type> > > \
  134. operator op(const GlobPtrSz<T>& src1, const Expr<Body>& src2) \
  135. { \
  136. return makeExpr(transformPtr(src1, src2.body, functor<typename LargerType<T, typename PtrTraits<Body>::value_type>::type>())); \
  137. } \
  138. template <typename T, class Body> \
  139. __host__ Expr<BinaryTransformPtrSz<typename PtrTraits<Body>::ptr_type, typename PtrTraits<GlobPtrSz<T> >::ptr_type, functor<typename LargerType<T, typename PtrTraits<Body>::value_type>::type> > > \
  140. operator op(const Expr<Body>& src1, const GlobPtrSz<T>& src2) \
  141. { \
  142. return makeExpr(transformPtr(src1.body, src2, functor<typename LargerType<T, typename PtrTraits<Body>::value_type>::type>())); \
  143. } \
  144. template <typename T> \
  145. __host__ Expr<UnaryTransformPtrSz<typename PtrTraits<GlobPtrSz<T> >::ptr_type, Binder2nd< functor<T> > > > \
  146. operator op(const GlobPtrSz<T>& src, T val) \
  147. { \
  148. return makeExpr(transformPtr(src, bind2nd(functor<T>(), val))); \
  149. } \
  150. template <typename T> \
  151. __host__ Expr<UnaryTransformPtrSz<typename PtrTraits<GlobPtrSz<T> >::ptr_type, Binder1st< functor<T> > > > \
  152. operator op(T val, const GlobPtrSz<T>& src) \
  153. { \
  154. return makeExpr(transformPtr(src, bind1st(functor<T>(), val))); \
  155. } \
  156. template <typename T> \
  157. __host__ Expr<BinaryTransformPtrSz<typename PtrTraits<Texture<T> >::ptr_type, typename PtrTraits<Texture<T> >::ptr_type, functor<T> > > \
  158. operator op(const Texture<T>& src1, const Texture<T>& src2) \
  159. { \
  160. return makeExpr(transformPtr(src1, src2, functor<T>())); \
  161. } \
  162. template <typename T, class Body> \
  163. __host__ Expr<BinaryTransformPtrSz<typename PtrTraits<Texture<T> >::ptr_type, typename PtrTraits<Body>::ptr_type, functor<typename LargerType<T, typename PtrTraits<Body>::value_type>::type> > > \
  164. operator op(const Texture<T>& src1, const Expr<Body>& src2) \
  165. { \
  166. return makeExpr(transformPtr(src1, src2.body, functor<typename LargerType<T, typename PtrTraits<Body>::value_type>::type>())); \
  167. } \
  168. template <typename T, class Body> \
  169. __host__ Expr<BinaryTransformPtrSz<typename PtrTraits<Body>::ptr_type, typename PtrTraits<Texture<T> >::ptr_type, functor<typename LargerType<T, typename PtrTraits<Body>::value_type>::type> > > \
  170. operator op(const Expr<Body>& src1, const Texture<T>& src2) \
  171. { \
  172. return makeExpr(transformPtr(src1.body, src2, functor<typename LargerType<T, typename PtrTraits<Body>::value_type>::type>())); \
  173. } \
  174. template <typename T> \
  175. __host__ Expr<UnaryTransformPtrSz<typename PtrTraits<Texture<T> >::ptr_type, Binder2nd< functor<T> > > > \
  176. operator op(const Texture<T>& src, T val) \
  177. { \
  178. return makeExpr(transformPtr(src, bind2nd(functor<T>(), val))); \
  179. } \
  180. template <typename T> \
  181. __host__ Expr<UnaryTransformPtrSz<typename PtrTraits<Texture<T> >::ptr_type, Binder1st< functor<T> > > > \
  182. operator op(T val, const Texture<T>& src) \
  183. { \
  184. return makeExpr(transformPtr(src, bind1st(functor<T>(), val))); \
  185. } \
  186. template <class Body1, class Body2> \
  187. __host__ Expr<BinaryTransformPtrSz<typename PtrTraits<Body1>::ptr_type, typename PtrTraits<Body2>::ptr_type, functor<typename LargerType<typename PtrTraits<Body1>::value_type, typename PtrTraits<Body2>::value_type>::type> > > \
  188. operator op(const Expr<Body1>& a, const Expr<Body2>& b) \
  189. { \
  190. return makeExpr(transformPtr(a.body, b.body, functor<typename LargerType<typename PtrTraits<Body1>::value_type, typename PtrTraits<Body2>::value_type>::type>())); \
  191. } \
  192. template <class Body> \
  193. __host__ Expr<UnaryTransformPtrSz<typename PtrTraits<Body>::ptr_type, Binder2nd< functor<typename Body::value_type> > > > \
  194. operator op(const Expr<Body>& a, typename Body::value_type val) \
  195. { \
  196. return makeExpr(transformPtr(a.body, bind2nd(functor<typename Body::value_type>(), val))); \
  197. } \
  198. template <class Body> \
  199. __host__ Expr<UnaryTransformPtrSz<typename PtrTraits<Body>::ptr_type, Binder1st< functor<typename Body::value_type> > > > \
  200. operator op(typename Body::value_type val, const Expr<Body>& a) \
  201. { \
  202. return makeExpr(transformPtr(a.body, bind1st(functor<typename Body::value_type>(), val))); \
  203. }
  204. CV_CUDEV_EXPR_BINOP_INST(+, plus)
  205. CV_CUDEV_EXPR_BINOP_INST(-, minus)
  206. CV_CUDEV_EXPR_BINOP_INST(*, multiplies)
  207. CV_CUDEV_EXPR_BINOP_INST(/, divides)
  208. CV_CUDEV_EXPR_BINOP_INST(%, modulus)
  209. CV_CUDEV_EXPR_BINOP_INST(==, equal_to)
  210. CV_CUDEV_EXPR_BINOP_INST(!=, not_equal_to)
  211. CV_CUDEV_EXPR_BINOP_INST(>, greater)
  212. CV_CUDEV_EXPR_BINOP_INST(<, less)
  213. CV_CUDEV_EXPR_BINOP_INST(>=, greater_equal)
  214. CV_CUDEV_EXPR_BINOP_INST(<=, less_equal)
  215. CV_CUDEV_EXPR_BINOP_INST(&&, logical_and)
  216. CV_CUDEV_EXPR_BINOP_INST(||, logical_or)
  217. CV_CUDEV_EXPR_BINOP_INST(&, bit_and)
  218. CV_CUDEV_EXPR_BINOP_INST(|, bit_or)
  219. CV_CUDEV_EXPR_BINOP_INST(^, bit_xor)
  220. CV_CUDEV_EXPR_BINOP_INST(<<, bit_lshift)
  221. CV_CUDEV_EXPR_BINOP_INST(>>, bit_rshift)
  222. #undef CV_CUDEV_EXPR_BINOP_INST
  223. //! @}
  224. }}
  225. #endif