LCOV - code coverage report
Current view: top level - frmts/pcraster - pcrasterutil.cpp (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 152 343 44.3 %
Date: 2024-05-02 00:41:30 Functions: 11 14 78.6 %

          Line data    Source code
       1             : /******************************************************************************
       2             :  *
       3             :  * Project:  PCRaster Integration
       4             :  * Purpose:  PCRaster driver support functions.
       5             :  * Author:   Kor de Jong, Oliver Schmitz
       6             :  *
       7             :  ******************************************************************************
       8             :  * Copyright (c) PCRaster owners
       9             :  *
      10             :  * Permission is hereby granted, free of charge, to any person obtaining a
      11             :  * copy of this software and associated documentation files (the "Software"),
      12             :  * to deal in the Software without restriction, including without limitation
      13             :  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      14             :  * and/or sell copies of the Software, and to permit persons to whom the
      15             :  * Software is furnished to do so, subject to the following conditions:
      16             :  *
      17             :  * The above copyright notice and this permission notice shall be included
      18             :  * in all copies or substantial portions of the Software.
      19             :  *
      20             :  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
      21             :  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      22             :  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
      23             :  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
      24             :  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
      25             :  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
      26             :  * DEALINGS IN THE SOFTWARE.
      27             :  ****************************************************************************/
      28             : 
      29             : #include <cfloat>
      30             : 
      31             : #include <algorithm>
      32             : #include <limits>
      33             : 
      34             : #include "pcrasterutil.h"
      35             : #include "pcrtypes.h"
      36             : 
      37             : //! Converts PCRaster data type to GDAL data type.
      38             : /*!
      39             :   \param     cellRepresentation Cell representation.
      40             :   \return    GDAL data type, GDT_Uknown if conversion is not possible.
      41             : */
      42          13 : GDALDataType cellRepresentation2GDALType(CSF_CR cellRepresentation)
      43             : {
      44          13 :     GDALDataType type = GDT_Unknown;
      45             : 
      46          13 :     switch (cellRepresentation)
      47             :     {
      48             :         // CSF version 2.
      49             :         // ----------------------------------------------------------
      50           7 :         case CR_UINT1:
      51             :         {
      52           7 :             type = GDT_Byte;
      53           7 :             break;
      54             :         }
      55           1 :         case CR_INT4:
      56             :         {
      57           1 :             type = GDT_Int32;
      58           1 :             break;
      59             :         }
      60           5 :         case CR_REAL4:
      61             :         {
      62           5 :             type = GDT_Float32;
      63           5 :             break;
      64             :         }
      65           0 :         case CR_REAL8:
      66             :         {
      67           0 :             type = GDT_Float64;
      68           0 :             break;
      69             :         }
      70             :         // CSF version 1.
      71             :         // ----------------------------------------------------------
      72           0 :         case CR_INT1:
      73             :         {
      74           0 :             type = GDT_Byte;
      75           0 :             break;
      76             :         }
      77           0 :         case CR_INT2:
      78             :         {
      79           0 :             type = GDT_Int16;
      80           0 :             break;
      81             :         }
      82           0 :         case CR_UINT2:
      83             :         {
      84           0 :             type = GDT_UInt16;
      85           0 :             break;
      86             :         }
      87           0 :         case CR_UINT4:
      88             :         {
      89           0 :             type = GDT_UInt32;
      90           0 :             break;
      91             :         }
      92           0 :         default:
      93             :         {
      94           0 :             break;
      95             :         }
      96             :     }
      97             : 
      98          13 :     return type;
      99             : }
     100             : 
     101           2 : CSF_VS string2ValueScale(std::string const &string)
     102             : {
     103           2 :     CSF_VS valueScale = VS_UNDEFINED;
     104             : 
     105             :     // CSF version 2.
     106             :     // ------------------------------------------------------------
     107           2 :     if (string == "VS_BOOLEAN")
     108             :     {
     109           0 :         valueScale = VS_BOOLEAN;
     110             :     }
     111           2 :     else if (string == "VS_NOMINAL")
     112             :     {
     113           0 :         valueScale = VS_NOMINAL;
     114             :     }
     115           2 :     else if (string == "VS_ORDINAL")
     116             :     {
     117           0 :         valueScale = VS_ORDINAL;
     118             :     }
     119           2 :     else if (string == "VS_SCALAR")
     120             :     {
     121           1 :         valueScale = VS_SCALAR;
     122             :     }
     123           1 :     else if (string == "VS_DIRECTION")
     124             :     {
     125           0 :         valueScale = VS_DIRECTION;
     126             :     }
     127           1 :     else if (string == "VS_LDD")
     128             :     {
     129           1 :         valueScale = VS_LDD;
     130             :     }
     131             :     // CSF version1.
     132             :     // -------------------------------------------------------------
     133           0 :     else if (string == "VS_CLASSIFIED")
     134             :     {
     135           0 :         valueScale = VS_CLASSIFIED;
     136             :     }
     137           0 :     else if (string == "VS_CONTINUOUS")
     138             :     {
     139           0 :         valueScale = VS_CONTINUOUS;
     140             :     }
     141           0 :     else if (string == "VS_NOTDETERMINED")
     142             :     {
     143           0 :         valueScale = VS_NOTDETERMINED;
     144             :     }
     145             : 
     146           2 :     return valueScale;
     147             : }
     148             : 
     149          13 : std::string valueScale2String(CSF_VS valueScale)
     150             : {
     151          13 :     std::string result = "VS_UNDEFINED";
     152             : 
     153          13 :     switch (valueScale)
     154             :     {
     155             :         // CSF version 2.
     156             :         // ----------------------------------------------------------
     157           1 :         case VS_BOOLEAN:
     158             :         {
     159           1 :             result = "VS_BOOLEAN";
     160           1 :             break;
     161             :         }
     162           1 :         case VS_NOMINAL:
     163             :         {
     164           1 :             result = "VS_NOMINAL";
     165           1 :             break;
     166             :         }
     167           0 :         case VS_ORDINAL:
     168             :         {
     169           0 :             result = "VS_ORDINAL";
     170           0 :             break;
     171             :         }
     172           5 :         case VS_SCALAR:
     173             :         {
     174           5 :             result = "VS_SCALAR";
     175           5 :             break;
     176             :         }
     177           0 :         case VS_DIRECTION:
     178             :         {
     179           0 :             result = "VS_DIRECTION";
     180           0 :             break;
     181             :         }
     182           6 :         case VS_LDD:
     183             :         {
     184           6 :             result = "VS_LDD";
     185           6 :             break;
     186             :         }
     187             :         // CSF version 1.
     188             :         // ----------------------------------------------------------
     189           0 :         case VS_CLASSIFIED:
     190             :         {
     191           0 :             result = "VS_CLASSIFIED";
     192           0 :             break;
     193             :         }
     194           0 :         case VS_CONTINUOUS:
     195             :         {
     196           0 :             result = "VS_CONTINUOUS";
     197           0 :             break;
     198             :         }
     199           0 :         case VS_NOTDETERMINED:
     200             :         {
     201           0 :             result = "VS_NOTDETERMINED";
     202           0 :             break;
     203             :         }
     204           0 :         default:
     205             :         {
     206           0 :             break;
     207             :         }
     208             :     }
     209             : 
     210          13 :     return result;
     211             : }
     212             : 
     213           0 : std::string cellRepresentation2String(CSF_CR cellRepresentation)
     214             : {
     215           0 :     std::string result = "CR_UNDEFINED";
     216             : 
     217           0 :     switch (cellRepresentation)
     218             :     {
     219             : 
     220             :         // CSF version 2.
     221             :         // ----------------------------------------------------------
     222           0 :         case CR_UINT1:
     223             :         {
     224           0 :             result = "CR_UINT1";
     225           0 :             break;
     226             :         }
     227           0 :         case CR_INT4:
     228             :         {
     229           0 :             result = "CR_INT4";
     230           0 :             break;
     231             :         }
     232           0 :         case CR_REAL4:
     233             :         {
     234           0 :             result = "CR_REAL4";
     235           0 :             break;
     236             :         }
     237           0 :         case CR_REAL8:
     238             :         {
     239           0 :             result = "CR_REAL8";
     240           0 :             break;
     241             :         }
     242             :         // CSF version 1.
     243             :         // ----------------------------------------------------------
     244           0 :         case CR_INT1:
     245             :         {
     246           0 :             result = "CR_INT1";
     247           0 :             break;
     248             :         }
     249           0 :         case CR_INT2:
     250             :         {
     251           0 :             result = "CR_INT2";
     252           0 :             break;
     253             :         }
     254           0 :         case CR_UINT2:
     255             :         {
     256           0 :             result = "CR_UINT2";
     257           0 :             break;
     258             :         }
     259           0 :         case CR_UINT4:
     260             :         {
     261           0 :             result = "CR_UINT4";
     262           0 :             break;
     263             :         }
     264           0 :         default:
     265             :         {
     266           0 :             break;
     267             :         }
     268             :     }
     269             : 
     270           0 :     return result;
     271             : }
     272             : 
     273             : //! Converts GDAL data type to PCRaster value scale.
     274             : /*!
     275             :   \param     type GDAL data type.
     276             :   \return    Value scale.
     277             :   \warning   \a type must be one of the standard numerical types and not
     278             :              complex.
     279             : 
     280             :   GDAL byte is regarded as PCRaster boolean, integral as nominal and float
     281             :   as scalar. This function will never return VS_LDD, VS_ORDINAL or
     282             :   VS_DIRECTION.
     283             : */
     284          10 : CSF_VS GDALType2ValueScale(GDALDataType type)
     285             : {
     286          10 :     CSF_VS valueScale = VS_UNDEFINED;
     287             : 
     288          10 :     switch (type)
     289             :     {
     290           4 :         case GDT_Byte:
     291             :         {
     292             :             // A foreign dataset is unlikely to support our LDD's.
     293           4 :             valueScale = VS_BOOLEAN;
     294           4 :             break;
     295             :         }
     296           4 :         case GDT_UInt16:
     297             :         case GDT_UInt32:
     298             :         case GDT_Int16:
     299             :         case GDT_Int32:
     300             :         {
     301           4 :             valueScale = VS_NOMINAL;
     302           4 :             break;
     303             :         }
     304           1 :         case GDT_Float32:
     305             :         {
     306             :             // A foreign dataset is unlikely to support our directional.
     307           1 :             valueScale = VS_SCALAR;
     308           1 :             break;
     309             :         }
     310           1 :         case GDT_Float64:
     311             :         {
     312             :             // A foreign dataset is unlikely to support our directional.
     313           1 :             valueScale = VS_SCALAR;
     314           1 :             break;
     315             :         }
     316           0 :         default:
     317             :         {
     318           0 :             CPLAssert(false);
     319             :             break;
     320             :         }
     321             :     }
     322             : 
     323          10 :     return valueScale;
     324             : }
     325             : 
     326             : //! Converts a GDAL type to a PCRaster cell representation.
     327             : /*!
     328             :   \param     type GDAL type.
     329             :   \param     exact Whether an exact match or a CSF2.0 supported cell
     330             :                    representation should be returned.
     331             :   \return    Cell representation.
     332             :   \warning   \a type must be one of the standard numerical types and not
     333             :              complex.
     334             : 
     335             :   If exact is false, conversion to CSF2.0 types will take place. This is
     336             :   useful for in file cell representations. If exact is true, and exact match
     337             :   is made. This is useful for in app cell representations.
     338             : 
     339             :   If exact is false, this function always returns one of CR_UINT1, CR_INT4
     340             :   or CR_REAL4.
     341             : */
     342          27 : CSF_CR GDALType2CellRepresentation(GDALDataType type, bool exact)
     343             : {
     344          27 :     CSF_CR cellRepresentation = CR_UNDEFINED;
     345             : 
     346          27 :     switch (type)
     347             :     {
     348          10 :         case GDT_Byte:
     349             :         {
     350          10 :             cellRepresentation = CR_UINT1;
     351          10 :             break;
     352             :         }
     353           2 :         case GDT_UInt16:
     354             :         {
     355           2 :             cellRepresentation = exact ? CR_UINT2 : CR_UINT1;
     356           2 :             break;
     357             :         }
     358           2 :         case GDT_UInt32:
     359             :         {
     360           2 :             cellRepresentation = exact ? CR_UINT4 : CR_UINT1;
     361           2 :             break;
     362             :         }
     363           2 :         case GDT_Int16:
     364             :         {
     365           2 :             cellRepresentation = exact ? CR_INT2 : CR_INT4;
     366           2 :             break;
     367             :         }
     368           2 :         case GDT_Int32:
     369             :         {
     370           2 :             cellRepresentation = CR_INT4;
     371           2 :             break;
     372             :         }
     373           3 :         case GDT_Float32:
     374             :         {
     375           3 :             cellRepresentation = CR_REAL4;
     376           3 :             break;
     377             :         }
     378           2 :         case GDT_Float64:
     379             :         {
     380           2 :             cellRepresentation = exact ? CR_REAL8 : CR_REAL4;
     381           2 :             break;
     382             :         }
     383           4 :         default:
     384             :         {
     385           4 :             break;
     386             :         }
     387             :     }
     388             : 
     389          27 :     return cellRepresentation;
     390             : }
     391             : 
     392             : //! Determines a missing value to use for data of \a cellRepresentation.
     393             : /*!
     394             :   \param     cellRepresentation Cell representation of the data.
     395             :   \return    Missing value.
     396             :   \exception .
     397             :   \sa        .
     398             : */
     399          18 : double missingValue(CSF_CR cellRepresentation)
     400             : {
     401             :     // It turns out that the missing values set here should be equal to the ones
     402             :     // used in gdal's code to do data type conversion. Otherwise missing values
     403             :     // in the source raster will be lost in the destination raster. It seems
     404             :     // that when assigning new missing values gdal uses its own nodata values
     405             :     // instead of the value set in the dataset.
     406             : 
     407          18 :     double missingValue = 0.0;
     408             : 
     409          18 :     switch (cellRepresentation)
     410             :     {
     411             :         // CSF version 2.
     412             :         // ----------------------------------------------------------
     413           7 :         case CR_UINT1:
     414             :         {
     415             :             // missingValue = static_cast<double>(MV_UINT1);
     416           7 :             missingValue = UINT1(255);
     417           7 :             break;
     418             :         }
     419           1 :         case CR_INT4:
     420             :         {
     421             :             // missingValue = static_cast<double>(MV_INT4);
     422           1 :             missingValue = INT4(-2147483647);
     423           1 :             break;
     424             :         }
     425          10 :         case CR_REAL4:
     426             :         {
     427             :             // using <limits> breaks on gcc 2.95
     428             :             // CPLAssert(std::numeric_limits<REAL4>::is_iec559);
     429             :             // missingValue = -std::numeric_limits<REAL4>::max();
     430          10 :             missingValue = std::numeric_limits<float>::lowest();
     431          10 :             break;
     432             :         }
     433             :         // CSF version 1.
     434             :         // ----------------------------------------------------------
     435           0 :         case CR_INT1:
     436             :         {
     437           0 :             missingValue = static_cast<double>(MV_INT1);
     438           0 :             break;
     439             :         }
     440           0 :         case CR_INT2:
     441             :         {
     442           0 :             missingValue = static_cast<double>(MV_INT2);
     443           0 :             break;
     444             :         }
     445           0 :         case CR_UINT2:
     446             :         {
     447           0 :             missingValue = static_cast<double>(MV_UINT2);
     448           0 :             break;
     449             :         }
     450           0 :         case CR_UINT4:
     451             :         {
     452           0 :             missingValue = static_cast<double>(MV_UINT4);
     453           0 :             break;
     454             :         }
     455           0 :         default:
     456             :         {
     457           0 :             CPLError(CE_Failure, CPLE_NotSupported,
     458             :                      "Unexpected value for cellRepresentation = %d",
     459             :                      cellRepresentation);
     460           0 :             break;
     461             :         }
     462             :     }
     463             : 
     464          18 :     return missingValue;
     465             : }
     466             : 
     467             : //! Opens the raster in \a filename using mode \a mode.
     468             : /*!
     469             :   \param     filename Filename of raster to open.
     470             :   \return    Pointer to CSF MAP structure.
     471             :   \exception .
     472             :   \warning   .
     473             :   \sa        .
     474             : */
     475          13 : MAP *mapOpen(std::string const &filename, MOPEN_PERM mode)
     476             : {
     477          13 :     MAP *map = Mopen(filename.c_str(), mode);
     478             : 
     479          13 :     return map;
     480             : }
     481             : 
     482         420 : void alterFromStdMV(void *buffer, size_t size, CSF_CR cellRepresentation,
     483             :                     double missingValue)
     484             : {
     485         420 :     switch (cellRepresentation)
     486             :     {
     487             :         // CSF version 2.
     488             :         // ----------------------------------------------------------
     489         400 :         case (CR_UINT1):
     490             :         {
     491             :             std::for_each(
     492             :                 static_cast<UINT1 *>(buffer),
     493             :                 static_cast<UINT1 *>(buffer) + size,
     494         400 :                 pcr::AlterFromStdMV<UINT1>(static_cast<UINT1>(missingValue)));
     495         400 :             break;
     496             :         }
     497           0 :         case (CR_INT4):
     498             :         {
     499             :             std::for_each(
     500           0 :                 static_cast<INT4 *>(buffer), static_cast<INT4 *>(buffer) + size,
     501           0 :                 pcr::AlterFromStdMV<INT4>(static_cast<INT4>(missingValue)));
     502           0 :             break;
     503             :         }
     504          20 :         case (CR_REAL4):
     505             :         {
     506             :             std::for_each(
     507             :                 static_cast<REAL4 *>(buffer),
     508          20 :                 static_cast<REAL4 *>(buffer) + size,
     509          20 :                 pcr::AlterFromStdMV<REAL4>(static_cast<REAL4>(missingValue)));
     510          20 :             break;
     511             :         }
     512           0 :         case (CR_REAL8):
     513             :         {
     514             :             std::for_each(
     515             :                 static_cast<REAL8 *>(buffer),
     516           0 :                 static_cast<REAL8 *>(buffer) + size,
     517           0 :                 pcr::AlterFromStdMV<REAL8>(static_cast<REAL8>(missingValue)));
     518           0 :             break;
     519             :         }
     520             :         // CSF version 1.
     521             :         // ----------------------------------------------------------
     522           0 :         case CR_INT1:
     523             :         {
     524             :             std::for_each(
     525             :                 static_cast<INT1 *>(buffer), static_cast<INT1 *>(buffer) + size,
     526           0 :                 pcr::AlterFromStdMV<INT1>(static_cast<INT1>(missingValue)));
     527           0 :             break;
     528             :         }
     529           0 :         case CR_INT2:
     530             :         {
     531             :             std::for_each(
     532           0 :                 static_cast<INT2 *>(buffer), static_cast<INT2 *>(buffer) + size,
     533           0 :                 pcr::AlterFromStdMV<INT2>(static_cast<INT2>(missingValue)));
     534           0 :             break;
     535             :         }
     536           0 :         case CR_UINT2:
     537             :         {
     538             :             std::for_each(
     539             :                 static_cast<UINT2 *>(buffer),
     540           0 :                 static_cast<UINT2 *>(buffer) + size,
     541           0 :                 pcr::AlterFromStdMV<UINT2>(static_cast<UINT2>(missingValue)));
     542           0 :             break;
     543             :         }
     544           0 :         case CR_UINT4:
     545             :         {
     546             :             std::for_each(
     547             :                 static_cast<UINT4 *>(buffer),
     548           0 :                 static_cast<UINT4 *>(buffer) + size,
     549           0 :                 pcr::AlterFromStdMV<UINT4>(static_cast<UINT4>(missingValue)));
     550           0 :             break;
     551             :         }
     552           0 :         default:
     553             :         {
     554           0 :             CPLAssert(false);
     555             :             break;
     556             :         }
     557             :     }
     558         420 : }
     559             : 
     560         120 : void alterToStdMV(void *buffer, size_t size, CSF_CR cellRepresentation,
     561             :                   double missingValue)
     562             : {
     563         120 :     switch (cellRepresentation)
     564             :     {
     565             :         // CSF version 2.
     566             :         // ----------------------------------------------------------
     567         100 :         case (CR_UINT1):
     568             :         {
     569             :             std::for_each(
     570             :                 static_cast<UINT1 *>(buffer),
     571             :                 static_cast<UINT1 *>(buffer) + size,
     572         100 :                 pcr::AlterToStdMV<UINT1>(static_cast<UINT1>(missingValue)));
     573         100 :             break;
     574             :         }
     575           0 :         case (CR_INT4):
     576             :         {
     577             :             std::for_each(
     578           0 :                 static_cast<INT4 *>(buffer), static_cast<INT4 *>(buffer) + size,
     579           0 :                 pcr::AlterToStdMV<INT4>(static_cast<INT4>(missingValue)));
     580           0 :             break;
     581             :         }
     582          20 :         case (CR_REAL4):
     583             :         {
     584             :             std::for_each(
     585             :                 static_cast<REAL4 *>(buffer),
     586          20 :                 static_cast<REAL4 *>(buffer) + size,
     587          20 :                 pcr::AlterToStdMV<REAL4>(static_cast<REAL4>(missingValue)));
     588          20 :             break;
     589             :         }
     590           0 :         case (CR_REAL8):
     591             :         {
     592             :             std::for_each(
     593             :                 static_cast<REAL8 *>(buffer),
     594           0 :                 static_cast<REAL8 *>(buffer) + size,
     595           0 :                 pcr::AlterToStdMV<REAL8>(static_cast<REAL8>(missingValue)));
     596           0 :             break;
     597             :         }
     598             :         // CSF version 1.
     599             :         // ----------------------------------------------------------
     600           0 :         case CR_INT1:
     601             :         {
     602             :             std::for_each(
     603             :                 static_cast<INT1 *>(buffer), static_cast<INT1 *>(buffer) + size,
     604           0 :                 pcr::AlterToStdMV<INT1>(static_cast<INT1>(missingValue)));
     605           0 :             break;
     606             :         }
     607           0 :         case CR_INT2:
     608             :         {
     609             :             std::for_each(
     610           0 :                 static_cast<INT2 *>(buffer), static_cast<INT2 *>(buffer) + size,
     611           0 :                 pcr::AlterToStdMV<INT2>(static_cast<INT2>(missingValue)));
     612           0 :             break;
     613             :         }
     614           0 :         case CR_UINT2:
     615             :         {
     616             :             std::for_each(
     617             :                 static_cast<UINT2 *>(buffer),
     618           0 :                 static_cast<UINT2 *>(buffer) + size,
     619           0 :                 pcr::AlterToStdMV<UINT2>(static_cast<UINT2>(missingValue)));
     620           0 :             break;
     621             :         }
     622           0 :         case CR_UINT4:
     623             :         {
     624             :             std::for_each(
     625             :                 static_cast<UINT4 *>(buffer),
     626           0 :                 static_cast<UINT4 *>(buffer) + size,
     627           0 :                 pcr::AlterToStdMV<UINT4>(static_cast<UINT4>(missingValue)));
     628           0 :             break;
     629             :         }
     630           0 :         default:
     631             :         {
     632           0 :             CPLAssert(false);
     633             :             break;
     634             :         }
     635             :     }
     636         120 : }
     637             : 
     638          11 : CSF_VS fitValueScale(CSF_VS valueScale, CSF_CR cellRepresentation)
     639             : {
     640          11 :     CSF_VS result = valueScale;
     641             : 
     642          11 :     switch (cellRepresentation)
     643             :     {
     644           5 :         case CR_UINT1:
     645             :         {
     646           5 :             switch (valueScale)
     647             :             {
     648           1 :                 case VS_LDD:
     649             :                 {
     650           1 :                     result = VS_LDD;
     651           1 :                     break;
     652             :                 }
     653           4 :                 default:
     654             :                 {
     655           4 :                     result = VS_BOOLEAN;
     656           4 :                     break;
     657             :                 }
     658             :             }
     659           5 :             break;
     660             :         }
     661           1 :         case CR_INT4:
     662             :         {
     663           1 :             switch (valueScale)
     664             :             {
     665           0 :                 case VS_BOOLEAN:
     666             :                 {
     667           0 :                     result = VS_NOMINAL;
     668           0 :                     break;
     669             :                 }
     670           0 :                 case VS_SCALAR:
     671             :                 {
     672           0 :                     result = VS_ORDINAL;
     673           0 :                     break;
     674             :                 }
     675           0 :                 case VS_DIRECTION:
     676             :                 {
     677           0 :                     result = VS_ORDINAL;
     678           0 :                     break;
     679             :                 }
     680           0 :                 case VS_LDD:
     681             :                 {
     682           0 :                     result = VS_NOMINAL;
     683           0 :                     break;
     684             :                 }
     685           1 :                 default:
     686             :                 {
     687           1 :                     result = valueScale;
     688           1 :                     break;
     689             :                 }
     690             :             }
     691           1 :             break;
     692             :         }
     693           1 :         case CR_REAL4:
     694             :         {
     695           1 :             switch (valueScale)
     696             :             {
     697           0 :                 case VS_DIRECTION:
     698             :                 {
     699           0 :                     result = VS_DIRECTION;
     700           0 :                     break;
     701             :                 }
     702           1 :                 default:
     703             :                 {
     704           1 :                     result = VS_SCALAR;
     705           1 :                     break;
     706             :                 }
     707             :             }
     708           1 :             break;
     709             :         }
     710           4 :         default:
     711             :         {
     712           4 :             break;
     713             :         }
     714             :     }
     715             : 
     716          11 :     return result;
     717             : }
     718             : 
     719          10 : void castValuesToBooleanRange(void *buffer, size_t size,
     720             :                               CSF_CR cellRepresentation)
     721             : {
     722          10 :     switch (cellRepresentation)
     723             :     {
     724             :         // CSF version 2.
     725             :         // ----------------------------------------------------------
     726          10 :         case (CR_UINT1):
     727             :         {
     728             :             std::for_each(static_cast<UINT1 *>(buffer),
     729             :                           static_cast<UINT1 *>(buffer) + size,
     730          10 :                           CastToBooleanRange<UINT1>());
     731          10 :             break;
     732             :         }
     733           0 :         case (CR_INT4):
     734             :         {
     735             :             std::for_each(static_cast<INT4 *>(buffer),
     736           0 :                           static_cast<INT4 *>(buffer) + size,
     737           0 :                           CastToBooleanRange<INT4>());
     738           0 :             break;
     739             :         }
     740           0 :         case (CR_REAL4):
     741             :         {
     742             :             std::for_each(static_cast<REAL4 *>(buffer),
     743           0 :                           static_cast<REAL4 *>(buffer) + size,
     744           0 :                           CastToBooleanRange<REAL4>());
     745           0 :             break;
     746             :         }
     747           0 :         case (CR_REAL8):
     748             :         {
     749             :             std::for_each(static_cast<REAL8 *>(buffer),
     750           0 :                           static_cast<REAL8 *>(buffer) + size,
     751           0 :                           CastToBooleanRange<REAL8>());
     752           0 :             break;
     753             :         }
     754             :         // CSF version 1.
     755             :         // ----------------------------------------------------------
     756           0 :         case CR_INT1:
     757             :         {
     758             :             std::for_each(static_cast<INT1 *>(buffer),
     759             :                           static_cast<INT1 *>(buffer) + size,
     760           0 :                           CastToBooleanRange<INT1>());
     761           0 :             break;
     762             :         }
     763           0 :         case CR_INT2:
     764             :         {
     765             :             std::for_each(static_cast<INT2 *>(buffer),
     766           0 :                           static_cast<INT2 *>(buffer) + size,
     767           0 :                           CastToBooleanRange<INT2>());
     768           0 :             break;
     769             :         }
     770           0 :         case CR_UINT2:
     771             :         {
     772             :             std::for_each(static_cast<UINT2 *>(buffer),
     773           0 :                           static_cast<UINT2 *>(buffer) + size,
     774           0 :                           CastToBooleanRange<UINT2>());
     775           0 :             break;
     776             :         }
     777           0 :         case CR_UINT4:
     778             :         {
     779             :             std::for_each(static_cast<UINT4 *>(buffer),
     780           0 :                           static_cast<UINT4 *>(buffer) + size,
     781           0 :                           CastToBooleanRange<UINT4>());
     782           0 :             break;
     783             :         }
     784           0 :         default:
     785             :         {
     786           0 :             CPLAssert(false);
     787             :             break;
     788             :         }
     789             :     }
     790          10 : }
     791             : 
     792           0 : void castValuesToDirectionRange(void *buffer, size_t size)
     793             : {
     794             :     std::for_each(static_cast<REAL4 *>(buffer),
     795           0 :                   static_cast<REAL4 *>(buffer) + size, CastToDirection());
     796           0 : }
     797             : 
     798           0 : void castValuesToLddRange(void *buffer, size_t size)
     799             : {
     800             :     std::for_each(static_cast<UINT1 *>(buffer),
     801           0 :                   static_cast<UINT1 *>(buffer) + size, CastToLdd());
     802           0 : }

Generated by: LCOV version 1.14