QGIS API Documentation 4.0.0-Norrköping (1ddcee3d0e4)
Loading...
Searching...
No Matches
qgswkbptr.h
Go to the documentation of this file.
1/***************************************************************************
2 qgswkbptr.h
3 ---------------------
4 begin : January 2014
5 copyright : (C) 2014 by Juergen E. Fischer
6 email : jef at norbit dot de
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15#ifndef QGSWKBPTR_H
16#define QGSWKBPTR_H
17
18#include "qgis.h"
19#include "qgis_core.h"
20#include "qgis_sip.h"
21#include "qgsexception.h"
22
23#include <qpolygon.h>
24
30#ifndef SIP_RUN
31class CORE_EXPORT QgsWkbException : public QgsException
32{
33 public:
34 QgsWkbException( QString const &what )
36 {}
37};
38#endif
39
40
46class CORE_EXPORT QgsWkbPtr
47{
48 mutable unsigned char *mP;
49 unsigned char *mStart;
50 unsigned char *mEnd;
51
52 void verifyBound( int size ) const;
53
54 template<typename T> void read( T &v ) const
55 {
56 verifyBound( sizeof v );
57 memcpy( &v, mP, sizeof v );
58 mP += sizeof v;
59 }
60
61 template<typename T> void write( T &v ) const
62 {
63 verifyBound( sizeof v );
64 memcpy( mP, &v, sizeof v );
65 mP += sizeof v;
66 }
67
68 void write( const QByteArray &data ) const
69 {
70 verifyBound( data.length() );
71 memcpy( mP, data.constData(), data.length() );
72 mP += data.length();
73 }
74
75 public:
77 QgsWkbPtr( QByteArray &wkb ) SIP_SKIP;
78
79 QgsWkbPtr( unsigned char *p SIP_ARRAY, int size SIP_ARRAYSIZE );
80
81 inline const QgsWkbPtr &operator>>( double &v ) const SIP_SKIP
82 {
83 read( v );
84 return *this;
85 }
86 inline const QgsWkbPtr &operator>>( float &r ) const SIP_SKIP
87 {
88 double v;
89 read( v );
90 r = v;
91 return *this;
92 }
93
94 inline const QgsWkbPtr &operator>>( qint32 &v ) const SIP_SKIP
95 {
96 read( v );
97 return *this;
98 }
99
100 inline const QgsWkbPtr &operator>>( qint64 &r ) const SIP_SKIP
101 {
102 quint32 v;
103 read( v );
104 r = v;
105 return *this;
106 }
107
108 inline const QgsWkbPtr &operator>>( quint32 &v ) const SIP_SKIP
109 {
110 read( v );
111 return *this;
112 }
113
114 inline const QgsWkbPtr &operator>>( char &v ) const SIP_SKIP
115 {
116 read( v );
117 return *this;
118 }
119
120 inline const QgsWkbPtr &operator>>( Qgis::WkbType &v ) const SIP_SKIP
121 {
122 read( v );
123 return *this;
124 }
125
127 inline QgsWkbPtr &operator<<( double v ) SIP_SKIP
128 {
129 write( v );
130 return *this;
131 }
132
133 inline QgsWkbPtr &operator<<( float r ) SIP_SKIP
134 {
135 double v = r;
136 write( v );
137 return *this;
138 }
139
140 inline QgsWkbPtr &operator<<( qint32 v ) SIP_SKIP
141 {
142 write( v );
143 return *this;
144 }
145
146 inline QgsWkbPtr &operator<<( qint64 r ) SIP_SKIP
147 {
148 quint32 v = r;
149 write( v );
150 return *this;
151 }
152
153 inline QgsWkbPtr &operator<<( quint32 v ) SIP_SKIP
154 {
155 write( v );
156 return *this;
157 }
158
159 inline QgsWkbPtr &operator<<( char v ) SIP_SKIP
160 {
161 write( v );
162 return *this;
163 }
164
166 {
167 write( v );
168 return *this;
169 }
170
171 inline QgsWkbPtr &operator<<( const QByteArray &data ) SIP_SKIP
172 {
173 write( data );
174 return *this;
175 }
176
177 inline void operator+=( int n ) const SIP_SKIP
178 {
179 verifyBound( n );
180 mP += n;
181 }
182
183 inline operator unsigned char *() const SIP_SKIP { return mP; }
184
189 inline int size() const SIP_SKIP { return mEnd - mStart; }
190
195 inline int remaining() const SIP_SKIP { return mEnd - mP; }
196
201 inline int writtenSize() const SIP_SKIP { return mP - mStart; }
202};
203
209
210class CORE_EXPORT QgsConstWkbPtr
211{
212 protected:
213 mutable unsigned char *mP;
214 unsigned char *mEnd;
215 mutable bool mEndianSwap;
217
222 void verifyBound( int size ) const SIP_SKIP;
223
228 template<typename T> void read( T &v ) const SIP_SKIP
229 {
230 verifyBound( sizeof v );
231 memcpy( &v, mP, sizeof( v ) );
232 mP += sizeof( v );
233 if ( mEndianSwap )
234 endian_swap( v );
235 }
236
237 public:
239 explicit QgsConstWkbPtr( const QByteArray &wkb ) SIP_SKIP;
240 QgsConstWkbPtr( const unsigned char *p SIP_ARRAY, int size SIP_ARRAYSIZE );
241
246 Qgis::WkbType readHeader() const SIP_SKIP;
247
248 inline const QgsConstWkbPtr &operator>>( double &v ) const SIP_SKIP
249 {
250 read( v );
251 return *this;
252 }
253 inline const QgsConstWkbPtr &operator>>( float &r ) const SIP_SKIP
254 {
255 double v;
256 read( v );
257 r = v;
258 return *this;
259 }
260 inline const QgsConstWkbPtr &operator>>( int &v ) const SIP_SKIP
261 {
262 read( v );
263 return *this;
264 }
265 inline const QgsConstWkbPtr &operator>>( unsigned int &v ) const SIP_SKIP
266 {
267 read( v );
268 return *this;
269 }
270 inline const QgsConstWkbPtr &operator>>( char &v ) const SIP_SKIP
271 {
272 read( v );
273 return *this;
274 }
275
277 const QgsConstWkbPtr &operator>>( QPointF &point ) const SIP_SKIP;
279 const QgsConstWkbPtr &operator>>( QPolygonF &points ) const SIP_SKIP;
280
281 // clang-format off
282 inline void operator+=( int n ) const SIP_SKIP { verifyBound( n ); mP += n; }
283 // clang-format on
284 inline void operator-=( int n ) const SIP_SKIP { mP -= n; }
285
286 inline operator const unsigned char *() const SIP_SKIP { return mP; }
287
292 inline int remaining() const SIP_SKIP { return mEnd - mP; }
293
294 private:
295 template<typename T> void endian_swap( T &value ) const SIP_SKIP
296 {
297 char *data = reinterpret_cast<char *>( &value );
298 const std::size_t n = sizeof( value );
299 const std::size_t m = n / 2;
300 for ( std::size_t i = 0; i < m; ++i )
301 {
302 std::swap( data[i], data[n - 1 - i] );
303 }
304 }
305};
306
307#endif // QGSWKBPTR_H
WkbType
The WKB type describes the number of dimensions a geometry has.
Definition qgis.h:294
A const WKB pointer.
Definition qgswkbptr.h:211
const QgsConstWkbPtr & operator>>(int &v) const
Definition qgswkbptr.h:260
const QgsConstWkbPtr & operator>>(unsigned int &v) const
Definition qgswkbptr.h:265
int remaining() const
remaining
Definition qgswkbptr.h:292
QgsConstWkbPtr(const QByteArray &wkb)
Construct WKB pointer from QByteArray.
Definition qgswkbptr.cpp:44
void read(T &v) const
Read a value.
Definition qgswkbptr.h:228
void verifyBound(int size) const
Verify bounds.
Definition qgswkbptr.cpp:76
void operator-=(int n) const
Definition qgswkbptr.h:284
void operator+=(int n) const
Definition qgswkbptr.h:282
unsigned char * mP
Definition qgswkbptr.h:213
Qgis::WkbType mWkbType
Definition qgswkbptr.h:216
const QgsConstWkbPtr & operator>>(float &r) const
Definition qgswkbptr.h:253
const QgsConstWkbPtr & operator>>(char &v) const
Definition qgswkbptr.h:270
unsigned char * mEnd
Definition qgswkbptr.h:214
QString what() const
QgsException(const QString &message)
Constructor for QgsException, with the specified error message.
QgsWkbException(QString const &what)
Definition qgswkbptr.h:34
const QgsWkbPtr & operator>>(double &v) const
Definition qgswkbptr.h:81
const QgsWkbPtr & operator>>(Qgis::WkbType &v) const
Reads a Qgis::WkbType enum value.
Definition qgswkbptr.h:120
QgsWkbPtr & operator<<(qint64 r)
Writes a longlong as int to the pointer.
Definition qgswkbptr.h:146
const QgsWkbPtr & operator>>(qint32 &v) const
Reads an integer value into a qint32.
Definition qgswkbptr.h:94
const QgsWkbPtr & operator>>(qint64 &r) const
Reads an integer value into a longlong.
Definition qgswkbptr.h:100
QgsWkbPtr & operator<<(Qgis::WkbType v)
Writes a WKB type value to the pointer.
Definition qgswkbptr.h:165
int remaining() const
remaining
Definition qgswkbptr.h:195
const QgsWkbPtr & operator>>(quint32 &v) const
Reads an unsigned integer value.
Definition qgswkbptr.h:108
QgsWkbPtr & operator<<(const QByteArray &data)
Append data from a byte array.
Definition qgswkbptr.h:171
QgsWkbPtr & operator<<(qint32 v)
Writes an int to the pointer.
Definition qgswkbptr.h:140
QgsWkbPtr & operator<<(double v)
Writes a double to the pointer.
Definition qgswkbptr.h:127
int writtenSize() const
writtenSize
Definition qgswkbptr.h:201
int size() const
size
Definition qgswkbptr.h:189
const QgsWkbPtr & operator>>(float &r) const
Definition qgswkbptr.h:86
QgsWkbPtr(QByteArray &wkb)
Construct WKB pointer from QByteArray.
Definition qgswkbptr.cpp:24
QgsWkbPtr & operator<<(quint32 v)
Writes an unsigned int to the pointer.
Definition qgswkbptr.h:153
void operator+=(int n) const
Definition qgswkbptr.h:177
const QgsWkbPtr & operator>>(char &v) const
Reads an char value.
Definition qgswkbptr.h:114
QgsWkbPtr & operator<<(float r)
Writes a float to the pointer.
Definition qgswkbptr.h:133
QgsWkbPtr & operator<<(char v)
Writes a char to the pointer.
Definition qgswkbptr.h:159
#define SIP_ARRAY
Definition qgis_sip.h:98
#define SIP_SKIP
Definition qgis_sip.h:133
#define SIP_ARRAYSIZE
Definition qgis_sip.h:103
QDataStream & operator>>(QDataStream &in, QgsFeature &feature)
Reads a feature from stream in into feature. QGIS version compatibility is not guaranteed.