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 44#pragma once 45 46#ifndef __OPENCV_CUDEV_PTR2D_ZIP_HPP__ 47#define __OPENCV_CUDEV_PTR2D_ZIP_HPP__ 48 49#include "../common.hpp" 50#include "../util/tuple.hpp" 51#include "traits.hpp" 52 53namespace cv { namespace cudev { 54 55//! @addtogroup cudev 56//! @{ 57 58template <class PtrTuple> struct ZipPtr; 59 60template <class Ptr0, class Ptr1> struct ZipPtr< tuple<Ptr0, Ptr1> > : tuple<Ptr0, Ptr1> 61{ 62 typedef tuple<typename PtrTraits<Ptr0>::value_type, 63 typename PtrTraits<Ptr1>::value_type> value_type; 64 typedef typename PtrTraits<Ptr0>::index_type index_type; 65 66 __host__ __device__ __forceinline__ ZipPtr() {} 67 __host__ __device__ __forceinline__ ZipPtr(const tuple<Ptr0, Ptr1>& t) : tuple<Ptr0, Ptr1>(t) {} 68 69 __device__ __forceinline__ value_type operator ()(index_type y, index_type x) const 70 { 71 return make_tuple(cv::cudev::get<0>(*this)(y, x), cv::cudev::get<1>(*this)(y, x)); 72 } 73}; 74 75template <class Ptr0, class Ptr1, class Ptr2> struct ZipPtr< tuple<Ptr0, Ptr1, Ptr2> > : tuple<Ptr0, Ptr1, Ptr2> 76{ 77 typedef tuple<typename PtrTraits<Ptr0>::value_type, 78 typename PtrTraits<Ptr1>::value_type, 79 typename PtrTraits<Ptr2>::value_type> value_type; 80 typedef typename PtrTraits<Ptr0>::index_type index_type; 81 82 __host__ __device__ __forceinline__ ZipPtr() {} 83 __host__ __device__ __forceinline__ ZipPtr(const tuple<Ptr0, Ptr1, Ptr2>& t) : tuple<Ptr0, Ptr1, Ptr2>(t) {} 84 85 __device__ __forceinline__ value_type operator ()(index_type y, index_type x) const 86 { 87 return make_tuple(cv::cudev::get<0>(*this)(y, x), cv::cudev::get<1>(*this)(y, x), cv::cudev::get<2>(*this)(y, x)); 88 } 89}; 90 91template <class Ptr0, class Ptr1, class Ptr2, class Ptr3> struct ZipPtr< tuple<Ptr0, Ptr1, Ptr2, Ptr3> > : tuple<Ptr0, Ptr1, Ptr2, Ptr3> 92{ 93 typedef tuple<typename PtrTraits<Ptr0>::value_type, 94 typename PtrTraits<Ptr1>::value_type, 95 typename PtrTraits<Ptr2>::value_type, 96 typename PtrTraits<Ptr3>::value_type> value_type; 97 typedef typename PtrTraits<Ptr0>::index_type index_type; 98 99 __host__ __device__ __forceinline__ ZipPtr() {} 100 __host__ __device__ __forceinline__ ZipPtr(const tuple<Ptr0, Ptr1, Ptr2, Ptr3>& t) : tuple<Ptr0, Ptr1, Ptr2, Ptr3>(t) {} 101 102 __device__ __forceinline__ value_type operator ()(index_type y, index_type x) const 103 { 104 return make_tuple(cv::cudev::get<0>(*this)(y, x), cv::cudev::get<1>(*this)(y, x), cv::cudev::get<2>(*this)(y, x), cv::cudev::get<3>(*this)(y, x)); 105 } 106}; 107 108template <class PtrTuple> struct ZipPtrSz : ZipPtr<PtrTuple> 109{ 110 int rows, cols; 111 112 __host__ __device__ __forceinline__ ZipPtrSz() {} 113 __host__ __device__ __forceinline__ ZipPtrSz(const PtrTuple& t) : ZipPtr<PtrTuple>(t) {} 114}; 115 116template <class Ptr0, class Ptr1> 117__host__ ZipPtrSz< tuple<typename PtrTraits<Ptr0>::ptr_type, typename PtrTraits<Ptr1>::ptr_type> > 118zipPtr(const Ptr0& ptr0, const Ptr1& ptr1) 119{ 120 const int rows = getRows(ptr0); 121 const int cols = getCols(ptr0); 122 123 CV_Assert( getRows(ptr1) == rows && getCols(ptr1) == cols ); 124 125 ZipPtrSz< tuple<typename PtrTraits<Ptr0>::ptr_type, typename PtrTraits<Ptr1>::ptr_type> > 126 z(make_tuple(shrinkPtr(ptr0), shrinkPtr(ptr1))); 127 z.rows = rows; 128 z.cols = cols; 129 130 return z; 131} 132 133template <class Ptr0, class Ptr1, class Ptr2> 134__host__ ZipPtrSz< tuple<typename PtrTraits<Ptr0>::ptr_type, typename PtrTraits<Ptr1>::ptr_type, typename PtrTraits<Ptr2>::ptr_type> > 135zipPtr(const Ptr0& ptr0, const Ptr1& ptr1, const Ptr2& ptr2) 136{ 137 const int rows = getRows(ptr0); 138 const int cols = getCols(ptr0); 139 140 CV_Assert( getRows(ptr1) == rows && getCols(ptr1) == cols ); 141 CV_Assert( getRows(ptr2) == rows && getCols(ptr2) == cols ); 142 143 ZipPtrSz< tuple<typename PtrTraits<Ptr0>::ptr_type, typename PtrTraits<Ptr1>::ptr_type, typename PtrTraits<Ptr2>::ptr_type> > 144 z(make_tuple(shrinkPtr(ptr0), shrinkPtr(ptr1), shrinkPtr(ptr2))); 145 z.rows = rows; 146 z.cols = cols; 147 148 return z; 149} 150 151template <class Ptr0, class Ptr1, class Ptr2, class Ptr3> 152__host__ ZipPtrSz< tuple<typename PtrTraits<Ptr0>::ptr_type, typename PtrTraits<Ptr1>::ptr_type, typename PtrTraits<Ptr2>::ptr_type, typename PtrTraits<Ptr3>::ptr_type> > 153zipPtr(const Ptr0& ptr0, const Ptr1& ptr1, const Ptr2& ptr2, const Ptr3& ptr3) 154{ 155 const int rows = getRows(ptr0); 156 const int cols = getCols(ptr0); 157 158 CV_Assert( getRows(ptr1) == rows && getCols(ptr1) == cols ); 159 CV_Assert( getRows(ptr2) == rows && getCols(ptr2) == cols ); 160 CV_Assert( getRows(ptr3) == rows && getCols(ptr3) == cols ); 161 162 ZipPtrSz< tuple<typename PtrTraits<Ptr0>::ptr_type, typename PtrTraits<Ptr1>::ptr_type, typename PtrTraits<Ptr2>::ptr_type, typename PtrTraits<Ptr3>::ptr_type> > 163 z(make_tuple(shrinkPtr(ptr0), shrinkPtr(ptr1), shrinkPtr(ptr2), shrinkPtr(ptr3))); 164 z.rows = rows; 165 z.cols = cols; 166 167 return z; 168} 169 170template <class PtrTuple> struct PtrTraits< ZipPtrSz<PtrTuple> > : PtrTraitsBase<ZipPtrSz<PtrTuple>, ZipPtr<PtrTuple> > 171{ 172}; 173 174//! @} 175 176}} 177 178#endif 179