LCOV - code coverage report
Current view: top level - elsa/core/Descriptors - RandomBlocksDescriptor.cpp (source / functions) Hit Total Coverage
Test: coverage-all.lcov Lines: 51 51 100.0 %
Date: 2022-08-25 03:05:39 Functions: 8 8 100.0 %

          Line data    Source code
       1             : #include "RandomBlocksDescriptor.h"
       2             : #include "VolumeDescriptor.h"
       3             : #include "Error.h"
       4             : 
       5             : namespace elsa
       6             : {
       7             :     RandomBlocksDescriptor::RandomBlocksDescriptor(
       8             :         const std::vector<std::unique_ptr<DataDescriptor>>& blockDescriptors)
       9             :         : BlockDescriptor{VolumeDescriptor{determineSize(blockDescriptors)}},
      10             :           _blockDescriptors(0),
      11             :           _blockOffsets{blockDescriptors.size()}
      12         132 :     {
      13         132 :         index_t offset = 0;
      14             : 
      15         835 :         for (std::size_t i = 0; i < blockDescriptors.size(); i++) {
      16         703 :             _blockOffsets[static_cast<index_t>(i)] = offset;
      17         703 :             _blockDescriptors.emplace_back(blockDescriptors[i]->clone());
      18         703 :             offset += blockDescriptors[i]->getNumberOfCoefficients();
      19         703 :         }
      20         132 :     }
      21             : 
      22             :     RandomBlocksDescriptor::RandomBlocksDescriptor(
      23             :         std::vector<std::unique_ptr<DataDescriptor>>&& blockDescriptors)
      24             :         : BlockDescriptor{VolumeDescriptor{determineSize(blockDescriptors)}},
      25             :           _blockDescriptors{std::move(blockDescriptors)},
      26             :           _blockOffsets{_blockDescriptors.size()}
      27          28 :     {
      28          28 :         index_t offset = 0;
      29             : 
      30         184 :         for (std::size_t i = 0; i < _blockDescriptors.size(); i++) {
      31         156 :             _blockOffsets[static_cast<index_t>(i)] = offset;
      32         156 :             offset += _blockDescriptors[i]->getNumberOfCoefficients();
      33         156 :         }
      34          28 :     }
      35             : 
      36             :     index_t RandomBlocksDescriptor::getNumberOfBlocks() const
      37          60 :     {
      38          60 :         return static_cast<index_t>(_blockDescriptors.size());
      39          60 :     }
      40             : 
      41             :     const DataDescriptor& RandomBlocksDescriptor::getDescriptorOfBlock(index_t i) const
      42         142 :     {
      43         142 :         if (i < 0 || i >= _blockOffsets.size())
      44           8 :             throw InvalidArgumentError("BlockDescriptor: index i is out of bounds");
      45             : 
      46         134 :         return *_blockDescriptors[static_cast<std::size_t>(i)];
      47         134 :     }
      48             : 
      49             :     index_t RandomBlocksDescriptor::getOffsetOfBlock(index_t i) const
      50         138 :     {
      51         138 :         if (i < 0 || i >= _blockOffsets.size())
      52           4 :             throw InvalidArgumentError("BlockDescriptor: index i is out of bounds");
      53             : 
      54         134 :         return _blockOffsets[i];
      55         134 :     }
      56             : 
      57             :     RandomBlocksDescriptor* RandomBlocksDescriptor::cloneImpl() const
      58          67 :     {
      59          67 :         return new RandomBlocksDescriptor(_blockDescriptors);
      60          67 :     }
      61             : 
      62             :     bool RandomBlocksDescriptor::isEqual(const DataDescriptor& other) const
      63          22 :     {
      64          22 :         if (!BlockDescriptor::isEqual(other))
      65           3 :             return false;
      66             : 
      67             :         // static_cast as type checked in base comparison
      68          19 :         auto otherBlock = static_cast<const RandomBlocksDescriptor*>(&other);
      69             : 
      70          19 :         if (_blockDescriptors.size() != otherBlock->_blockDescriptors.size())
      71           6 :             return false;
      72             : 
      73         136 :         for (std::size_t i = 0; i < _blockDescriptors.size(); ++i)
      74         127 :             if (*_blockDescriptors[i] != *otherBlock->_blockDescriptors[i])
      75           4 :                 return false;
      76             : 
      77          13 :         return true;
      78          13 :     }
      79             : 
      80             :     IndexVector_t RandomBlocksDescriptor::determineSize(
      81             :         const std::vector<std::unique_ptr<DataDescriptor>>& blockDescriptors)
      82         160 :     {
      83         160 :         if (blockDescriptors.empty())
      84           1 :             throw InvalidArgumentError(
      85           1 :                 "RandomBlockDescriptor: list of block descriptors cannot be empty");
      86             : 
      87         159 :         index_t size = 0;
      88             : 
      89         159 :         for (const auto& desc : blockDescriptors)
      90         859 :             size += desc->getNumberOfCoefficients();
      91             : 
      92         159 :         return IndexVector_t::Constant(1, size);
      93         159 :     }
      94             : 
      95             : } // namespace elsa

Generated by: LCOV version 1.14