Coverage Report

Created: 2026-06-30 08:33

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/gdal/frmts/pcidsk/sdk/pcidsk_vectorsegment.h
Line
Count
Source
1
/******************************************************************************
2
 *
3
 * Purpose:  PCIDSK Vector Segment public interface. Declaration.
4
 *
5
 ******************************************************************************
6
 * Copyright (c) 2009
7
 * PCI Geomatics, 90 Allstate Parkway, Markham, Ontario, Canada.
8
 *
9
 * SPDX-License-Identifier: MIT
10
 ****************************************************************************/
11
12
#ifndef INCLUDE_PCIDSK_VECTORSEGMENT_H
13
#define INCLUDE_PCIDSK_VECTORSEGMENT_H
14
15
#include <string>
16
#include <vector>
17
#include <iterator>
18
#include "pcidsk_shape.h"
19
20
#define ATT_RINGSTART "RingStart"
21
22
namespace PCIDSK
23
{
24
    class ShapeIterator;
25
26
/************************************************************************/
27
/*                         PCIDSKVectorSegment                          */
28
/************************************************************************/
29
30
/**
31
\brief Interface to PCIDSK vector segment.
32
33
The vector segment contains a set of vector features with a common set
34
of attribute data (fields).   Each feature has a numeric identifier (ShapeId),
35
a set of field values, and a set of geometric vertices.   The layer as a
36
whole has a description of the attribute fields, and an RST (Representation
37
Style Table).
38
39
The geometry and attribute fields of shapes can be fetched with the
40
GetVertices() and GetFields() methods by giving the ShapeId of the desired
41
feature.  The set of shapeid's can be identified using the FindFirst(),
42
and FindNext() methods or the STL compatible ShapeIterator (begin() and
43
end() methods).
44
45
The PCIDSKSegment interface for the segment can be used to fetch the
46
LAYER_TYPE metadata describing how the vertices should be interpreted
47
as a geometry.  Some layers will also have a RingStart attribute field
48
which is used in conjunction with the LAYER_TYPE to interpret the
49
geometry.  Some vector segments may have no LAYER_TYPE metadata in which
50
case single vertices are interpreted as points, and multiple vertices
51
as linestrings.
52
53
More details are available in the GDB.HLP description of the GDB vector
54
data model.
55
56
Note that there are no mechanisms for fast spatial or attribute searches
57
in a PCIDSK vector segment.  Accessing features randomly (rather than
58
in the order shapeids are returned by FindFirst()/FindNext() or ShapeIterator
59
) may result in reduced performance, and the use of large amounts of memory
60
for large vector segments.
61
62
*/
63
64
class PCIDSK_DLL PCIDSKVectorSegment
65
{
66
    public:
67
        virtual ~PCIDSKVectorSegment();
68
69
/**
70
\brief Fetch RST.
71
72
No attempt is made to parse the RST, it is up to the caller to decode it.
73
74
NOTE: There is some header info on RST format that may be needed to do this
75
for older RSTs.
76
77
@return RST as a string.
78
*/
79
        virtual std::string GetRst() = 0;
80
81
82
/**
83
\brief Fetch Projection
84
85
The returned values are the projection parameters in the same form returned
86
by PCIDSKGeoref::GetParameters() and the passed in geosys argument is
87
updated with the coordinate system string.
88
89
@return Projection parameters as a vector.
90
*/
91
        virtual std::vector<double> GetProjection( std::string &geosys ) = 0;
92
93
/**
94
\brief Get field count.
95
96
Note that this includes any system attributes, like RingStart, that would
97
not normally be shown to the user.
98
99
@return the number of attribute fields defined on this layer.
100
*/
101
102
        virtual int         GetFieldCount() = 0;
103
104
/**
105
\brief Get field name.
106
107
@param field_index index of the field requested from zero to GetFieldCount()-1.
108
@return the field name.
109
*/
110
        virtual std::string GetFieldName(int field_index) = 0;
111
112
/**
113
\brief Get field description.
114
115
@param field_index index of the field requested from zero to GetFieldCount()-1.
116
@return the field description, often empty.
117
*/
118
        virtual std::string GetFieldDescription(int field_index) = 0;
119
120
/**
121
\brief Get field type.
122
123
@param field_index index of the field requested from zero to GetFieldCount()-1.
124
@return the field type.
125
*/
126
        virtual ShapeFieldType GetFieldType(int field_index) = 0;
127
128
/**
129
\brief Get field format.
130
131
@param field_index index of the field requested from zero to GetFieldCount()-1.
132
@return the field format as a C style format string suitable for use with printf.
133
*/
134
        virtual std::string GetFieldFormat(int field_index) = 0;
135
136
/**
137
\brief Get field default.
138
139
@param field_index index of the field requested from zero to GetFieldCount()-1.
140
@return the field default value.
141
*/
142
        virtual ShapeField  GetFieldDefault(int field_index) = 0;
143
144
/**
145
\brief Get iterator to first shape.
146
@return iterator.
147
*/
148
        virtual ShapeIterator begin() = 0;
149
150
/**
151
\brief Get iterator to end of shape lib (a wrapper for NullShapeId).
152
@return iterator.
153
*/
154
        virtual ShapeIterator end() = 0;
155
156
/**
157
\brief Fetch first shapeid in the layer.
158
@return first shape's shapeid.
159
*/
160
        virtual ShapeId     FindFirst() = 0;
161
162
/**
163
\brief Fetch the next shape id after the indicated shape id.
164
@param id the previous shapes id.
165
@return next shape's shapeid.
166
*/
167
        virtual ShapeId     FindNext(ShapeId id) = 0;
168
169
170
/**
171
\brief Fetch the number of shapes in this segment.
172
@return the shape count.
173
*/
174
175
        virtual int         GetShapeCount() = 0;
176
177
/**
178
\brief Fetch the vertices for the indicated shape.
179
@param id the shape to fetch
180
@param list the list is updated with the vertices for this shape.
181
*/
182
        virtual void        GetVertices( ShapeId id,
183
                                         std::vector<ShapeVertex>& list ) = 0;
184
185
/**
186
\brief Fetch the fields for the indicated shape.
187
@param id the shape to fetch
188
@param list the field list is updated with the field values for this shape.
189
*/
190
        virtual void        GetFields( ShapeId id,
191
                                       std::vector<ShapeField>& list ) = 0;
192
193
194
/**
195
\brief Set the projection for the segment.
196
197
For details on the geosys and params values see the PCIDSKGeoref class.
198
199
@param geosys the usual 16 character coordinate system string.
200
@param params additional parameters needed for user parametrized projection.
201
*/
202
        virtual void        SetProjection(const std::string& geosys,
203
                                          const std::vector<double>& params ) = 0;
204
205
/**
206
\brief Create new attribute field.
207
208
@param name the field name, should be unique in layer.
209
@param type the field type.
210
@param description the field description.
211
@param format the C style format string or "" for default formatting.
212
@param default_value the default value for this field or NULL for system default.
213
*/
214
215
        virtual void        AddField( const std::string& name, ShapeFieldType type,
216
                                      const std::string& description,
217
                                      const std::string& format,
218
                                      ShapeField *default_value=nullptr ) = 0;
219
220
/**
221
\brief Create a new shape.
222
223
Newly created shapes have no geometry or attribute values.
224
225
@param id The ShapeId to assign to the new shape, or default to assign the next available shapeid.
226
227
@return the shapeid assigned to the newly created shape.
228
*/
229
230
        virtual ShapeId     CreateShape( ShapeId id = NullShapeId ) = 0;
231
232
/**
233
\brief Delete a shape.
234
235
An exception is thrown if the shape does not exist.
236
237
@param id the shapeid to delete.
238
239
*/
240
        virtual void        DeleteShape( ShapeId id ) = 0;
241
242
/**
243
\brief Assign vertices to shape.
244
245
@param id the shape to assign vertices to.
246
@param list the list of vertices to assign.
247
*/
248
249
        virtual void        SetVertices( ShapeId id,
250
                                         const std::vector<ShapeVertex> &list ) = 0;
251
252
253
/**
254
\brief Assign attribute value to a shape.
255
256
The list of fields should match the types and length from the schema
257
(GetFieldCount(), GetFieldType()).
258
259
@param id the shape to update.
260
@param list the list of field value to assign.
261
*/
262
        virtual void        SetFields( ShapeId id,
263
                                       const std::vector<ShapeField>& list) = 0;
264
265
// Methods needed
266
        // DeleteField
267
    };
268
269
/************************************************************************/
270
/*                            ShapeIterator                             */
271
/************************************************************************/
272
273
//! Iterator over shapeids in a vector segment.
274
275
    class ShapeIterator
276
    {
277
        ShapeId id;
278
        PCIDSKVectorSegment *seg;
279
280
    public:
281
        using iterator_category = std::input_iterator_tag;
282
        using value_type = ShapeId;
283
        using difference_type = std::ptrdiff_t;
284
        using pointer = ShapeId*;
285
        using reference = ShapeId&;
286
287
        ShapeIterator(PCIDSKVectorSegment *seg_in)
288
0
                : seg(seg_in)  { id = seg->FindFirst(); }
289
        ShapeIterator(PCIDSKVectorSegment *seg_in, ShapeId id_in )
290
0
                : id(id_in), seg(seg_in)  {}
291
0
        ShapeIterator(const ShapeIterator& mit) : id(mit.id), seg(mit.seg) {}
292
0
        ShapeIterator& operator++() { id=seg->FindNext(id); return *this;}
293
0
        ShapeIterator& operator++(int) { id=seg->FindNext(id); return *this;}
294
        friend bool operator==(const ShapeIterator& lhs, const ShapeIterator& rhs);
295
        friend bool operator!=(const ShapeIterator& lhs, const ShapeIterator& rhs);
296
0
        ShapeId& operator*() {return id;}
297
    };
298
299
0
    inline bool operator==(const ShapeIterator& lhs, const ShapeIterator& rhs) {return lhs.id == rhs.id;}
300
0
    inline bool operator!=(const ShapeIterator& lhs, const ShapeIterator& rhs) {return lhs.id != rhs.id;}
301
302
} // end namespace PCIDSK
303
304
#endif // INCLUDE_PCIDSK_VECTORSEGMENT_H