LCOV - code coverage report
Current view: top level - algs/Qslim - Heap.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 56 63 88.9 %
Date: 2020-07-01 15:24:36 Functions: 9 9 100.0 %
Branches: 39 56 69.6 %

           Branch data     Line data    Source code
       1                 :            : #include <iostream>
       2                 :            : #include "std.h"
       3                 :            : #include "Heap.hpp"
       4                 :            : #include <string.h> /* for memcpy */
       5                 :            : 
       6                 :            : 
       7                 :     269664 : void Heap::swap(int i,int j)
       8                 :            : {
       9 [ +  - ][ +  - ]:     269664 :     heap_node tmp = ref(i);
      10                 :            : 
      11 [ +  - ][ +  - ]:     269664 :     ref(i) = ref(j);
      12         [ +  - ]:     269664 :     ref(j) = tmp;
      13                 :            : 
      14 [ +  - ][ +  - ]:     269664 :     ref(i).obj->setHeapPos(i);
      15 [ +  - ][ +  - ]:     269664 :     ref(j).obj->setHeapPos(j);
      16                 :     269664 : }
      17                 :            : 
      18                 :     490200 : void Heap::upheap(int i)
      19                 :            : {
      20         [ +  + ]:     490200 :     if( i==0 ) return;
      21                 :            : 
      22         [ +  + ]:     488652 :     if( ref(i).import > ref(parent(i)).import ) {
      23                 :     173820 :         swap(i,parent(i));
      24                 :     173820 :         upheap(parent(i));
      25                 :            :     }
      26                 :            : }
      27                 :            : 
      28                 :     143160 : void Heap::downheap(int i)
      29                 :            : {
      30         [ -  + ]:     143160 :     if (i>=size) return;        // perhaps just extracted the last
      31                 :            : 
      32                 :     143160 :     int largest = i,
      33                 :     143160 :         l = left(i),
      34                 :     143160 :         r = right(i);
      35                 :            : 
      36 [ +  + ][ +  + ]:     143160 :     if( l<size && ref(l).import > ref(largest).import ) largest = l;
                 [ +  + ]
      37 [ +  + ][ +  + ]:     143160 :     if( r<size && ref(r).import > ref(largest).import ) largest = r;
                 [ +  + ]
      38                 :            : 
      39         [ +  + ]:     143160 :     if( largest != i ) {
      40                 :      86568 :         swap(i,largest);
      41                 :      86568 :         downheap(largest);
      42                 :            :     }
      43                 :            : }
      44                 :            : 
      45                 :            : 
      46                 :            : 
      47                 :      91200 : void Heap::insert(Heapable *t,double v)
      48                 :            : {
      49         [ -  + ]:      91200 :     if( size == maxLength() )
      50                 :            :     {
      51                 :          0 :         std::cerr << "NOTE: Growing heap from " << size << " to " << 2*size << std::endl;
      52                 :          0 :         resize(2*size);
      53                 :            :     }
      54                 :            : 
      55                 :      91200 :     int i = size++;
      56                 :            : 
      57                 :      91200 :     ref(i).obj = t;
      58                 :      91200 :     ref(i).import = v;
      59                 :            : 
      60                 :      91200 :     ref(i).obj->setHeapPos(i);
      61                 :            : 
      62                 :      91200 :     upheap(i);
      63                 :      91200 : }
      64                 :            : 
      65                 :     272496 : void Heap::update(Heapable *t,double v)
      66                 :            : {
      67                 :     272496 :     int i = t->getHeapPos();
      68                 :            : 
      69         [ -  + ]:     272496 :     if( i >= size )
      70                 :            :     {
      71                 :          0 :         std::cerr << "WARNING: Attempting to update past end of heap!" << std::endl;
      72                 :          0 :         return;
      73                 :            :     }
      74         [ -  + ]:     272496 :     else if( i == NOT_IN_HEAP )
      75                 :            :     {
      76                 :          0 :         std::cerr << "WARNING: Attempting to update object not in heap!" << std::endl;
      77                 :          0 :         return;
      78                 :            :     }
      79                 :            : 
      80                 :     272496 :     float old=ref(i).import;
      81                 :     272496 :     ref(i).import = v;
      82                 :            : 
      83         [ +  + ]:     272496 :     if( v<old )
      84                 :      48696 :         downheap(i);
      85                 :            :     else
      86                 :     223800 :         upheap(i);
      87                 :            : }
      88                 :            : 
      89                 :            : 
      90                 :            : 
      91                 :       3264 : heap_node *Heap::extract()
      92                 :            : {
      93         [ -  + ]:       3264 :     if( size<1 ) return 0;
      94                 :            : 
      95                 :       3264 :     swap(0,size-1);
      96                 :       3264 :     size--;
      97                 :            : 
      98                 :       3264 :     downheap(0);
      99                 :            : 
     100                 :       3264 :     ref(size).obj->notInHeap();
     101                 :            : 
     102                 :       3264 :     return &ref(size);
     103                 :            : }
     104                 :            : 
     105                 :       6012 : heap_node *Heap::kill(int i)
     106                 :            : {
     107         [ -  + ]:       6012 :     if( i>=size )
     108                 :          0 :         std::cerr << "WARNING: Attempt to delete invalid heap node." << std::endl;
     109                 :            : 
     110                 :       6012 :     swap(i, size-1);
     111                 :       6012 :     size--;
     112                 :       6012 :     ref(size).obj->notInHeap();
     113                 :            : 
     114         [ +  + ]:       6012 :     if( ref(i).import < ref(size).import )
     115                 :       4632 :         downheap(i);
     116                 :            :     else
     117                 :       1380 :         upheap(i);
     118                 :            : 
     119                 :            : 
     120                 :       6012 :     return &ref(size);
     121 [ +  - ][ +  - ]:       1872 : }

Generated by: LCOV version 1.11