// ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- // Copyright (c) 2018-2023 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- #pragma once #include #ifdef __CUDACC__ #define FN_SPECIFIERS inline __host__ __device__ #else #define FN_SPECIFIERS inline #endif namespace open3d { namespace utility { /// Small vector class with some basic arithmetic operations that can be used /// within cuda kernels template struct MiniVec { typedef T Scalar_t; FN_SPECIFIERS MiniVec() {} template FN_SPECIFIERS explicit MiniVec(TInit... as) : arr{as...} {} FN_SPECIFIERS explicit MiniVec(const T* const ptr) { for (int i = 0; i < N; ++i) operator[](i) = ptr[i]; } FN_SPECIFIERS const T operator[](size_t i) const { return arr[i]; } FN_SPECIFIERS T& operator[](size_t i) { return arr[i]; } template FN_SPECIFIERS MiniVec cast() const { MiniVec a; for (int i = 0; i < N; ++i) a[i] = T2(operator[](i)); return a; } FN_SPECIFIERS T dot(const MiniVec& a) const { T result = 0; for (int i = 0; i < N; ++i) result += operator[](i) * a[i]; return result; } FN_SPECIFIERS MiniVec abs() const { MiniVec r; for (int i = 0; i < N; ++i) r[i] = std::abs(operator[](i)); return r; } FN_SPECIFIERS bool all() const { bool result = true; for (int i = 0; i < N && result; ++i) result = result && operator[](i); return result; } FN_SPECIFIERS bool any() const { for (int i = 0; i < N; ++i) if (operator[](i)) return true; return false; } T arr[N]; }; template FN_SPECIFIERS MiniVec floor(const MiniVec& a) { MiniVec r; for (int i = 0; i < N; ++i) r[i] = floorf(a[i]); return r; } template FN_SPECIFIERS MiniVec floor(const MiniVec& a) { MiniVec r; for (int i = 0; i < N; ++i) r[i] = std::floor(a[i]); return r; } template FN_SPECIFIERS MiniVec ceil(const MiniVec& a) { MiniVec r; for (int i = 0; i < N; ++i) r[i] = ceilf(a[i]); return r; } template FN_SPECIFIERS MiniVec ceil(const MiniVec& a) { MiniVec r; for (int i = 0; i < N; ++i) r[i] = std::ceil(a[i]); return r; } template FN_SPECIFIERS MiniVec operator-(const MiniVec& a) { MiniVec r; for (int i = 0; i < N; ++i) r[i] = -a[i]; return r; } template FN_SPECIFIERS MiniVec operator!(const MiniVec& a) { MiniVec r; for (int i = 0; i < N; ++i) r[i] = !a[i]; return r; } #define DEFINE_OPERATOR(op, opas) \ template \ FN_SPECIFIERS MiniVec operator op(const MiniVec& a, \ const MiniVec& b) { \ MiniVec c; \ for (int i = 0; i < N; ++i) c[i] = a[i] op b[i]; \ return c; \ } \ \ template \ FN_SPECIFIERS void operator opas(MiniVec& a, \ const MiniVec& b) { \ for (int i = 0; i < N; ++i) a[i] opas b[i]; \ } \ \ template \ FN_SPECIFIERS MiniVec operator op(const MiniVec& a, T b) { \ MiniVec c; \ for (int i = 0; i < N; ++i) c[i] = a[i] op b; \ return c; \ } \ \ template \ FN_SPECIFIERS MiniVec operator op(T a, const MiniVec& b) { \ MiniVec c; \ for (int i = 0; i < N; ++i) c[i] = a op b[i]; \ return c; \ } \ \ template \ FN_SPECIFIERS void operator opas(MiniVec& a, T b) { \ for (int i = 0; i < N; ++i) a[i] opas b; \ } DEFINE_OPERATOR(+, +=) DEFINE_OPERATOR(-, -=) DEFINE_OPERATOR(*, *=) DEFINE_OPERATOR(/, /=) #undef DEFINE_OPERATOR #define DEFINE_OPERATOR(op) \ template \ FN_SPECIFIERS MiniVec operator op(const MiniVec& a, \ const MiniVec& b) { \ MiniVec c; \ for (int i = 0; i < N; ++i) c[i] = a[i] op b[i]; \ return c; \ } \ \ template \ FN_SPECIFIERS MiniVec operator op(const MiniVec& a, T b) { \ MiniVec c; \ for (int i = 0; i < N; ++i) c[i] = a[i] op b; \ return c; \ } \ \ template \ FN_SPECIFIERS MiniVec operator op(T a, const MiniVec& b) { \ MiniVec c; \ for (int i = 0; i < N; ++i) c[i] = a op b[i]; \ return c; \ } DEFINE_OPERATOR(<) DEFINE_OPERATOR(<=) DEFINE_OPERATOR(>) DEFINE_OPERATOR(>=) DEFINE_OPERATOR(==) DEFINE_OPERATOR(!=) DEFINE_OPERATOR(&&) DEFINE_OPERATOR(||) #undef DEFINE_OPERATOR #undef FN_SPECIFIERS } // namespace utility } // namespace open3d