QGIS API Documentation 3.99.0-Master (2fe06baccd8)
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 ) : QgsException( what ) {}
35};
36#endif
37
38
44class CORE_EXPORT QgsWkbPtr
45{
46 mutable unsigned char *mP;
47 unsigned char *mStart;
48 unsigned char *mEnd;
49
50 void verifyBound( int size ) const;
51
52 template<typename T> void read( T &v ) const
53 {
54 verifyBound( sizeof v );
55 memcpy( &v, mP, sizeof v );
56 mP += sizeof v;
57 }
58
59 template<typename T> void write( T &v ) const
60 {
61 verifyBound( sizeof v );
62 memcpy( mP, &v, sizeof v );
63 mP += sizeof v;
64 }
65
66 void write( const QByteArray &data ) const
67 {
68 verifyBound( data.length() );
69 memcpy( mP, data.constData(), data.length() );
70 mP += data.length();
71 }
72
73 public:
75 QgsWkbPtr( QByteArray &wkb ) SIP_SKIP;
76
77 QgsWkbPtr( unsigned char *p SIP_ARRAY, int size SIP_ARRAYSIZE );
78
79 inline const QgsWkbPtr &operator>>( double &v ) const SIP_SKIP { read( v ); return *this; }
80 inline const QgsWkbPtr &operator>>( float &r ) const SIP_SKIP { double v; read( v ); r = v; return *this; }
82 inline const QgsWkbPtr &operator>>( qint32 &v ) const SIP_SKIP { read( v ); return *this; }
84 inline const QgsWkbPtr &operator>>( qint64 &r ) const SIP_SKIP { quint32 v; read( v ); r = v; return *this; }
86 inline const QgsWkbPtr &operator>>( quint32 &v ) const SIP_SKIP { read( v ); return *this; }
88 inline const QgsWkbPtr &operator>>( char &v ) const SIP_SKIP { read( v ); return *this; }
90 inline const QgsWkbPtr &operator>>( Qgis::WkbType &v ) const SIP_SKIP { read( v ); return *this; }
91
93 inline QgsWkbPtr &operator<<( double v ) SIP_SKIP { write( v ); return *this; }
95 inline QgsWkbPtr &operator<<( float r ) SIP_SKIP { double v = r; write( v ); return *this; }
97 inline QgsWkbPtr &operator<<( qint32 v ) SIP_SKIP { write( v ); return *this; }
99 inline QgsWkbPtr &operator<<( qint64 r ) SIP_SKIP { quint32 v = r; write( v ); return *this; }
101 inline QgsWkbPtr &operator<<( quint32 v ) SIP_SKIP { write( v ); return *this; }
103 inline QgsWkbPtr &operator<<( char v ) SIP_SKIP { write( v ); return *this; }
105 inline QgsWkbPtr &operator<<( Qgis::WkbType v ) SIP_SKIP { write( v ); return *this; }
107 inline QgsWkbPtr &operator<<( const QByteArray &data ) SIP_SKIP { write( data ); return *this; }
108
109 inline void operator+=( int n ) const SIP_SKIP { verifyBound( n ); mP += n; }
110
111 inline operator unsigned char *() const SIP_SKIP { return mP; }
112
117 inline int size() const SIP_SKIP { return mEnd - mStart; }
118
123 inline int remaining() const SIP_SKIP { return mEnd - mP; }
124
129 inline int writtenSize() const SIP_SKIP { return mP - mStart; }
130};
131
137
138class CORE_EXPORT QgsConstWkbPtr
139{
140 protected:
141 mutable unsigned char *mP;
142 unsigned char *mEnd;
143 mutable bool mEndianSwap;
145
150 void verifyBound( int size ) const SIP_SKIP;
151
156 template<typename T> void read( T &v ) const SIP_SKIP
157 {
158 verifyBound( sizeof v );
159 memcpy( &v, mP, sizeof( v ) );
160 mP += sizeof( v );
161 if ( mEndianSwap )
162 endian_swap( v );
163 }
164
165 public:
167 explicit QgsConstWkbPtr( const QByteArray &wkb ) SIP_SKIP;
168 QgsConstWkbPtr( const unsigned char *p SIP_ARRAY, int size SIP_ARRAYSIZE );
169
174 Qgis::WkbType readHeader() const SIP_SKIP;
175
176 inline const QgsConstWkbPtr &operator>>( double &v ) const SIP_SKIP { read( v ); return *this; }
177 inline const QgsConstWkbPtr &operator>>( float &r ) const SIP_SKIP { double v; read( v ); r = v; return *this; }
178 inline const QgsConstWkbPtr &operator>>( int &v ) const SIP_SKIP { read( v ); return *this; }
179 inline const QgsConstWkbPtr &operator>>( unsigned int &v ) const SIP_SKIP { read( v ); return *this; }
180 inline const QgsConstWkbPtr &operator>>( char &v ) const SIP_SKIP { read( v ); return *this; }
181
183 const QgsConstWkbPtr &operator>>( QPointF &point ) const; SIP_SKIP
185 const QgsConstWkbPtr &operator>>( QPolygonF &points ) const; SIP_SKIP
186
187 inline void operator+=( int n ) const SIP_SKIP { verifyBound( n ); mP += n; }
188 inline void operator-=( int n ) const SIP_SKIP { mP -= n; }
189
190 inline operator const unsigned char *() const SIP_SKIP { return mP; }
191
196 inline int remaining() const SIP_SKIP { return mEnd - mP; }
197
198 private:
199 template<typename T> void endian_swap( T &value ) const SIP_SKIP
200 {
201 char *data = reinterpret_cast<char *>( &value );
202 const std::size_t n = sizeof( value );
203 const std::size_t m = n / 2;
204 for ( std::size_t i = 0; i < m; ++i )
205 {
206 std::swap( data[i], data[n - 1 - i] );
207 }
208 }
209};
210
211#endif // QGSWKBPTR_H
WkbType
The WKB type describes the number of dimensions a geometry has.
Definition qgis.h:277
A const WKB pointer.
Definition qgswkbptr.h:139
const QgsConstWkbPtr & operator>>(int &v) const
Definition qgswkbptr.h:178
const QgsConstWkbPtr & operator>>(unsigned int &v) const
Definition qgswkbptr.h:179
int remaining() const
remaining
Definition qgswkbptr.h:196
QgsConstWkbPtr(const QByteArray &wkb)
Construct WKB pointer from QByteArray.
Definition qgswkbptr.cpp:40
void read(T &v) const
Read a value.
Definition qgswkbptr.h:156
void verifyBound(int size) const
Verify bounds.
Definition qgswkbptr.cpp:72
void operator-=(int n) const
Definition qgswkbptr.h:188
void operator+=(int n) const
Definition qgswkbptr.h:187
unsigned char * mP
Definition qgswkbptr.h:141
Qgis::WkbType mWkbType
Definition qgswkbptr.h:144
const QgsConstWkbPtr & operator>>(float &r) const
Definition qgswkbptr.h:177
const QgsConstWkbPtr & operator>>(char &v) const
Definition qgswkbptr.h:180
unsigned char * mEnd
Definition qgswkbptr.h:142
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:79
const QgsWkbPtr & operator>>(Qgis::WkbType &v) const
Reads a Qgis::WkbType enum value.
Definition qgswkbptr.h:90
QgsWkbPtr & operator<<(qint64 r)
Writes a longlong as int to the pointer.
Definition qgswkbptr.h:99
const QgsWkbPtr & operator>>(qint32 &v) const
Reads an integer value into a qint32.
Definition qgswkbptr.h:82
const QgsWkbPtr & operator>>(qint64 &r) const
Reads an integer value into a longlong.
Definition qgswkbptr.h:84
QgsWkbPtr & operator<<(Qgis::WkbType v)
Writes a WKB type value to the pointer.
Definition qgswkbptr.h:105
int remaining() const
remaining
Definition qgswkbptr.h:123
const QgsWkbPtr & operator>>(quint32 &v) const
Reads an unsigned integer value.
Definition qgswkbptr.h:86
QgsWkbPtr & operator<<(const QByteArray &data)
Append data from a byte array.
Definition qgswkbptr.h:107
QgsWkbPtr & operator<<(qint32 v)
Writes an int to the pointer.
Definition qgswkbptr.h:97
QgsWkbPtr & operator<<(double v)
Writes a double to the pointer.
Definition qgswkbptr.h:93
int writtenSize() const
writtenSize
Definition qgswkbptr.h:129
int size() const
size
Definition qgswkbptr.h:117
const QgsWkbPtr & operator>>(float &r) const
Definition qgswkbptr.h:80
QgsWkbPtr(QByteArray &wkb)
Construct WKB pointer from QByteArray.
Definition qgswkbptr.cpp:20
QgsWkbPtr & operator<<(quint32 v)
Writes an unsigned int to the pointer.
Definition qgswkbptr.h:101
void operator+=(int n) const
Definition qgswkbptr.h:109
const QgsWkbPtr & operator>>(char &v) const
Reads an char value.
Definition qgswkbptr.h:88
QgsWkbPtr & operator<<(float r)
Writes a float to the pointer.
Definition qgswkbptr.h:95
QgsWkbPtr & operator<<(char v)
Writes a char to the pointer.
Definition qgswkbptr.h:103
#define SIP_ARRAY
Definition qgis_sip.h:99
#define SIP_SKIP
Definition qgis_sip.h:134
#define SIP_ARRAYSIZE
Definition qgis_sip.h:104
QDataStream & operator>>(QDataStream &in, QgsFeature &feature)
Reads a feature from stream in into feature. QGIS version compatibility is not guaranteed.