GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: include/pinocchio/utils/static-if.hpp Lines: 17 26 65.4 %
Date: 2024-01-23 21:41:47 Branches: 9 16 56.2 %

Line Branch Exec Source
1
//
2
// Copyright (c) 2019-2020 INRIA
3
//
4
5
#ifndef __pinocchio_utils_static_if_hpp__
6
#define __pinocchio_utils_static_if_hpp__
7
8
#include "pinocchio/fwd.hpp"
9
10
namespace pinocchio
11
{
12
  namespace internal
13
  {
14
15
    enum ComparisonOperators {LT, LE, EQ, GE, GT};
16
17
    template<typename LhsType, typename RhsType, typename ThenType, typename ElseType>
18
    struct if_then_else_impl;
19
20
    /// \brief Template specialization for  similar return types;
21
    template<typename LhsType, typename RhsType, typename return_type>
22
    struct traits< if_then_else_impl<LhsType,RhsType,return_type,return_type> >
23
    {
24
      typedef return_type ReturnType;
25
    };
26
27
    template<typename condition_type, typename ThenType, typename ElseType>
28
    struct if_then_else_impl<condition_type,condition_type,ThenType,ElseType>
29
    {
30
      typedef typename internal::traits<if_then_else_impl>::ReturnType ReturnType;
31
32
383072
      static inline ReturnType run(const ComparisonOperators op,
33
                                   const condition_type & lhs_value,
34
                                   const condition_type & rhs_value,
35
                                   const ThenType & then_value,
36
                                   const ElseType & else_value)
37
      {
38

383072
        switch(op)
39
        {
40
263506
          case LT:
41
263506
            if(lhs_value < rhs_value)
42
116708
              return then_value;
43
            else
44
146798
              return else_value;
45
            break;
46
          case LE:
47
            if(lhs_value <= rhs_value)
48
              return then_value;
49
            else
50
              return else_value;
51
            break;
52
          case EQ:
53
            if(lhs_value == rhs_value)
54
              return then_value;
55
            else
56
              return else_value;
57
            break;
58
42586
          case GE:
59
42586
            if(lhs_value >= rhs_value)
60
32307
              return then_value;
61
            else
62
10279
              return else_value;
63
            break;
64
76980
          case GT:
65
76980
            if(lhs_value > rhs_value)
66
46254
              return then_value;
67
            else
68
30726
              return else_value;
69
            break;
70
        }
71
        abort();
72
      }
73
    };
74
75
    template<typename LhsType, typename RhsType, typename ThenType, typename ElseType>
76
    inline typename if_then_else_impl<LhsType,RhsType,ThenType,ElseType>::ReturnType
77
383072
    if_then_else(const ComparisonOperators op,
78
                 const LhsType & lhs_value,
79
                 const RhsType & rhs_value,
80
                 const ThenType & then_value,
81
                 const ElseType & else_value)
82
    {
83
      typedef if_then_else_impl<LhsType,RhsType,ThenType,ElseType> algo;
84
383072
      return algo::run(op,
85
                       lhs_value,
86
                       rhs_value,
87
                       then_value,
88
383072
                       else_value);
89
    }
90
91
92
93
  } // namespace internal
94
} // namespace pinocchio
95
96
#endif