LCOV - code coverage report
Current view: top level - src - property.cpp (source / functions) Hit Total Coverage
Test: qucs-core-0.0.19 Code Coverage Lines: 56 106 52.8 %
Date: 2015-01-05 16:01:02 Functions: 12 26 46.2 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 18 76 23.7 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * property.cpp - generic property class implementation
       3                 :            :  *
       4                 :            :  * Copyright (C) 2003-2009 Stefan Jahn <stefan@lkcc.org>
       5                 :            :  *
       6                 :            :  * This is free software; you can redistribute it and/or modify
       7                 :            :  * it under the terms of the GNU General Public License as published by
       8                 :            :  * the Free Software Foundation; either version 2, or (at your option)
       9                 :            :  * any later version.
      10                 :            :  *
      11                 :            :  * This software is distributed in the hope that it will be useful,
      12                 :            :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      13                 :            :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14                 :            :  * GNU General Public License for more details.
      15                 :            :  *
      16                 :            :  * You should have received a copy of the GNU General Public License
      17                 :            :  * along with this package; see the file COPYING.  If not, write to
      18                 :            :  * the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
      19                 :            :  * Boston, MA 02110-1301, USA.
      20                 :            :  *
      21                 :            :  * $Id$
      22                 :            :  *
      23                 :            :  */
      24                 :            : 
      25                 :            : #if HAVE_CONFIG_H
      26                 :            : # include <config.h>
      27                 :            : #endif
      28                 :            : 
      29                 :            : #include <stdio.h>
      30                 :            : #include <stdlib.h>
      31                 :            : #include <string.h>
      32                 :            : #include <ctype.h>
      33                 :            : #include <cmath>
      34                 :            : #include <string>
      35                 :            : 
      36                 :            : #include "complex.h"
      37                 :            : #include "variable.h"
      38                 :            : #include "property.h"
      39                 :            : 
      40                 :            : namespace qucs {
      41                 :            : 
      42                 :            : using namespace eqn;
      43                 :            : 
      44                 :            : // Constructor creates an unnamed instance of the property class.
      45                 :          0 : property::property () :
      46                 :            :   name(),
      47 [ #  # ][ #  # ]:          0 :   str()
      48                 :            : {
      49                 :          0 :   type = PROPERTY_UNKNOWN;
      50                 :          0 :   value = 0.0;
      51                 :          0 :   var = NULL;
      52                 :          0 :   next = NULL;
      53                 :          0 :   def = false;
      54                 :          0 : }
      55                 :            : 
      56                 :            : // Constructor creates a named instance of the property class.
      57                 :          0 : property::property (const std::string &n) :
      58                 :            :   name (n),
      59 [ #  # ][ #  # ]:          0 :   str ()
      60                 :            :   {
      61                 :          0 :   type = PROPERTY_UNKNOWN;
      62                 :          0 :   value = 0.0;
      63                 :          0 :   var = NULL;
      64                 :          0 :   next = NULL;
      65                 :          0 :   def = false;
      66                 :          0 : }
      67                 :            : 
      68                 :            : /* This full qualified constructor creates an instance of the property
      69                 :            :    class containing both the key and the value of the property. */
      70                 :        894 : property::property (const std::string &n, const std::string &val) :
      71                 :            :   name (n),
      72 [ +  - ][ #  # ]:        894 :   str(val)
      73                 :            : {
      74                 :        894 :   type = PROPERTY_STR;
      75                 :        894 :   value = 0.0;
      76                 :        894 :   var = NULL;
      77                 :        894 :   next = NULL;
      78                 :        894 :   def = false;
      79                 :        894 : }
      80                 :            : 
      81                 :            : /* This full qualified constructor creates an instance of the property
      82                 :            :    class containing both the key and the value of the property. */
      83                 :      11850 : property::property (const std::string &n, nr_double_t val) :
      84                 :            :   name (n),
      85 [ +  - ][ #  # ]:      11850 :   str()
      86                 :            : {
      87                 :      11850 :   type = PROPERTY_DOUBLE;
      88                 :      11850 :   value = val;
      89                 :      11850 :   var = NULL;
      90                 :      11850 :   next = NULL;
      91                 :      11850 :   def = false;
      92                 :      11850 : }
      93                 :            : 
      94                 :            : /* This full qualified constructor creates an instance of the property
      95                 :            :    class containing both the key and the value of the property. */
      96                 :        113 : property::property (const std::string &n, variable * val) :
      97                 :            :   name (n),
      98 [ +  - ][ #  # ]:        113 :   str ()
      99                 :            : {
     100                 :        113 :   type = PROPERTY_VAR;
     101                 :        113 :   var = val;
     102                 :        113 :   value = 0.0;
     103                 :        113 :   next = NULL;
     104                 :        113 :   def = false;
     105                 :        113 : }
     106                 :            : 
     107                 :            : /* The copy constructor creates a new instance of the property class
     108                 :            :    based on the given property object. */
     109 [ #  # ][ #  # ]:          0 : property::property (const property & p) {
     110                 :          0 :   type = p.type;
     111 [ #  # ][ #  # ]:          0 :   this->name = p.name;
     112 [ #  # ][ #  # ]:          0 :   this->str = p.str;
     113                 :          0 :   value = p.value;
     114                 :          0 :   next = p.next;
     115                 :          0 :   var = p.var;
     116                 :          0 :   def = p.def;
     117                 :          0 : }
     118                 :            : 
     119                 :            : // Destructor deletes the property object.
     120                 :      12857 : property::~property () {
     121                 :            : #if 0 /* FIXME: do this at another code location */
     122                 :            :   if (type == PROPERTY_VAR) {
     123                 :            :     constant * c = var->getConstant ();
     124                 :            :     if (c->getType () == TAG_VECTOR) {
     125                 :            :       delete c;
     126                 :            :       delete var;
     127                 :            :     }
     128                 :            :   }
     129                 :            : #endif
     130 [ -  + ][ #  # ]:      25714 : }
     131                 :            : 
     132                 :            : /* Goes through the chained list of the properties and looks for a
     133                 :            :    property matching the given key and returns its value if possible.
     134                 :            :    If there is no such property the function returns NULL. */
     135                 :   19535881 : property * property::findProperty (const char * const n) {
     136         [ +  - ]:   19535881 :   const std::string tmp = std::string(n);
     137         [ +  + ]:  417799937 :   for (property * p = this; p != NULL; p = p->getNext ())
     138 [ +  - ][ +  - ]:  417206568 :     if (p->getName() == n)
                 [ +  + ]
     139                 :   18942512 :       return p;
     140                 :   19535881 :   return NULL;
     141                 :            : }
     142                 :            : 
     143                 :            : // Short macro in order to obtain the correct constant value.
     144                 :            : #define D(con) ((constant *) (con))->d
     145                 :            : #define S(con) ((constant *) (con))->s
     146                 :            : #define V(con) ((constant *) (con))->v
     147                 :            : 
     148                 :            : // Returns the property's value as vector.
     149                 :       7274 : qucs::vector * property::getVector (void) const {
     150         [ +  - ]:       7274 :   if (var != NULL) {
     151         [ +  - ]:       7274 :     if (var->getType () == VAR_CONSTANT)
     152                 :       7274 :       return V (var->getConstant ());
     153         [ #  # ]:          0 :     else if (var->getType () == VAR_REFERENCE)
     154                 :          0 :       return V (var->getReference()->getResult ());
     155                 :            :   }
     156                 :       7274 :   return NULL;
     157                 :            : }
     158                 :            : 
     159                 :            : // Returns the property's value as string.
     160                 :     112661 : const char * property::getString (void) const {
     161         [ -  + ]:     112661 :   if (var != NULL)
     162                 :          0 :     return S (var->getConstant ());
     163                 :     112661 :   return str.c_str();
     164                 :            : }
     165                 :            : 
     166                 :            : // Returns the property's reference if it is a variable.
     167                 :          0 : const char * property::getReference (void) const {
     168         [ #  # ]:          0 :   if (var != NULL)
     169                 :          0 :     return var->getName ();
     170                 :          0 :   return str.c_str();
     171                 :            : }
     172                 :            : 
     173                 :            : // Returns the property's value as double.
     174                 :   18055727 : nr_double_t property::getDouble (void) const {
     175         [ +  + ]:   18055727 :   if (var != NULL) {
     176         [ +  - ]:     552443 :     if (var->getType () == VAR_CONSTANT)
     177                 :     552443 :       return D (var->getConstant ());
     178         [ #  # ]:          0 :     else if (var->getType () == VAR_REFERENCE)
     179                 :          0 :       return D (var->getReference()->getResult ());
     180                 :            :   }
     181                 :   18055727 :   return value;
     182                 :            : }
     183                 :            : 
     184                 :            : // Returns the property's value as integer.
     185                 :     370805 : int property::getInteger (void) const {
     186         [ -  + ]:     370805 :   if (var != NULL) return (int) std::floor (D (var->getConstant ()));
     187                 :     370805 :   return (int) std::floor (value);
     188                 :            : }
     189                 :            : 
     190                 :            : // Sets the property's value being a double.
     191                 :     363038 : void property::set (const nr_double_t val) {
     192                 :     363038 :   type = PROPERTY_DOUBLE;
     193                 :     363038 :   value = val;
     194                 :     363038 : }
     195                 :            : 
     196                 :            : // Sets the property's value being an integer.
     197                 :          0 : void property::set (const int val) {
     198                 :          0 :   type = PROPERTY_INT;
     199                 :          0 :   value = val;
     200                 :          0 : }
     201                 :            : 
     202                 :            : // Sets the property's value being a variable.
     203                 :          0 : void property::set (variable * const val) {
     204                 :          0 :   type = PROPERTY_VAR;
     205                 :          0 :   var = val;
     206                 :          0 : }
     207                 :            : 
     208                 :            : // Sets the property's value being a string.
     209                 :       8056 : void property::set (const std::string &val) {
     210                 :       8056 :   type = PROPERTY_STR;
     211                 :       8056 :   this->str = val;
     212                 :       8056 : }
     213                 :            : 
     214                 :            : // This function returns a text representation of the property object.
     215                 :          0 : std::string property::toString (void) const {
     216   [ #  #  #  #  :          0 :   switch (type) {
                   #  # ]
     217                 :            :   case PROPERTY_UNKNOWN:
     218         [ #  # ]:          0 :     return "(no such type)";
     219                 :            :     break;
     220                 :            :   case PROPERTY_INT:
     221                 :          0 :     return std::to_string(std::floor(value));
     222                 :            :     break;
     223                 :            :   case PROPERTY_STR:
     224                 :          0 :     return std::string(this->str);
     225                 :            :     break;
     226                 :            :   case PROPERTY_DOUBLE:
     227                 :          0 :     return std::to_string(value);
     228                 :            :     break;
     229                 :            :   case PROPERTY_VAR:
     230         [ #  # ]:          0 :     return var->getName();
     231                 :            :     break;
     232                 :            :   }
     233         [ #  # ]:          0 :   return "";
     234                 :            : }
     235                 :            : 
     236                 :            : } // namespace qucs

Generated by: LCOV version 1.11