\r
__device__ int idx_high(int i) const \r
{\r
- return last - abs(i - last);\r
+ return last - abs(last - i);\r
}\r
\r
__device__ int idx(int i) const\r
{\r
- return i <= last ? idx_low(i) : idx_high(i);\r
+ return abs(idx_high(i));\r
}\r
\r
bool is_range_safe(int mini, int maxi) const \r
int step;\r
};\r
\r
+\r
+ struct BrdReplicate\r
+ {\r
+ BrdReplicate(int len) : last(len - 1) {}\r
+\r
+ __device__ int idx_low(int i) const\r
+ {\r
+ return max(i, 0);\r
+ }\r
+\r
+ __device__ int idx_high(int i) const \r
+ {\r
+ return min(i, last);\r
+ }\r
+\r
+ __device__ int idx(int i) const\r
+ {\r
+ return min(max(i, last), 0);\r
+ }\r
+\r
+ bool is_range_safe(int mini, int maxi) const \r
+ {\r
+ return true;\r
+ }\r
+\r
+ int last;\r
+ };\r
+\r
+\r
+ template <typename T>\r
+ struct BrdRowReplicate: BrdReplicate\r
+ {\r
+ BrdRowReplicate(int len) : BrdReplicate(len) {}\r
+\r
+ __device__ float at_low(int i, const T* data) const \r
+ {\r
+ return data[idx_low(i)];\r
+ }\r
+\r
+ __device__ float at_high(int i, const T* data) const \r
+ {\r
+ return data[idx_high(i)];\r
+ }\r
+ };\r
+\r
+\r
+ template <typename T>\r
+ struct BrdColReplicate: BrdReplicate\r
+ {\r
+ BrdColReplicate(int len, int step) : BrdReplicate(len), step(step) {}\r
+\r
+ __device__ float at_low(int i, const T* data) const \r
+ {\r
+ return data[idx_low(i) * step];\r
+ }\r
+\r
+ __device__ float at_high(int i, const T* data) const \r
+ {\r
+ return data[idx_high(i) * step];\r
+ }\r
+\r
+ int step;\r
+ };\r
+\r
}}
\ No newline at end of file