LCOV - code coverage report
Current view: top level - utils/meshkit - vectortemplate.hpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 42 58 72.4 %
Date: 2020-07-01 15:24:36 Functions: 36 46 78.3 %
Branches: 70 188 37.2 %

           Branch data     Line data    Source code
       1                 :            : /*!
       2                 :            :  * \class vectortemplate
       3                 :            :  * \brief for engineering style vector starting from 1
       4                 :            :  *
       5                 :            :  **/
       6                 :            : #ifndef __MESHKIT_VECTORTEMPLATE_H__
       7                 :            : #define __MESHKIT_VECTORTEMPLATE_H__
       8                 :            : 
       9                 :            : #include <string>
      10                 :            : #include <iostream>
      11                 :            : #include <cassert>
      12                 :            : #include <stdlib.h>
      13                 :            : 
      14                 :            : // defines the vector template class
      15                 :            : template <class T>
      16                 :            : class CVector
      17                 :            : {
      18                 :            :     private:                      
      19                 :            :         int m_nRows;      // number of rows in the vector
      20                 :            :         T   *m_pCells;    // address where the vector of 
      21                 :            :                           // type T is stored
      22                 :            :         void ErrorHandler (int,int nR=0) const;
      23                 :            :                           // handles error conditions
      24                 :            :         void Release ();  // similar to destructor
      25                 :            :         std::string m_szName;       // vector name
      26                 :            : 
      27                 :            :     public:                     
      28                 :            :         CVector ();                  // default constructor
      29                 :            :         CVector (int);               // constructor
      30                 :            :         CVector (const char*);       // constructor
      31                 :            :         CVector (const char*, int);  // constructor
      32                 :            :         CVector (const CVector<T>&); // copy constructor
      33                 :            :         ~CVector ();                 // destructor
      34                 :            :         void SetSize (int);     // sets the size of the vector 
      35                 :            :                                 // used with the default constructor
      36                 :            : 
      37                 :            :         // helper functions
      38                 :            :         // gets the current size of the vector
      39                 :            :         int GetSize () const;   
      40                 :            :         // gets the vector name
      41                 :            :         void GetName (std::string& szName) const; 
      42                 :            : 
      43                 :            :         // vector manipulations (mutator)
      44                 :            :         void Set (T);           // sets the value of all
      45                 :            :                                 // elements of a vector
      46                 :            :         void SetName (const std::string&); // sets the name of the vector
      47                 :            : 
      48                 :            :         // overloaded operators
      49                 :            :         T& operator() (int);            // row access
      50                 :            :         const T& operator() (int) const;// row access
      51                 :            :         CVector<T>& operator= (const CVector<T>&);  // overloaded = operator
      52                 :            : };
      53                 :            : 
      54                 :            : // =============== definitions ===========================================
      55                 :            : template <class T>
      56                 :        334 : CVector<T>::CVector ()
      57                 :            : // ---------------------------------------------------------------------------
      58                 :            : // Function: default ctor
      59                 :            : // Input:    none
      60                 :            : // Output:   none
      61                 :            : // ---------------------------------------------------------------------------
      62                 :            : {
      63                 :        167 :     m_pCells = NULL; 
      64                 :        167 :     m_nRows = 0;
      65                 :        167 : }
      66                 :            : 
      67                 :            : template <class T>
      68                 :         24 : CVector<T>::CVector (int n)
      69                 :            : // ---------------------------------------------------------------------------
      70                 :            : // Function: overloaded ctor
      71                 :            : // Input:    size of the vector
      72                 :            : // Output:   none
      73                 :            : // ---------------------------------------------------------------------------
      74                 :            : {
      75                 :         12 :     m_pCells = NULL; 
      76                 :         12 :     m_nRows = 0;
      77   [ +  -  #  # ]:         12 :     SetSize (n);
      78                 :         12 : }
      79                 :            : 
      80                 :            : template <class T>
      81                 :            : CVector<T>::CVector (const char* szName)
      82                 :            : // ---------------------------------------------------------------------------
      83                 :            : // Function: overloaded ctor
      84                 :            : // Input:    vector name
      85                 :            : // Output:   none
      86                 :            : // ---------------------------------------------------------------------------
      87                 :            : {
      88                 :            :     m_pCells = NULL; 
      89                 :            :     m_nRows = 0;
      90                 :            :         m_szName = szName;
      91                 :            : }
      92                 :            : 
      93                 :            : template <class T>
      94                 :            : CVector<T>::CVector (const char* szName, int n)
      95                 :            : // ---------------------------------------------------------------------------
      96                 :            : // Function: overloaded ctor
      97                 :            : // Input:    vector name and size
      98                 :            : // Output:   none
      99                 :            : // ---------------------------------------------------------------------------
     100                 :            : {
     101                 :            :     m_pCells = NULL; 
     102                 :            :     m_nRows = 0;
     103                 :            :         m_szName = szName;
     104                 :            :     SetSize (n);
     105                 :            : }
     106                 :            : 
     107                 :            : template <class T>
     108                 :         32 : CVector<T>::CVector (const CVector<T>& A)
     109                 :            : // ---------------------------------------------------------------------------
     110                 :            : // Function: copy ctor
     111                 :            : // Input:    vector
     112                 :            : // Output:   none
     113                 :            : // ---------------------------------------------------------------------------
     114                 :            : {
     115                 :         16 :     m_pCells = NULL; 
     116   [ +  -  +  - ]:         16 :     m_nRows = A.GetSize();
     117 [ +  - ][ +  - ]:         16 :         m_szName = A.m_szName;
     118 [ +  - ][ +  - ]:         16 :     SetSize (m_nRows);
     119 [ +  + ][ +  + ]:         44 :     for (int i=1; i <= m_nRows; i++)
     120         [ +  - ]:          4 :         m_pCells[i] = A.m_pCells[i];
     121                 :         16 : }
     122                 :            : 
     123                 :            : template <class T>
     124                 :         81 : void CVector<T>::SetSize (int nR)
     125                 :            : // ---------------------------------------------------------------------------
     126                 :            : // Function: dynamically allocates memory
     127                 :            : // Input:    vector size
     128                 :            : // Output:   none
     129                 :            : // ---------------------------------------------------------------------------
     130                 :            : {
     131                 :            :     // check whether NR is legal
     132 [ -  + ][ -  + ]:         81 :     if (nR <= 0) ErrorHandler (3);
         [ -  + ][ -  + ]
                 [ -  + ]
     133                 :         81 :     Release ();
     134 [ +  - ][ +  - ]:        177 :     try {m_pCells = new T [nR + 1];}
         [ +  - ][ +  - ]
         [ +  - ][ +  + ]
           [ #  #  +  - ]
         [ +  + ][ +  - ]
         [ +  + ][ #  # ]
                 [ #  # ]
           [ #  #  +  - ]
         [ +  - ][ +  - ]
           [ #  #  #  # ]
         [ #  # ][ +  - ]
         [ +  - ][ +  - ]
                 [ +  + ]
           [ #  #  +  - ]
                 [ +  - ]
     135   [ #  #  #  #  :          0 :     catch (std::bad_alloc) {ErrorHandler (1);}
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                      # ]
     136                 :         81 :     m_nRows = nR;
     137                 :            : #ifdef __RGGMETER
     138                 :            :     m_dAllocated += static_cast<double>(sizeof(T)*(nR+1));
     139                 :            : #endif
     140 [ #  # ][ #  # ]:         81 : }
         [ #  # ][ #  # ]
                 [ #  # ]
     141                 :            : 
     142                 :            : template <class T>
     143                 :        195 : CVector<T>::~CVector ()
     144                 :            : // ---------------------------------------------------------------------------
     145                 :            : // Function: dtor
     146                 :            : // Input:    none
     147                 :            : // Output:   none
     148                 :            : // ---------------------------------------------------------------------------
     149                 :            : {
     150                 :            :     // deallocate storage
     151                 :        195 :     Release ();
     152                 :        195 : }
     153                 :            : 
     154                 :            : template <class T>
     155                 :        276 : void CVector<T>::Release ()
     156                 :            : // ---------------------------------------------------------------------------
     157                 :            : // Function: dynamically deallocates memory
     158                 :            : // Input:    none
     159                 :            : // Output:   none
     160                 :            : // ---------------------------------------------------------------------------
     161                 :            : {
     162                 :            :     // deallocate storage
     163 [ +  + ][ +  + ]:        276 :     if (m_pCells != NULL)
         [ +  + ][ +  + ]
                 [ +  + ]
     164                 :            :     {
     165 [ +  - ][ +  - ]:        177 :         delete [] m_pCells;
         [ +  + ][ +  - ]
            [ +  + ][ # ]
            [ #  # ][ - ]
         [ +  + ][ +  - ]
            [ +  + ][ # ]
                 [ #  # ]
     166                 :            : #ifdef __RGGMETER
     167                 :            :         m_dDeAllocated += static_cast<double>(sizeof(T)*(m_nRows+1));
     168                 :            : #endif
     169                 :         81 :         m_pCells = NULL; 
     170                 :         81 :         m_nRows = 0;
     171                 :            :     }
     172                 :        276 : }
     173                 :            : 
     174                 :            : // =============== member functions ===========================================
     175                 :            : template <class T>
     176                 :            : void CVector<T>::SetName (const std::string& szName) 
     177                 :            : // ---------------------------------------------------------------------------
     178                 :            : // Function: sets the name of the vector
     179                 :            : // Input:    vector name
     180                 :            : // Output:   none
     181                 :            : // ---------------------------------------------------------------------------
     182                 :            : {
     183                 :            :     m_szName = szName;
     184                 :            : }
     185                 :            : 
     186                 :            : template <class T>
     187                 :            : void CVector<T>::GetName (std::string& szName) const
     188                 :            : // ---------------------------------------------------------------------------
     189                 :            : // Function: gets the name of the vector
     190                 :            : // Input:    string to hold vector name
     191                 :            : // Output:   vector name
     192                 :            : // ---------------------------------------------------------------------------
     193                 :            : {
     194                 :            :     szName = m_szName;
     195                 :            : }
     196                 :            : 
     197                 :            : template <class T>
     198                 :            : void CVector<T>::Set (T dV)
     199                 :            : // ---------------------------------------------------------------------------
     200                 :            : // Function: sets the value of all the elements in the vector to the
     201                 :            : //           specified value
     202                 :            : // Input:    specified value
     203                 :            : // Output:   none
     204                 :            : // ---------------------------------------------------------------------------
     205                 :            : {
     206                 :            :     for (int i=1; i <= m_nRows; i++) 
     207                 :            :         m_pCells[i] = dV;
     208                 :            : }
     209                 :            : 
     210                 :            : template <class T>
     211                 :         71 : int CVector<T>::GetSize () const
     212                 :            : // ---------------------------------------------------------------------------
     213                 :            : // Function: gets the size of the vector
     214                 :            : // Input:    none
     215                 :            : // Output:   returns the size
     216                 :            : // ---------------------------------------------------------------------------
     217                 :            : {
     218                 :         71 :     return m_nRows;
     219                 :            : }
     220                 :            : 
     221                 :            : // ==================== Overloaded Operators ========================
     222                 :            : #ifdef _DEBUG
     223                 :            : template <class T>
     224                 :            : T& CVector<T>::operator() (int nR)  // T& is reference
     225                 :            : // ---------------------------------------------------------------------------
     226                 :            : // Function: overloaded () operator to access vector contents
     227                 :            : //           carries out bound checking
     228                 :            : // Input:    index or location
     229                 :            : // Output:   value at the specified index
     230                 :            : // ---------------------------------------------------------------------------
     231                 :            : {
     232                 :            :     // row-column reference in bounds?
     233                 :            :     if (nR <= 0 || nR > m_nRows)
     234                 :            :     {
     235                 :            :         ErrorHandler (2,nR);
     236                 :            :         return m_pCells[1];
     237                 :            :     }
     238                 :            :     else
     239                 :            :         return m_pCells[nR];
     240                 :            : }
     241                 :            : #else
     242                 :            : template <class T>
     243                 :        506 : inline T& CVector<T>::operator() (int nR)
     244                 :            : // ---------------------------------------------------------------------------
     245                 :            : // Function: overloaded () operator to access vector contents
     246                 :            : // Input:    index or location
     247                 :            : // Output:   value at the specified index
     248                 :            : // ---------------------------------------------------------------------------
     249                 :            : {
     250                 :        506 :     return m_pCells[nR];
     251                 :            : }
     252                 :            : #endif
     253                 :            : 
     254                 :            : #ifdef _DEBUG
     255                 :            : template <class T>
     256                 :            : const T& CVector<T>::operator() (int nR) const
     257                 :            : // ---------------------------------------------------------------------------
     258                 :            : // Function: overloaded () operator to access vector contents
     259                 :            : // Input:    index or location
     260                 :            : // Output:   value at the specified index
     261                 :            : // ---------------------------------------------------------------------------
     262                 :            : {
     263                 :            :     // row-column reference in bounds?
     264                 :            :     if (nR <= 0 || nR > m_nRows) {
     265                 :            :         ErrorHandler (2,nR);
     266                 :            :         return m_pCells[1];
     267                 :            :     }
     268                 :            :     else
     269                 :            :         return m_pCells[nR];
     270                 :            : }
     271                 :            : #else
     272                 :            : template <class T>
     273                 :            : inline const T& CVector<T>::operator() (int nR) const
     274                 :            : // ---------------------------------------------------------------------------
     275                 :            : // Function: overloaded () operator to access vector contents
     276                 :            : // Input:    index or location
     277                 :            : // Output:   value at the specified index
     278                 :            : // ---------------------------------------------------------------------------
     279                 :            : {
     280                 :            :     return m_pCells[nR];
     281                 :            : }
     282                 :            : #endif
     283                 :            : 
     284                 :            : template <class T>
     285                 :        192 : CVector<T>& CVector<T>::operator= (const CVector& matarg)
     286                 :            : // ---------------------------------------------------------------------------
     287                 :            : // Function: overloaded = operator 
     288                 :            : // Input:    vector to use as rvalue
     289                 :            : // Output:   modified values
     290                 :            : // ---------------------------------------------------------------------------
     291                 :            : {
     292                 :            :     // check whether vector is assigned to itself
     293 [ +  - ][ +  - ]:        192 :     if (this != &matarg)
     294                 :            :     {
     295                 :            :         // compatible vectors?
     296 [ -  + ][ -  + ]:        192 :         if (m_nRows != matarg.m_nRows)
     297                 :            :         {
     298                 :          0 :             ErrorHandler (4);
     299                 :          0 :             return *this;
     300                 :            :         }
     301                 :            :         // now copy
     302 [ #  # ][ +  + ]:        528 :         for (int i=1; i <= matarg.m_nRows; i++)
                 [ +  + ]
     303                 :         48 :             m_pCells[i] = matarg.m_pCells[i];
     304                 :            :     }
     305                 :            : 
     306                 :        192 :     return *this;
     307                 :            : }
     308                 :            : 
     309                 :            : // ==================== Error Handler ========================
     310                 :            : template <class T>
     311                 :          0 : void CVector<T>::ErrorHandler (int nErrorCode, int nR) const
     312                 :            : // ---------------------------------------------------------------------------
     313                 :            : // Function: channels error message via std:err
     314                 :            : // Input:    error code and optional int value
     315                 :            : // Output:   none
     316                 :            : // ---------------------------------------------------------------------------
     317                 :            : {
     318                 :          0 :     std::cerr << "CVector::Vector Name: " << m_szName << ".\n";
     319   [ #  #  #  #  :          0 :     switch (nErrorCode)
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                      # ]
     320                 :            :     {
     321                 :            :         case 1:
     322                 :          0 :             std::cerr << "Memory allocation failure.\n";
     323                 :          0 :         break;
     324                 :            :         case 2:
     325                 :          0 :             std::cerr << "Row index is out of bounds.\n";
     326                 :          0 :         break;
     327                 :            :         case 3:
     328                 :          0 :             std::cerr << "Constructor. Invalid number of rows "
     329                 :            :                          "or columns.\n";
     330                 :          0 :         break;
     331                 :            :         case 4:
     332                 :          0 :             std::cerr << "Constructor. Incompatible vectors.\n";
     333                 :          0 :         break;
     334                 :            :     }
     335                 :          0 :     std::cerr << "Unable to populate vectors." << std::endl;
     336                 :          0 :     exit (1);
     337                 :            : }
     338                 :            : 
     339                 :            : #endif

Generated by: LCOV version 1.11