LCOV - code coverage report
Current view: top level - coupling/indexing - CellIndex.cpph (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 16 16
Test Date: 2026-08-21 15:14:06 Functions: 100.0 % 257 257

            Line data    Source code
       1              : // Implementation of coupling::indexing::CellIndex
       2              : 
       3              : namespace coupling {
       4              : namespace indexing {
       5              : 
       6              : template <unsigned int dim, IndexTrait... traits>
       7              : template <IndexTrait... converted_traits>
       8      9615200 : CellIndex<dim, traits...>::operator CellIndex<dim, converted_traits...>() const {
       9              : 
      10              :   // conversion: identical IndexType -> "copy constructor"
      11              :   if constexpr (std::is_same_v<CellIndex, CellIndex<dim, converted_traits...>>) {
      12              :     return CellIndex{_index};
      13              :   }
      14              : 
      15              : #if (COUPLING_MD_ERROR == COUPLING_MD_YES)
      16      9615200 :   if (!IndexingService<dim>::getInstance().isInitialized()) {
      17           16 :     throw std::runtime_error(std::string("coupling::indexing::CellIndex::operator CellIndex(): IndexingService not initialized! (I.e. you attempted to convert "
      18              :                                          "indices before defining their domains)"));
      19              :   }
      20              : #endif
      21              : 
      22              :   // conversion: non-BaseIndex -> BaseIndex
      23              :   if constexpr (std::is_same_v<CellIndex<dim, converted_traits...>, BaseIndex<dim>>) {
      24              :     // convert to vector if neccessary, then add offset, then construct a
      25              :     // BaseIndex from that tarch::la::Vector
      26     10832288 :     return BaseIndex<dim>{convertToVector<dim, traits...>(*this) + CellIndex<dim, traits...>::lowerBoundary.get()};
      27              :   }
      28              : 
      29              :   // conversion: BaseIndex -> non-BaseIndex
      30              :   if constexpr (std::is_same_v<CellIndex, BaseIndex<dim>>) {
      31              :     // convert to scalar if neccessary + construct CellIndex<dim,
      32              :     // converted_traits...>
      33              :     if constexpr ((TraitOperations::is_same<IndexTrait::vector>(converted_traits) or ...)) {
      34      4901160 :       return CellIndex<dim, converted_traits...>{(*this - CellIndex<dim, converted_traits...>::lowerBoundary).get()};
      35              :     } else /* result index is not a vector */ {
      36              :       // get scalar version of i_vec by first constructing a BaseIndex and then
      37              :       // converting it
      38      1293264 :       const unsigned int i_sca{// Get BaseIndex (i.e. traits=vector) and convert that to scalar
      39      1293264 :                                convertToScalar<dim, IndexTrait::vector, converted_traits...>(CellIndex<dim, IndexTrait::vector, converted_traits...>(
      40      3879792 :                                    (*this - CellIndex<dim, converted_traits...>::lowerBoundary).get()))};
      41              : 
      42      1293264 :       return CellIndex<dim, converted_traits...>{i_sca};
      43              :     }
      44              :   }
      45              : 
      46              :   // conversion: non-BaseIndex -> different non-BaseIndex
      47              :   // call this -> BaseIndex conversion
      48      1925552 :   BaseIndex<dim> b{*this};
      49              :   // call BaseIndex -> target index type conversion
      50      1925552 :   return CellIndex<dim, converted_traits...>{b};
      51              : }
      52              : 
      53              : // Overloading operator<< for CellIndex
      54           64 : template <unsigned int dim, IndexTrait... traits> std::ostream& operator<<(std::ostream& os, const CellIndex<dim, traits...>& i) {
      55           64 :   os << i.get();
      56           64 :   return os;
      57              : }
      58              : 
      59              : // Overloading arithmetic operators for CellIndex
      60              : template <unsigned int dim, IndexTrait... traits>
      61              : CellIndex<dim, traits...> operator+(const CellIndex<dim, traits...>& i1, const CellIndex<dim, traits...>& i2) {
      62              :   if constexpr (std::is_same_v<CellIndex<dim, traits...>, BaseIndex<dim>>)
      63              :     return BaseIndex<dim>{i1.get() + i2.get()};
      64              :   else
      65              :     return BaseIndex<dim>{i1} + BaseIndex<dim>{i2};
      66              : }
      67              : 
      68              : template <unsigned int dim, IndexTrait... traits>
      69      2274260 : coupling::indexing::CellIndex<dim, traits...> operator-(const CellIndex<dim, traits...>& i1, const CellIndex<dim, traits...>& i2) {
      70              :   if constexpr (std::is_same_v<CellIndex<dim, traits...>, BaseIndex<dim>>)
      71      9097040 :     return BaseIndex<dim>{i1.get() - i2.get()};
      72              :   else
      73              :     return BaseIndex<dim>{i1} - BaseIndex<dim>{i2};
      74              : }
      75              : 
      76              : template <unsigned int dim, IndexTrait... traits>
      77              : CellIndex<dim, traits...> operator+(const CellIndex<dim, traits...>& i1, const typename CellIndex<dim, traits...>::value_T& raw_i) {
      78              :   return CellIndex<dim, traits...>{i1.get() + raw_i};
      79              : }
      80              : 
      81              : template <unsigned int dim, IndexTrait... traits>
      82              : coupling::indexing::CellIndex<dim, traits...> operator-(const CellIndex<dim, traits...>& i1, const typename CellIndex<dim, traits...>::value_T& raw_i) {
      83              :   return CellIndex<dim, traits...>{i1.get() - raw_i};
      84              : }
      85              : 
      86              : } // namespace indexing
      87              : } // namespace coupling
        

Generated by: LCOV version 2.0-1