LCOV - code coverage report
Current view: top level - core/geom - SPGeom.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 10 10 100.0 %
Date: 2024-05-12 00:16:13 Functions: 32 32 100.0 %

          Line data    Source code
       1             : /**
       2             :  Copyright (c) 2023-2024 Stappler LLC <admin@stappler.dev>
       3             : 
       4             :  Permission is hereby granted, free of charge, to any person obtaining a copy
       5             :  of this software and associated documentation files (the "Software"), to deal
       6             :  in the Software without restriction, including without limitation the rights
       7             :  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
       8             :  copies of the Software, and to permit persons to whom the Software is
       9             :  furnished to do so, subject to the following conditions:
      10             : 
      11             :  The above copyright notice and this permission notice shall be included in
      12             :  all copies or substantial portions of the Software.
      13             : 
      14             :  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
      15             :  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      16             :  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
      17             :  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
      18             :  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
      19             :  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
      20             :  THE SOFTWARE.
      21             :  **/
      22             : 
      23             : #ifndef CORE_GEOM_SPGEOM_H_
      24             : #define CORE_GEOM_SPGEOM_H_
      25             : 
      26             : #include "SPCommon.h"
      27             : 
      28             : namespace STAPPLER_VERSIONIZED stappler::geom {
      29             : 
      30             : namespace {
      31             : 
      32             : template <typename T>
      33             : struct _StructFieldCount {
      34             :         static constexpr size_t Count = T::Dimansions;
      35             : };
      36             : 
      37             : template <>
      38             : struct _StructFieldCount<float> {
      39             :         static constexpr size_t Count = 1;
      40             : };
      41             : 
      42             : template <typename T>
      43             : struct _ApplyTrait {
      44             :         using Bitset = std::bitset<_StructFieldCount<T>::Count>;
      45             : 
      46             :         template <typename Functor>
      47         150 :         static constexpr T apply(const T &t, const Functor &f) {
      48         150 :                 return T(t, f);
      49             :         }
      50             : 
      51             :         template <typename Functor>
      52             :         static constexpr T apply(const T &t1, const T &t2, const Functor &f) {
      53             :                 return T(t1, t2, f);
      54             :         }
      55             : 
      56             :         template <typename Functor>
      57             :         static constexpr Bitset bitop(const T &t, const Functor &f) {
      58             :                 return T::bitop(t, f);
      59             :         }
      60             : 
      61             :         template <typename Functor>
      62             :         static constexpr Bitset bitop(const T &t1, const T &t2, const Functor &f) {
      63             :                 return T::bitop(t1, t2, f);
      64             :         }
      65             : };
      66             : 
      67             : template <>
      68             : struct _ApplyTrait<float> {
      69             :         using Bitset = std::bitset<_StructFieldCount<float>::Count>;
      70             : 
      71             :         template <typename Functor>
      72          50 :         static constexpr float apply(const float &t, const Functor &f) {
      73          50 :                 return f(t);
      74             :         }
      75             : 
      76             :         template <typename Functor>
      77             :         static constexpr float apply(const float &t1, const float &t2, const Functor &f) {
      78             :                 return f(t1, t2);
      79             :         }
      80             : 
      81             :         template <typename Functor>
      82             :         static constexpr Bitset bitop(const float &t, const Functor &f) {
      83             :                 Bitset ret;
      84             :                 ret.set(0, f(t));
      85             :                 return ret;
      86             :         }
      87             : 
      88             :         template <typename Functor>
      89             :         static constexpr Bitset bitop(const float &t1, const float &t2, const Functor &f) {
      90             :                 Bitset ret;
      91             :                 ret.set(0, f(t1, t2));
      92             :                 return ret;
      93             :         }
      94             : };
      95             : 
      96             : }
      97             : 
      98             : template <typename T>
      99             : inline constexpr T fill(float v) {
     100             :         return T::fill(v);
     101             : }
     102             : 
     103             : inline constexpr float fill(float v) {
     104             :         return v;
     105             : }
     106             : 
     107             : template <typename T, typename Functor>
     108         200 : inline constexpr T apply(const T &t, const Functor &f) {
     109         200 :         return _ApplyTrait<T>::apply(t, f);
     110             : }
     111             : 
     112             : template <typename T, typename Functor>
     113             : inline constexpr T apply(const T &t1, const T &t2, const Functor &f) {
     114             :         return _ApplyTrait<T>::apply(t1, t2, f);
     115             : }
     116             : 
     117             : template <typename T, typename Functor>
     118             : inline constexpr auto bitop(const T &t, const Functor &f) -> std::bitset<_StructFieldCount<T>::Count> {
     119             :         return _ApplyTrait<T>::bitop(t, f);
     120             : }
     121             : 
     122             : template <typename T, typename Functor>
     123             : inline constexpr auto bitop(const T &t1, const T &t2, const Functor &f) -> std::bitset<_StructFieldCount<T>::Count> {
     124             :         return _ApplyTrait<T>::bitop(t1, t2, f);
     125             : }
     126             : 
     127             : template <typename T>
     128         100 : inline constexpr T _abs(const T &t) {
     129         350 :         return apply(t, [] (float v) { return std::abs(v); });
     130             : }
     131             : 
     132             : template <typename T>
     133             : inline constexpr T _ceil(const T &t) {
     134             :         return apply(t, [] (float v) { return std::ceil(v); });
     135             : }
     136             : 
     137             : template <typename T>
     138         100 : inline constexpr T _floor(const T &t) {
     139         350 :         return apply(t, [] (float v) { return std::floor(v); });
     140             : }
     141             : 
     142             : template <typename T>
     143             : inline constexpr T _trunc(const T &t) {
     144             :         return apply(t, [] (float v) { return std::trunc(v); });
     145             : }
     146             : 
     147             : template <typename T>
     148             : inline constexpr T _fract(const T &t) {
     149             :         return apply(t, [] (float v) {
     150             :                 float tmp;
     151             :                 return std::modf(v, &tmp);
     152             :         });
     153             : }
     154             : 
     155             : template <typename T>
     156             : inline constexpr T _round(const T &t) {
     157             :         return apply(t, [] (float v) { return std::round(v); });
     158             : }
     159             : 
     160             : template <typename T>
     161             : inline constexpr T _sign(const T &t) {
     162             :         return apply(t, [] (float v) { return std::copysign(1.0f, v); });
     163             : }
     164             : 
     165             : template <typename T>
     166             : inline constexpr T _inversesqrt(const T &t) {
     167             :         return apply(t, [] (float v) { return 1.0f / std::sqrt(v); });
     168             : }
     169             : 
     170             : template <typename T>
     171             : inline constexpr T _max(const T &t1, const T &t2) {
     172             :         return apply(t1, t2, [] (float v1, float v2) { return std::max(v1, v2); });
     173             : }
     174             : 
     175             : template <typename T>
     176             : inline constexpr T _min(const T &t1, const T &t2) {
     177             :         return apply(t1, t2, [] (float v1, float v2) { return std::min(v1, v2); });
     178             : }
     179             : 
     180             : template <typename T>
     181             : inline constexpr T _mod(const T &t1, const T &t2) {
     182             :         return apply(t1, t2, [] (float x, float y) { return x - y * std::floor(x / y); });
     183             : }
     184             : 
     185             : template <typename T>
     186             : inline constexpr T _step(const T &t1, const T &t2) {
     187             :         return apply(t1, t2, [] (float edge, float x) { return (x < edge) ? 0.0f : 1.0f; });
     188             : }
     189             : 
     190             : template <typename T>
     191             : inline constexpr auto _equal(const T &l, const T &r) {
     192             :         return bitop(l, r, [] (float lv, float rv) { return lv == rv; });
     193             : }
     194             : 
     195             : template <typename T>
     196             : inline constexpr auto _greaterThan(const T &l, const T &r) {
     197             :         return bitop(l, r, [] (float lv, float rv) { return lv > rv; });
     198             : }
     199             : 
     200             : template <typename T>
     201             : inline constexpr auto _greaterThanEqual(const T &l, const T &r) {
     202             :         return bitop(l, r, [] (float lv, float rv) { return lv >= rv; });
     203             : }
     204             : 
     205             : template <typename T>
     206             : inline constexpr auto _lessThan(const T &l, const T &r) {
     207             :         return bitop(l, r, [] (float lv, float rv) { return lv < rv; });
     208             : }
     209             : 
     210             : template <typename T>
     211             : inline constexpr auto _lessThanEqual(const T &l, const T &r) {
     212             :         return bitop(l, r, [] (float lv, float rv) { return lv <= rv; });
     213             : }
     214             : 
     215             : template <typename T>
     216             : inline constexpr auto _notEqual(const T &l, const T &r) {
     217             :         return bitop(l, r, [] (float lv, float rv) { return lv != rv; });
     218             : }
     219             : 
     220             : template <typename T>
     221             : inline constexpr auto _isinf(const T &t) {
     222             :         return bitop(t, [] (float v) { return std::isinf(v); });
     223             : }
     224             : 
     225             : template <typename T>
     226             : inline constexpr auto _isnan(const T &t) {
     227             :         return bitop(t, [] (float v) { return std::isnan(v); });
     228             : }
     229             : 
     230             : }
     231             : 
     232             : #endif /* CORE_GEOM_SPGEOM_H_ */

Generated by: LCOV version 1.14