LCOV - code coverage report
Current view: top level - frmts/sdts - sdts_al.h (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 33 33 100.0 %
Date: 2024-11-21 22:18:42 Functions: 14 14 100.0 %

          Line data    Source code
       1             : /******************************************************************************
       2             :  * $Id$
       3             :  *
       4             :  * Project:  SDTS Translator
       5             :  * Purpose:  Include file for entire SDTS Abstraction Layer functions.
       6             :  * Author:   Frank Warmerdam, warmerdam@pobox.com
       7             :  *
       8             :  ******************************************************************************
       9             :  * Copyright (c) 1999, Frank Warmerdam
      10             :  *
      11             :  * SPDX-License-Identifier: MIT
      12             :  ****************************************************************************/
      13             : 
      14             : #ifndef SDTS_AL_H_INCLUDED
      15             : #define SDTS_AL_H_INCLUDED
      16             : 
      17             : #include "cpl_conv.h"
      18             : #include "iso8211.h"
      19             : 
      20             : class SDTS_IREF;
      21             : class SDTSModId;
      22             : class SDTSTransfer;
      23             : 
      24             : #define SDTS_SIZEOF_SADR 8
      25             : 
      26             : char **SDTSScanModuleReferences(DDFModule *, const char *);
      27             : 
      28             : /************************************************************************/
      29             : /*                              SDTS_IREF                               */
      30             : /************************************************************************/
      31             : 
      32             : /**
      33             :   Class holding SDTS IREF (internal reference) information, internal
      34             :   coordinate system format, scaling and resolution.  This object isn't
      35             :   normally needed by applications.
      36             : */
      37             : class SDTS_IREF
      38             : {
      39             :     int nDefaultSADRFormat;
      40             : 
      41             :   public:
      42             :     SDTS_IREF();
      43             :     ~SDTS_IREF();
      44             : 
      45             :     int Read(const char *pszFilename);
      46             : 
      47             :     char *pszXAxisName; /* XLBL */
      48             :     char *pszYAxisName; /* YLBL */
      49             : 
      50             :     double dfXScale; /* SFAX */
      51             :     double dfYScale; /* SFAY */
      52             : 
      53             :     double dfXOffset; /* XORG */
      54             :     double dfYOffset; /* YORG */
      55             : 
      56             :     double dfXRes; /* XHRS */
      57             :     double dfYRes; /* YHRS */
      58             : 
      59             :     char *pszCoordinateFormat; /* HFMT */
      60             : 
      61             :     int GetSADRCount(DDFField *) const;
      62             :     int GetSADR(DDFField *, int, double *, double *, double *);
      63             : };
      64             : 
      65             : /************************************************************************/
      66             : /*                              SDTS_XREF                               */
      67             : /************************************************************************/
      68             : 
      69             : /**
      70             :   Class for reading the XREF (external reference) module containing the
      71             :   data projection definition.
      72             : */
      73             : 
      74             : class SDTS_XREF
      75             : {
      76             :   public:
      77             :     SDTS_XREF();
      78             :     ~SDTS_XREF();
      79             : 
      80             :     int Read(const char *pszFilename);
      81             : 
      82             :     /** Projection system name, from the RSNM field.  One of GEO, SPCS, UTM,
      83             :         UPS, OTHR, UNSP. */
      84             :     char *pszSystemName;
      85             : 
      86             :     /** Horizontal datum name, from the HDAT field.  One of NAS, NAX, WGA,
      87             :         WGB, WGC, WGE. */
      88             :     char *pszDatum;
      89             : 
      90             :     /** Zone number for UTM and SPCS projections, from the ZONE field. */
      91             :     int nZone;
      92             : };
      93             : 
      94             : /************************************************************************/
      95             : /*                              SDTS_CATD                               */
      96             : /************************************************************************/
      97             : class SDTS_CATDEntry;
      98             : 
      99             : /**
     100             :   List of feature layer types.  See SDTSTransfer::GetLayerType().
     101             :   */
     102             : 
     103             : typedef enum
     104             : {
     105             :     SLTUnknown,
     106             :     SLTPoint,
     107             :     SLTLine,
     108             :     SLTAttr,
     109             :     SLTPoly,
     110             :     SLTRaster
     111             : } SDTSLayerType;
     112             : 
     113             : /**
     114             :   Class for accessing the CATD (Catalog Directory) file containing a list of
     115             :   all other files (modules) in the transfer.
     116             : */
     117             : class SDTS_CATD
     118             : {
     119             :     char *pszPrefixPath;
     120             : 
     121             :     int nEntries;
     122             :     SDTS_CATDEntry **papoEntries;
     123             : 
     124             :   public:
     125             :     SDTS_CATD();
     126             :     ~SDTS_CATD();
     127             : 
     128             :     int Read(const char *pszFilename);
     129             : 
     130             :     const char *GetModuleFilePath(const char *pszModule) const;
     131             : 
     132          69 :     int GetEntryCount() const
     133             :     {
     134          69 :         return nEntries;
     135             :     }
     136             : 
     137             :     const char *GetEntryModule(int) const;
     138             :     const char *GetEntryTypeDesc(int) const;
     139             :     const char *GetEntryFilePath(int) const;
     140             :     SDTSLayerType GetEntryType(int) const;
     141             :     void SetEntryTypeUnknown(int);
     142             : };
     143             : 
     144             : /************************************************************************/
     145             : /*                              SDTSModId                               */
     146             : /************************************************************************/
     147             : 
     148             : /**
     149             :   Object representing a unique module/record identifier within an SDTS
     150             :   transfer.
     151             : */
     152             : class SDTSModId
     153             : {
     154             :   public:
     155        1290 :     SDTSModId()
     156        1290 :     {
     157        1290 :         szModule[0] = '\0';
     158        1290 :         nRecord = -1;
     159        1290 :         szOBRP[0] = '\0';
     160        1290 :         szName[0] = '\0';
     161        1290 :     }
     162             : 
     163             :     int Set(DDFField *);
     164             : 
     165             :     const char *GetName();
     166             : 
     167             :     /** The module name, such as PC01, containing the indicated record. */
     168             :     char szModule[8];
     169             : 
     170             :     /** The record within the module referred to.  This is -1 for unused
     171             :         SDTSModIds. */
     172             :     int nRecord;
     173             : 
     174             :     /** The "role" of this record within the module.  This is normally empty
     175             :         for references, but set in the oModId member of a feature.  */
     176             :     char szOBRP[8];
     177             : 
     178             :     /** String "szModule:nRecord" */
     179             :     char szName[20];
     180             : };
     181             : 
     182             : /************************************************************************/
     183             : /*                             SDTSFeature                              */
     184             : /************************************************************************/
     185             : 
     186             : /**
     187             :   Base class for various SDTS features classes, providing a generic
     188             :   module identifier, and list of attribute references.
     189             : */
     190             : class SDTSFeature
     191             : {
     192             :   public:
     193             :     SDTSFeature();
     194             :     virtual ~SDTSFeature();
     195             : 
     196             :     /** Unique identifier for this record/feature within transfer. */
     197             :     SDTSModId oModId;
     198             : 
     199             :     /** Number of attribute links (aoATID[]) on this feature. */
     200             :     int nAttributes;
     201             : 
     202             :     /** List of nAttributes attribute record identifiers related to this
     203             :         feature.  */
     204             :     SDTSModId *paoATID;
     205             : 
     206             :     void ApplyATID(DDFField *);
     207             : 
     208             :     /** Dump readable description of feature to indicated stream. */
     209             :     virtual void Dump(FILE *) = 0;
     210             : };
     211             : 
     212             : /************************************************************************/
     213             : /*                          SDTSIndexedReader                           */
     214             : /************************************************************************/
     215             : 
     216             : /**
     217             :   Base class for all the SDTSFeature type readers.  Provides feature
     218             :   caching semantics and fetching based on a record number.
     219             :   */
     220             : 
     221             : class SDTSIndexedReader
     222             : {
     223             :     int nIndexSize;
     224             :     SDTSFeature **papoFeatures;
     225             : 
     226             :     int iCurrentFeature;
     227             : 
     228             :   protected:
     229             :     DDFModule oDDFModule;
     230             : 
     231             :   public:
     232             :     SDTSIndexedReader();
     233             :     virtual ~SDTSIndexedReader();
     234             : 
     235             :     virtual SDTSFeature *GetNextRawFeature() = 0;
     236             : 
     237             :     SDTSFeature *GetNextFeature();
     238             : 
     239             :     virtual void Rewind();
     240             : 
     241             :     void FillIndex();
     242             :     void ClearIndex();
     243             :     int IsIndexed() const;
     244             : 
     245             :     SDTSFeature *GetIndexedFeatureRef(int);
     246             :     char **ScanModuleReferences(const char * = "ATID");
     247             : 
     248           4 :     DDFModule *GetModule()
     249             :     {
     250           4 :         return &oDDFModule;
     251             :     }
     252             : };
     253             : 
     254             : /************************************************************************/
     255             : /*                             SDTSRawLine                              */
     256             : /************************************************************************/
     257             : 
     258             : /** SDTS line feature, as read from LE* modules by SDTSLineReader. */
     259             : 
     260             : class SDTSRawLine : public SDTSFeature
     261             : {
     262             :   public:
     263             :     SDTSRawLine();
     264             :     virtual ~SDTSRawLine();
     265             : 
     266             :     int Read(SDTS_IREF *, DDFRecord *);
     267             : 
     268             :     /** Number of vertices in the padfX, padfY and padfZ arrays. */
     269             :     int nVertices;
     270             : 
     271             :     /** List of nVertices X coordinates. */
     272             :     double *padfX;
     273             :     /** List of nVertices Y coordinates. */
     274             :     double *padfY;
     275             :     /** List of nVertices Z coordinates - currently always zero. */
     276             :     double *padfZ;
     277             : 
     278             :     /** Identifier of polygon to left of this line.  This is the SDTS PIDL
     279             :         subfield. */
     280             :     SDTSModId oLeftPoly;
     281             : 
     282             :     /** Identifier of polygon to right of this line.  This is the SDTS PIDR
     283             :         subfield. */
     284             :     SDTSModId oRightPoly;
     285             : 
     286             :     /** Identifier for the start node of this line.  This is the SDTS SNID
     287             :         subfield. */
     288             :     SDTSModId oStartNode; /* SNID */
     289             : 
     290             :     /** Identifier for the end node of this line.  This is the SDTS ENID
     291             :         subfield. */
     292             :     SDTSModId oEndNode; /* ENID */
     293             : 
     294             :     void Dump(FILE *) override;
     295             : };
     296             : 
     297             : /************************************************************************/
     298             : /*                            SDTSLineReader                            */
     299             : /*                                                                      */
     300             : /*      Class for reading any of the files lines.                       */
     301             : /************************************************************************/
     302             : 
     303             : /**
     304             :   Reader for SDTS line modules.
     305             : 
     306             :   Returns SDTSRawLine features. Normally readers are instantiated with
     307             :   the SDTSTransfer::GetIndexedReader() method.
     308             : 
     309             :   */
     310             : 
     311             : class SDTSLineReader : public SDTSIndexedReader
     312             : {
     313             :     SDTS_IREF *poIREF;
     314             : 
     315             :   public:
     316             :     explicit SDTSLineReader(SDTS_IREF *);
     317             :     ~SDTSLineReader();
     318             : 
     319             :     int Open(const char *);
     320             :     SDTSRawLine *GetNextLine();
     321             :     void Close();
     322             : 
     323          57 :     SDTSFeature *GetNextRawFeature() override
     324             :     {
     325          57 :         return GetNextLine();
     326             :     }
     327             : 
     328             :     void AttachToPolygons(SDTSTransfer *, int iPolyLayer);
     329             : };
     330             : 
     331             : /************************************************************************/
     332             : /*                            SDTSAttrRecord                            */
     333             : /************************************************************************/
     334             : 
     335             : /**
     336             :   SDTS attribute record feature, as read from A* modules by
     337             :   SDTSAttrReader.
     338             : 
     339             :   Note that even though SDTSAttrRecord is derived from SDTSFeature, there
     340             :   are never any attribute records associated with attribute records using
     341             :   the aoATID[] mechanism.  SDTSFeature::nAttributes will always be zero.
     342             :   */
     343             : 
     344             : class SDTSAttrRecord : public SDTSFeature
     345             : {
     346             :   public:
     347             :     SDTSAttrRecord();
     348             :     virtual ~SDTSAttrRecord();
     349             : 
     350             :     /** The entire DDFRecord read from the file. */
     351             :     DDFRecord *poWholeRecord;
     352             : 
     353             :     /** The ATTR DDFField with the user attribute.  Each subfield is a
     354             :         attribute value. */
     355             : 
     356             :     DDFField *poATTR;
     357             : 
     358             :     virtual void Dump(FILE *) override;
     359             : };
     360             : 
     361             : /************************************************************************/
     362             : /*                            SDTSAttrReader                            */
     363             : /************************************************************************/
     364             : 
     365             : /**
     366             :   Class for reading SDTSAttrRecord features from a primary or secondary
     367             :   attribute module.
     368             :   */
     369             : 
     370             : class SDTSAttrReader : public SDTSIndexedReader
     371             : {
     372             :     int bIsSecondary;
     373             : 
     374             :   public:
     375             :     SDTSAttrReader();
     376             :     virtual ~SDTSAttrReader();
     377             : 
     378             :     int Open(const char *);
     379             :     DDFField *GetNextRecord(SDTSModId * = nullptr, DDFRecord ** = nullptr,
     380             :                             int bDuplicate = FALSE);
     381             :     SDTSAttrRecord *GetNextAttrRecord();
     382             :     void Close();
     383             : 
     384             :     /**
     385             :       Returns TRUE if this is a Attribute Secondary layer rather than
     386             :       an Attribute Primary layer.
     387             :       */
     388             :     int IsSecondary() const
     389             :     {
     390             :         return bIsSecondary;
     391             :     }
     392             : 
     393         357 :     SDTSFeature *GetNextRawFeature() override
     394             :     {
     395         357 :         return GetNextAttrRecord();
     396             :     }
     397             : };
     398             : 
     399             : /************************************************************************/
     400             : /*                             SDTSRawPoint                             */
     401             : /************************************************************************/
     402             : 
     403             : /**
     404             :   Object containing a point feature (type NA, NO or NP).
     405             :   */
     406             : class SDTSRawPoint : public SDTSFeature
     407             : {
     408             :   public:
     409             :     SDTSRawPoint();
     410             :     virtual ~SDTSRawPoint();
     411             : 
     412             :     int Read(SDTS_IREF *, DDFRecord *);
     413             : 
     414             :     /** X coordinate of point. */
     415             :     double dfX;
     416             :     /** Y coordinate of point. */
     417             :     double dfY;
     418             :     /** Z coordinate of point. */
     419             :     double dfZ;
     420             : 
     421             :     /** Optional identifier of area marked by this point (i.e. PC01:27). */
     422             :     SDTSModId oAreaId; /* ARID */
     423             : 
     424             :     virtual void Dump(FILE *) override;
     425             : };
     426             : 
     427             : /************************************************************************/
     428             : /*                           SDTSPointReader                            */
     429             : /************************************************************************/
     430             : 
     431             : /**
     432             :   Class for reading SDTSRawPoint features from a point module (type NA, NO
     433             :   or NP).
     434             :   */
     435             : 
     436             : class SDTSPointReader : public SDTSIndexedReader
     437             : {
     438             :     SDTS_IREF *poIREF;
     439             : 
     440             :   public:
     441             :     explicit SDTSPointReader(SDTS_IREF *);
     442             :     virtual ~SDTSPointReader();
     443             : 
     444             :     int Open(const char *);
     445             :     SDTSRawPoint *GetNextPoint();
     446             :     void Close();
     447             : 
     448         132 :     SDTSFeature *GetNextRawFeature() override
     449             :     {
     450         132 :         return GetNextPoint();
     451             :     }
     452             : };
     453             : 
     454             : /************************************************************************/
     455             : /*                             SDTSRawPolygon                           */
     456             : /************************************************************************/
     457             : 
     458             : /**
     459             :   Class for holding information about a polygon feature.
     460             : 
     461             :   When directly read from a polygon module, the polygon has no concept
     462             :   of its geometry.  Just its ID, and references to attribute records.
     463             :   However, if the SDTSLineReader::AttachToPolygons() method is called on
     464             :   the module containing the lines forming the polygon boundaries, then the
     465             :   nEdges/papoEdges information on the SDTSRawPolygon will be filled in.
     466             : 
     467             :   Once this is complete the AssembleRings() method can be used to fill in the
     468             :   nRings/nVertices/panRingStart/padfX/padfY/padfZ information defining the
     469             :   ring geometry.
     470             : 
     471             :   Note that the rings may not appear in any particular order, nor with any
     472             :   meaningful direction (clockwise or counterclockwise).
     473             :   */
     474             : 
     475             : class SDTSRawPolygon : public SDTSFeature
     476             : {
     477             :     void AddEdgeToRing(int, double *, double *, double *, int, int);
     478             : 
     479             :   public:
     480             :     SDTSRawPolygon();
     481             :     virtual ~SDTSRawPolygon();
     482             : 
     483             :     int Read(DDFRecord *);
     484             : 
     485             :     int nEdges;
     486             :     SDTSRawLine **papoEdges;
     487             : 
     488             :     void AddEdge(SDTSRawLine *);
     489             : 
     490             :     /** This method will assemble the edges associated with a polygon into
     491             :       rings, returning FALSE if problems are encountered during assembly. */
     492             :     int AssembleRings();
     493             : 
     494             :     /** Number of rings in assembled polygon. */
     495             :     int nRings;
     496             :     /** Total number of vertices in all rings of assembled polygon. */
     497             :     int nVertices;
     498             :     /** Offsets into padfX/padfY/padfZ for the beginning of each ring in the
     499             :       polygon.  This array is nRings long. */
     500             :     int *panRingStart;
     501             : 
     502             :     /** List of nVertices X coordinates for the polygon (split over multiple
     503             :       rings via panRingStart. */
     504             :     double *padfX;
     505             :     /** List of nVertices Y coordinates for the polygon (split over multiple
     506             :       rings via panRingStart. */
     507             :     double *padfY;
     508             :     /** List of nVertices Z coordinates for the polygon (split over multiple
     509             :       rings via panRingStart.  The values are almost always zero. */
     510             :     double *padfZ;
     511             : 
     512             :     virtual void Dump(FILE *) override;
     513             : };
     514             : 
     515             : /************************************************************************/
     516             : /*                          SDTSPolygonReader                           */
     517             : /************************************************************************/
     518             : 
     519             : /** Class for reading SDTSRawPolygon features from a polygon (PC*) module. */
     520             : 
     521             : class SDTSPolygonReader : public SDTSIndexedReader
     522             : {
     523             :     int bRingsAssembled;
     524             : 
     525             :   public:
     526             :     SDTSPolygonReader();
     527             :     virtual ~SDTSPolygonReader();
     528             : 
     529             :     int Open(const char *);
     530             :     SDTSRawPolygon *GetNextPolygon();
     531             :     void Close();
     532             : 
     533          36 :     SDTSFeature *GetNextRawFeature() override
     534             :     {
     535          36 :         return GetNextPolygon();
     536             :     }
     537             : 
     538             :     void AssembleRings(SDTSTransfer *, int iPolyLayer);
     539             : };
     540             : 
     541             : /************************************************************************/
     542             : /*                           SDTSRasterReader                           */
     543             : /************************************************************************/
     544             : 
     545             : /**
     546             :   Class for reading raster data from a raster layer.
     547             : 
     548             :   This class is somewhat unique among the reader classes in that it isn't
     549             :   derived from SDTSIndexedFeature, and it doesn't return "features".  Instead
     550             :   it is used to read raster blocks, in the natural block size of the dataset.
     551             :   */
     552             : 
     553             : class SDTSRasterReader
     554             : {
     555             :     DDFModule oDDFModule;
     556             : 
     557             :     char szModule[20];
     558             : 
     559             :     int nXSize;
     560             :     int nYSize;
     561             :     int nXBlockSize;
     562             :     int nYBlockSize;
     563             : 
     564             :     int nXStart; /* SOCI */
     565             :     int nYStart; /* SORI */
     566             : 
     567             :     double adfTransform[6];
     568             : 
     569             :   public:
     570             :     char szINTR[4]; /* CE is center, TL is top left */
     571             :     char szFMT[32];
     572             :     char szUNITS[64];
     573             :     char szLabel[64];
     574             : 
     575             :     SDTSRasterReader();
     576             :     ~SDTSRasterReader();
     577             : 
     578             :     int Open(SDTS_CATD *poCATD, SDTS_IREF *, const char *pszModule);
     579             :     void Close();
     580             : 
     581             :     int GetRasterType(); /* 1 = int16, see GDAL types */
     582             : #define SDTS_RT_INT16 1
     583             : #define SDTS_RT_FLOAT32 6
     584             : 
     585             :     int GetTransform(double *);
     586             : 
     587             :     int GetMinMax(double *pdfMin, double *pdfMax, double dfNoData);
     588             : 
     589             :     /**
     590             :       Fetch the raster width.
     591             : 
     592             :       @return the width in pixels.
     593             :       */
     594           2 :     int GetXSize() const
     595             :     {
     596           2 :         return nXSize;
     597             :     }
     598             : 
     599             :     /**
     600             :       Fetch the raster height.
     601             : 
     602             :       @return the height in pixels.
     603             :       */
     604           2 :     int GetYSize() const
     605             :     {
     606           2 :         return nYSize;
     607             :     }
     608             : 
     609             :     /** Fetch the width of a source block (usually same as raster width). */
     610           2 :     int GetBlockXSize() const
     611             :     {
     612           2 :         return nXBlockSize;
     613             :     }
     614             : 
     615             :     /** Fetch the height of a source block (usually one). */
     616           2 :     int GetBlockYSize() const
     617             :     {
     618           2 :         return nYBlockSize;
     619             :     }
     620             : 
     621             :     int GetBlock(int nXOffset, int nYOffset, void *pData);
     622             : };
     623             : 
     624             : /************************************************************************/
     625             : /*                             SDTSTransfer                             */
     626             : /************************************************************************/
     627             : 
     628             : /**
     629             :   Master class representing an entire SDTS transfer.
     630             : 
     631             :   This class is used to open the transfer, to get a list of available
     632             :   feature layers, and to instantiate readers for those layers.
     633             : 
     634             :   */
     635             : 
     636             : class SDTSTransfer
     637             : {
     638             :   public:
     639             :     SDTSTransfer();
     640             :     ~SDTSTransfer();
     641             : 
     642             :     int Open(const char *);
     643             :     void Close();
     644             : 
     645             :     int FindLayer(const char *);
     646             : 
     647          20 :     int GetLayerCount() const
     648             :     {
     649          20 :         return nLayers;
     650             :     }
     651             : 
     652             :     SDTSLayerType GetLayerType(int) const;
     653             :     int GetLayerCATDEntry(int) const;
     654             : 
     655             :     SDTSLineReader *GetLayerLineReader(int);
     656             :     SDTSPointReader *GetLayerPointReader(int);
     657             :     SDTSPolygonReader *GetLayerPolygonReader(int);
     658             :     SDTSAttrReader *GetLayerAttrReader(int);
     659             :     SDTSRasterReader *GetLayerRasterReader(int);
     660             :     DDFModule *GetLayerModuleReader(int);
     661             : 
     662             :     SDTSIndexedReader *GetLayerIndexedReader(int);
     663             : 
     664             :     /**
     665             :       Fetch the catalog object for this transfer.
     666             : 
     667             :       @return pointer to the internally managed SDTS_CATD for the transfer.
     668             :       */
     669          13 :     SDTS_CATD *GetCATD()
     670             :     {
     671          13 :         return &oCATD;
     672             :     }
     673             : 
     674             :     SDTS_IREF *GetIREF()
     675             :     {
     676             :         return &oIREF;
     677             :     }
     678             : 
     679             :     /**
     680             :       Fetch the external reference object for this transfer.
     681             : 
     682             :       @return pointer to the internally managed SDTS_XREF for the transfer.
     683             :       */
     684           3 :     SDTS_XREF *GetXREF()
     685             :     {
     686           3 :         return &oXREF;
     687             :     }
     688             : 
     689             :     SDTSFeature *GetIndexedFeatureRef(SDTSModId *,
     690             :                                       SDTSLayerType *peType = nullptr);
     691             : 
     692             :     DDFField *GetAttr(SDTSModId *);
     693             : 
     694             :     int GetBounds(double *pdfMinX, double *pdfMinY, double *pdfMaxX,
     695             :                   double *pdfMaxY);
     696             : 
     697             :   private:
     698             :     SDTS_CATD oCATD;
     699             :     SDTS_IREF oIREF;
     700             :     SDTS_XREF oXREF;
     701             : 
     702             :     int nLayers;
     703             :     int *panLayerCATDEntry;
     704             :     SDTSIndexedReader **papoLayerReader;
     705             : };
     706             : 
     707             : #endif /* ifndef SDTS_AL_H_INCLUDED */

Generated by: LCOV version 1.14