LTP GCOV extension - code coverage report
Current view: directory - src/cpp/dev/idlc - float_value.cpp
Test: YAORB-0.2.info
Date: 2006-02-27 Instrumented lines: 129
Code covered: 74.4 % Executed lines: 96

       1                 : //==============================================================================
       2                 : // File <$/src/cpp/dev/idlc/float_value.cpp>
       3                 : // This file is part of YaOrb : Yet Another Object Request Broker,
       4                 : // Copyright (c) 2000-2003, 2006, Marc Alff.
       5                 : //
       6                 : // This program is free software; you can redistribute it and/or
       7                 : // modify it under the terms of the GNU General Public License
       8                 : // as published by the Free Software Foundation; either version 2
       9                 : // of the License, or (at your option) any later version.
      10                 : //
      11                 : // This program 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 program; if not, write to the Free Software
      18                 : // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
      19                 : //
      20                 : //==============================================================================
      21                 : 
      22                 : #include "src/cpp/prod/tool/Assert.h"
      23                 : 
      24                 : #include "src/cpp/dev/idlc/arith.h"
      25                 : #include "src/cpp/dev/idlc/float_value.h"
      26                 : 
      27                 : typedef void (*convertFn)(IDLFloatValue*) ;
      28                 : 
      29               8 : static void nop(IDLFloatValue*)
      30                 : {}
      31                 : 
      32                 : // Matrix, line 0 : F32_to_XXX
      33                 : 
      34               0 : static void F32_to_F64(IDLFloatValue* v)
      35                 : {
      36               0 :    double v2 = v->GetF32() ;
      37               0 :    v->PutF64(v2) ;
      38                 : }
      39                 : 
      40               0 : static void F32_to_F96(IDLFloatValue* v)
      41                 : {
      42                 :    long double v2 ;
      43               0 :    v2 = v->GetF32() ;
      44               0 :    v->PutF96(v2) ;
      45                 : }
      46                 : 
      47                 : // Matrix, line 1 : F64_to_XXX
      48                 : 
      49               0 : static void F64_to_F32(IDLFloatValue* v)
      50                 : {
      51               0 :    float v2 = v->GetF64() ;
      52               0 :    v->PutF32(v2) ;
      53                 : }
      54                 : 
      55               0 : static void F64_to_F96(IDLFloatValue* v)
      56                 : {
      57                 :    long double v2 ;
      58               0 :    v2 = v->GetF64() ;
      59               0 :    v->PutF96(v2) ;
      60                 : }
      61                 : 
      62                 : // Matrix, line 2 : F96_to_XXX
      63                 : 
      64               8 : static void F96_to_F32(IDLFloatValue* v)
      65                 : {
      66               8 :    float v2 = v->GetF96() ;
      67               8 :    v->PutF32(v2) ;
      68                 : }
      69                 : 
      70              11 : static void F96_to_F64(IDLFloatValue* v)
      71                 : {
      72              11 :    double v2 = v->GetF96() ;
      73              11 :    v->PutF64(v2) ;
      74                 : }
      75                 : 
      76              54 : static int index(IDLFloatType_e type)
      77                 : {
      78              54 :    switch(type)
      79                 :    {
      80                 :       case idl_float :
      81                 :       {
      82                 :          return 0 ;
      83                 :       }
      84                 :       case idl_double :
      85                 :       {
      86                 :          return 1 ;
      87                 :       }
      88                 :       case idl_long_double :
      89                 :       {
      90                 :          return 2 ;
      91                 :       }
      92                 :    }
      93                 : 
      94                 :    ASSERT(false) ;
      95                 :    return 0 ;
      96                 : }
      97                 : 
      98                 : static convertFn convertMatrix[3][3] =
      99                 : {
     100                 :    {nop        , F32_to_F64 , F32_to_F96},
     101                 :    {F64_to_F32 , nop        , F64_to_F96},
     102                 :    {F96_to_F32, F96_to_F64, nop       }
     103                 : } ;
     104                 : 
     105              39 : IDLFloatValue::IDLFloatValue()
     106                 : : IDLValue(idl_floatType),
     107                 :    _type(idl_float),
     108                 :    _value_f32(0.0),
     109                 :    _value_f64(0.0),
     110              39 :    _value_f96()
     111                 : {
     112                 : }
     113                 : 
     114              27 : IDLFloatValue::IDLFloatValue(const IDLFloatValue& v)
     115                 : : IDLValue(idl_floatType),
     116                 :    _type(v._type),
     117                 :    _value_f32(v._value_f32),
     118                 :    _value_f64(v._value_f64),
     119              27 :    _value_f96(v._value_f96)
     120                 : {
     121                 : }
     122                 : 
     123               0 : IDLFloatValue& IDLFloatValue::operator = (const IDLFloatValue& v)
     124                 : {
     125               0 :    _type = v._type ;
     126                 : 
     127               0 :    _value_f32 = v._value_f32 ;
     128               0 :    _value_f64 = v._value_f64 ;
     129               0 :    _value_f96 = v._value_f96 ;
     130                 : 
     131                 :    return *this ;
     132                 : }
     133                 : 
     134              60 : IDLFloatValue::~IDLFloatValue()
     135              60 : {}
     136                 : 
     137               0 : IDLFloatType_e IDLFloatValue::GetType(void) const
     138                 : {
     139                 :    return _type ;
     140                 : }
     141                 : 
     142               0 : IDLType* IDLFloatValue::GetValueType(void) const
     143                 : {
     144               0 :    switch(_type)
     145                 :    {
     146                 :       case idl_float :
     147                 :       {
     148               0 :          static IDLFloatType t(idl_float) ;
     149                 :          return &t ;
     150                 :       }
     151                 :       case idl_double :
     152                 :       {
     153               0 :          static IDLFloatType t(idl_double) ;
     154                 :          return &t ;
     155                 :       }
     156                 :       case idl_long_double :
     157                 :       {
     158               0 :          static IDLFloatType t(idl_long_double) ;
     159                 :          return &t ;
     160                 :       }
     161                 :    } ;
     162                 : 
     163                 :    // Never executed : to please the compiler
     164                 :    ASSERT(false) ;
     165                 :    return NULL ;
     166                 : }
     167                 : 
     168              12 : void IDLFloatValue::PutF32(float v)
     169                 : {
     170              12 :    _type = idl_float ;
     171              12 :    _value_f32 = v ;
     172                 : }
     173                 : 
     174              15 : void IDLFloatValue::PutF64(double v)
     175                 : {
     176              15 :    _type = idl_double ;
     177              15 :    _value_f64 = v ;
     178                 : }
     179                 : 
     180              31 : void IDLFloatValue::PutF96(long double v)
     181                 : {
     182              31 :    _type = idl_long_double ;
     183              31 :    _value_f96 = v ;
     184                 : }
     185                 : 
     186               0 : float IDLFloatValue::GetF32(void) const
     187                 : {
     188                 :    ASSERT(_type == idl_float) ;
     189                 :    return _value_f32 ;
     190                 : }
     191                 : 
     192               3 : double IDLFloatValue::GetF64(void) const
     193                 : {
     194                 :    ASSERT(_type == idl_double) ;
     195                 :    return _value_f64 ;
     196                 : }
     197                 : 
     198              19 : long double IDLFloatValue::GetF96(void) const
     199                 : {
     200                 :    ASSERT(_type == idl_long_double) ;
     201                 :    return _value_f96 ;
     202                 : }
     203                 : 
     204              12 : void IDLFloatValue::print(std::ostream &str) const
     205                 : {
     206                 :    char buff[80] ;
     207                 : 
     208              12 :    switch(_type)
     209                 :    {
     210                 :       case idl_float :
     211                 :       {
     212               4 :          sprintf(buff, "%f", _value_f32) ;
     213               4 :          break ;
     214                 :       }
     215                 :       case idl_double :
     216                 :       {
     217               4 :          sprintf(buff, "%g", _value_f64) ;
     218               4 :          break ;
     219                 :       }
     220                 :       case idl_long_double :
     221                 :       {
     222               4 :          NON_DEV("f96 print") ;
     223               4 :          sprintf(buff, "FIXME f96 print") ;
     224                 :          // sprintf(buff, "%Lf", _value_f96) ;
     225                 :          break ;
     226                 :       }
     227                 :    }
     228                 : 
     229              12 :    str << buff ;
     230                 : }
     231                 : 
     232              27 : void IDLFloatValue::convert(IDLType *type)
     233                 : {
     234                 :    ASSERT(type != NULL) ;
     235                 : 
     236              27 :    if (type->isA() == idl_floatType)
     237                 :    {
     238                 :       IDLFloatType *type2 = (IDLFloatType*) type ;
     239                 : 
     240              27 :       int lign = index(_type) ;
     241              54 :       int column = index(type2->GetType()) ;
     242                 :       convertFn fct = convertMatrix[lign][column] ;
     243                 : 
     244                 :       ASSERT(fct != NULL) ;
     245              27 :       (*fct) (this) ;
     246                 :    }
     247                 :    else
     248                 :    {
     249               0 :       if (type->isA() != idl_errorType)
     250                 :       {
     251               0 :          typeConvertionError(type) ;
     252                 :       }
     253                 :    }
     254                 : }
     255                 : 
     256              27 : IDLValue* IDLFloatValue::copy(void)
     257                 : {
     258              27 :    return new IDLFloatValue(*this) ;
     259                 : }
     260                 : 
     261               3 : IDLValue* IDLFloatValue::computeAdd(const IDLValue* v)
     262                 : {
     263               3 :    IDLFloatValue *result = new IDLFloatValue() ;
     264                 :    IDLFloatValue *v2 = NULL ;
     265                 :    bool overflow = false ;
     266                 : 
     267                 :    ASSERT(v->isA() == idl_floatType) ;
     268               3 :    v2 = (IDLFloatValue*) v ;
     269                 :    ASSERT(v2->GetType() == _type) ;
     270                 : 
     271               3 :    switch (_type)
     272                 :    {
     273                 :       case idl_float :
     274                 :       {
     275                 :          float r ;
     276               1 :          overflow = add_f32(_value_f32, v2->_value_f32, & r) ;
     277               1 :          result->PutF32(r) ;
     278               1 :          break ;
     279                 :       }
     280                 :       case idl_double :
     281                 :       {
     282                 :          double r ;
     283               1 :          overflow = add_f64(_value_f64, v2->_value_f64, & r) ;
     284               1 :          result->PutF64(r) ;
     285               1 :          break ;
     286                 :       }
     287                 :       case idl_long_double :
     288                 :       {
     289                 :          long double r ;
     290               1 :          overflow = add_f96(_value_f96, v2->_value_f96, & r) ;
     291               1 :          result->PutF96(r) ;
     292                 :          break ;
     293                 :       }
     294                 :    }
     295                 : 
     296               3 :    if (overflow)
     297                 :    {
     298               0 :       result->SetError() ;
     299                 :    }
     300                 :    return result ;
     301                 : }
     302                 : 
     303               3 : IDLValue* IDLFloatValue::computeSub(const IDLValue* v)
     304                 : {
     305               3 :    IDLFloatValue *result = new IDLFloatValue() ;
     306                 :    IDLFloatValue *v2 = NULL ;
     307                 :    bool overflow = false ;
     308                 : 
     309                 :    ASSERT(v->isA() == idl_floatType) ;
     310               3 :    v2 = (IDLFloatValue*) v ;
     311                 :    ASSERT(v2->GetType() == _type) ;
     312                 : 
     313               3 :    switch (_type)
     314                 :    {
     315                 :       case idl_float :
     316                 :       {
     317                 :          float r ;
     318               1 :          overflow = sub_f32(_value_f32, v2->_value_f32, & r) ;
     319               1 :          result->PutF32(r) ;
     320               1 :          break ;
     321                 :       }
     322                 :       case idl_double :
     323                 :       {
     324                 :          double r ;
     325               1 :          overflow = sub_f64(_value_f64, v2->_value_f64, & r) ;
     326               1 :          result->PutF64(r) ;
     327               1 :          break ;
     328                 :       }
     329                 :       case idl_long_double :
     330                 :       {
     331                 :          long double r ;
     332               1 :          overflow = sub_f96(_value_f96, v2->_value_f96, & r) ;
     333               1 :          result->PutF96(r) ;
     334                 :          break ;
     335                 :       }
     336                 :    }
     337                 : 
     338               3 :    if (overflow)
     339                 :    {
     340               0 :       result->SetError() ;
     341                 :    }
     342                 :    return result ;
     343                 : }
     344                 : 
     345               3 : IDLValue* IDLFloatValue::computeMul(const IDLValue* v)
     346                 : {
     347               3 :    IDLFloatValue *result = new IDLFloatValue() ;
     348                 :    IDLFloatValue *v2 = NULL ;
     349                 :    bool overflow = false ;
     350                 : 
     351                 :    ASSERT(v->isA() == idl_floatType) ;
     352               3 :    v2 = (IDLFloatValue*) v ;
     353                 :    ASSERT(v2->GetType() == _type) ;
     354                 : 
     355               3 :    switch (_type)
     356                 :    {
     357                 :       case idl_float :
     358                 :       {
     359                 :          float r ;
     360               1 :          overflow = mul_f32(_value_f32, v2->_value_f32, & r) ;
     361               1 :          result->PutF32(r) ;
     362               1 :          break ;
     363                 :       }
     364                 :       case idl_double :
     365                 :       {
     366                 :          double r ;
     367               1 :          overflow = mul_f64(_value_f64, v2->_value_f64, & r) ;
     368               1 :          result->PutF64(r) ;
     369               1 :          break ;
     370                 :       }
     371                 :       case idl_long_double :
     372                 :       {
     373                 :          long double r ;
     374               1 :          overflow = mul_f96(_value_f96, v2->_value_f96, & r) ;
     375               1 :          result->PutF96(r) ;
     376                 :          break ;
     377                 :       }
     378                 :    }
     379                 : 
     380               3 :    if (overflow)
     381                 :    {
     382               0 :       result->SetError() ;
     383                 :    }
     384                 :    return result ;
     385                 : }
     386                 : 
     387               3 : IDLValue* IDLFloatValue::computeDiv(const IDLValue* v)
     388                 : {
     389               3 :    IDLFloatValue *result = new IDLFloatValue() ;
     390                 :    IDLFloatValue *v2 = NULL ;
     391                 :    bool overflow = false ;
     392                 : 
     393                 :    ASSERT(v->isA() == idl_floatType) ;
     394               3 :    v2 = (IDLFloatValue*) v ;
     395                 :    ASSERT(v2->GetType() == _type) ;
     396                 : 
     397               3 :    switch (_type)
     398                 :    {
     399                 :       case idl_float :
     400                 :       {
     401                 :          float r ;
     402               1 :          overflow = div_f32(_value_f32, v2->_value_f32, & r) ;
     403               1 :          result->PutF32(r) ;
     404               1 :          break ;
     405                 :       }
     406                 :       case idl_double :
     407                 :       {
     408                 :          double r ;
     409               1 :          overflow = div_f64(_value_f64, v2->_value_f64, & r) ;
     410               1 :          result->PutF64(r) ;
     411               1 :          break ;
     412                 :       }
     413                 :       case idl_long_double :
     414                 :       {
     415                 :          long double r ;
     416               1 :          overflow = div_f96(_value_f96, v2->_value_f96, & r) ;
     417               1 :          result->PutF96(r) ;
     418                 :          break ;
     419                 :       }
     420                 :    }
     421                 : 
     422               3 :    if (overflow)
     423                 :    {
     424               0 :       result->SetError() ;
     425                 :    }
     426                 :    return result ;
     427                 : }
     428                 : 
     429               0 : IDLValue* IDLFloatValue::computeMinus(void)
     430                 : {
     431               0 :    NON_DEV("IDLFloatValue") ;
     432                 :    return NULL ;
     433              63 : }
     434              63 : 

Generated by: LTP GCOV extension version 1.4