Coverage Report

Created: 2026-06-30 08:33

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/gdal/ogr/ogrsf_frmts/ntf/ogrntffeatureclasslayer.cpp
Line
Count
Source
1
/******************************************************************************
2
 *
3
 * Project:  UK NTF Reader
4
 * Purpose:  Implements OGRNTFFeatureClassLayer class.
5
 * Author:   Frank Warmerdam, warmerdam@pobox.com
6
 *
7
 ******************************************************************************
8
 * Copyright (c) 1999, Frank Warmerdam
9
 *
10
 * SPDX-License-Identifier: MIT
11
 ****************************************************************************/
12
13
#include "ntf.h"
14
#include "cpl_conv.h"
15
16
/************************************************************************/
17
/*                      OGRNTFFeatureClassLayer()                       */
18
/*                                                                      */
19
/*      Note that the OGRNTFLayer assumes ownership of the passed       */
20
/*      OGRFeatureDefn object.                                          */
21
/************************************************************************/
22
23
OGRNTFFeatureClassLayer::OGRNTFFeatureClassLayer(OGRNTFDataSource *poDSIn)
24
0
    : poFeatureDefn(new OGRFeatureDefn("FEATURE_CLASSES")),
25
0
      poFilterGeom(nullptr), poDS(poDSIn), iCurrentFC(0)
26
0
{
27
    /* -------------------------------------------------------------------- */
28
    /*      Establish the schema.                                           */
29
    /* -------------------------------------------------------------------- */
30
0
    SetDescription(poFeatureDefn->GetName());
31
0
    poFeatureDefn->SetGeomType(wkbNone);
32
0
    poFeatureDefn->Reference();
33
34
0
    OGRFieldDefn oFCNum("FEAT_CODE", OFTString);
35
36
0
    oFCNum.SetWidth(4);
37
0
    poFeatureDefn->AddFieldDefn(&oFCNum);
38
39
0
    OGRFieldDefn oFCName("FC_NAME", OFTString);
40
41
0
    oFCNum.SetWidth(80);
42
0
    poFeatureDefn->AddFieldDefn(&oFCName);
43
0
}
44
45
/************************************************************************/
46
/*                      ~OGRNTFFeatureClassLayer()                      */
47
/************************************************************************/
48
49
OGRNTFFeatureClassLayer::~OGRNTFFeatureClassLayer()
50
51
0
{
52
0
    if (poFeatureDefn)
53
0
        poFeatureDefn->Release();
54
55
0
    if (poFilterGeom != nullptr)
56
0
        delete poFilterGeom;
57
0
}
58
59
/************************************************************************/
60
/*                            ResetReading()                            */
61
/************************************************************************/
62
63
void OGRNTFFeatureClassLayer::ResetReading()
64
65
0
{
66
0
    iCurrentFC = 0;
67
0
}
68
69
/************************************************************************/
70
/*                           GetNextFeature()                           */
71
/************************************************************************/
72
73
OGRFeature *OGRNTFFeatureClassLayer::GetNextFeature()
74
75
0
{
76
0
    if (iCurrentFC >= GetFeatureCount())
77
0
        return nullptr;
78
79
0
    return GetFeature((long)iCurrentFC++);
80
0
}
81
82
/************************************************************************/
83
/*                             GetFeature()                             */
84
/************************************************************************/
85
86
OGRFeature *OGRNTFFeatureClassLayer::GetFeature(GIntBig nFeatureId)
87
88
0
{
89
0
    char *pszFCName, *pszFCId;
90
91
0
    if (nFeatureId < 0 || nFeatureId >= poDS->GetFCCount())
92
0
        return nullptr;
93
94
0
    poDS->GetFeatureClass((int)nFeatureId, &pszFCId, &pszFCName);
95
96
    /* -------------------------------------------------------------------- */
97
    /*      Create a corresponding feature.                                 */
98
    /* -------------------------------------------------------------------- */
99
0
    OGRFeature *poFeature = new OGRFeature(poFeatureDefn);
100
101
0
    poFeature->SetField(0, pszFCId);
102
0
    poFeature->SetField(1, pszFCName);
103
0
    poFeature->SetFID(nFeatureId);
104
105
0
    return poFeature;
106
0
}
107
108
/************************************************************************/
109
/*                          GetFeatureCount()                           */
110
/*                                                                      */
111
/*      If a spatial filter is in effect, we turn control over to       */
112
/*      the generic counter.  Otherwise we return the total count.      */
113
/*      Eventually we should consider implementing a more efficient     */
114
/*      way of counting features matching a spatial query.              */
115
/************************************************************************/
116
117
GIntBig OGRNTFFeatureClassLayer::GetFeatureCount(CPL_UNUSED int bForce)
118
0
{
119
0
    return poDS->GetFCCount();
120
0
}
121
122
/************************************************************************/
123
/*                           TestCapability()                           */
124
/************************************************************************/
125
126
int OGRNTFFeatureClassLayer::TestCapability(const char *pszCap) const
127
128
0
{
129
0
    if (EQUAL(pszCap, OLCRandomRead))
130
0
        return TRUE;
131
132
0
    else if (EQUAL(pszCap, OLCSequentialWrite) || EQUAL(pszCap, OLCRandomWrite))
133
0
        return FALSE;
134
135
0
    else if (EQUAL(pszCap, OLCFastFeatureCount))
136
0
        return TRUE;
137
138
0
    else if (EQUAL(pszCap, OLCFastSpatialFilter))
139
0
        return TRUE;
140
141
0
    else
142
0
        return FALSE;
143
0
}