Changeset View
Changeset View
Standalone View
Standalone View
src/lib/marble/geodata/data/GeoDataMultiTrack.cpp
Show All 32 Lines | 32 | GeoDataMultiTrack::GeoDataMultiTrack( const GeoDataGeometry& other ) | |||
---|---|---|---|---|---|
33 | : GeoDataGeometry( other ) | 33 | : GeoDataGeometry( other ) | ||
34 | { | 34 | { | ||
35 | } | 35 | } | ||
36 | 36 | | |||
37 | GeoDataMultiTrack::~GeoDataMultiTrack() | 37 | GeoDataMultiTrack::~GeoDataMultiTrack() | ||
38 | { | 38 | { | ||
39 | } | 39 | } | ||
40 | 40 | | |||
41 | GeoDataMultiTrackPrivate* GeoDataMultiTrack::p() | | |||
42 | { | | |||
43 | return static_cast<GeoDataMultiTrackPrivate*>(d); | | |||
44 | } | | |||
45 | | ||||
46 | const GeoDataMultiTrackPrivate* GeoDataMultiTrack::p() const | | |||
47 | { | | |||
48 | return static_cast<GeoDataMultiTrackPrivate*>(d); | | |||
49 | } | | |||
50 | | ||||
51 | | ||||
52 | bool GeoDataMultiTrack::operator==( const GeoDataMultiTrack& other ) const | 41 | bool GeoDataMultiTrack::operator==( const GeoDataMultiTrack& other ) const | ||
53 | { | 42 | { | ||
54 | if ( !equals(other) ) return false; | 43 | if ( !equals(other) ) return false; | ||
55 | 44 | | |||
56 | QVector<GeoDataTrack*>::const_iterator d_it = p()->m_vector.constBegin(); | 45 | Q_D(const GeoDataMultiTrack); | ||
57 | QVector<GeoDataTrack*>::const_iterator d_end = p()->m_vector.constEnd(); | 46 | const GeoDataMultiTrackPrivate *other_d = other.d_func(); | ||
58 | QVector<GeoDataTrack*>::const_iterator other_it = other.p()->m_vector.constBegin(); | 47 | | ||
59 | QVector<GeoDataTrack*>::const_iterator other_end = other.p()->m_vector.constEnd(); | 48 | QVector<GeoDataTrack*>::const_iterator d_it = d->m_vector.constBegin(); | ||
49 | QVector<GeoDataTrack*>::const_iterator d_end = d->m_vector.constEnd(); | ||||
50 | QVector<GeoDataTrack*>::const_iterator other_it = other_d->m_vector.constBegin(); | ||||
51 | QVector<GeoDataTrack*>::const_iterator other_end = other_d->m_vector.constEnd(); | ||||
60 | 52 | | |||
61 | 53 | | |||
62 | for (; d_it != d_end && other_it != other_end; ++d_it, ++other_it) { | 54 | for (; d_it != d_end && other_it != other_end; ++d_it, ++other_it) { | ||
63 | if ( **d_it != **other_it ) return false; | 55 | if ( **d_it != **other_it ) return false; | ||
64 | } | 56 | } | ||
65 | 57 | | |||
66 | return d_it == d_end && other_it == other_end; | 58 | return d_it == d_end && other_it == other_end; | ||
67 | } | 59 | } | ||
68 | 60 | | |||
69 | bool GeoDataMultiTrack::operator!=( const GeoDataMultiTrack& other ) const | 61 | bool GeoDataMultiTrack::operator!=( const GeoDataMultiTrack& other ) const | ||
70 | { | 62 | { | ||
71 | return !this->operator==( other ); | 63 | return !this->operator==( other ); | ||
72 | } | 64 | } | ||
73 | 65 | | |||
74 | const GeoDataLatLonAltBox& GeoDataMultiTrack::latLonAltBox() const | 66 | const GeoDataLatLonAltBox& GeoDataMultiTrack::latLonAltBox() const | ||
75 | { | 67 | { | ||
76 | QVector<GeoDataTrack*>::const_iterator it = p()->m_vector.constBegin(); | 68 | Q_D(const GeoDataMultiTrack); | ||
77 | QVector<GeoDataTrack*>::const_iterator end = p()->m_vector.constEnd(); | 69 | | ||
70 | QVector<GeoDataTrack*>::const_iterator it = d->m_vector.constBegin(); | ||||
71 | QVector<GeoDataTrack*>::const_iterator end = d->m_vector.constEnd(); | ||||
78 | 72 | | |||
79 | p()->m_latLonAltBox.clear(); | 73 | d->m_latLonAltBox.clear(); | ||
80 | for (; it != end; ++it) { | 74 | for (; it != end; ++it) { | ||
81 | if ( !(*it)->latLonAltBox().isEmpty() ) { | 75 | if ( !(*it)->latLonAltBox().isEmpty() ) { | ||
82 | if ( p()->m_latLonAltBox.isEmpty() ) { | 76 | if (d->m_latLonAltBox.isEmpty() ) { | ||
83 | p()->m_latLonAltBox = (*it)->latLonAltBox(); | 77 | d->m_latLonAltBox = (*it)->latLonAltBox(); | ||
84 | } | 78 | } | ||
85 | else { | 79 | else { | ||
86 | p()->m_latLonAltBox |= (*it)->latLonAltBox(); | 80 | d->m_latLonAltBox |= (*it)->latLonAltBox(); | ||
87 | } | 81 | } | ||
88 | } | 82 | } | ||
89 | } | 83 | } | ||
90 | return p()->m_latLonAltBox; | 84 | return d->m_latLonAltBox; | ||
91 | } | 85 | } | ||
92 | 86 | | |||
93 | int GeoDataMultiTrack::size() const | 87 | int GeoDataMultiTrack::size() const | ||
94 | { | 88 | { | ||
95 | return p()->m_vector.size(); | 89 | Q_D(const GeoDataMultiTrack); | ||
90 | return d->m_vector.size(); | ||||
96 | } | 91 | } | ||
97 | 92 | | |||
98 | QVector<GeoDataTrack> GeoDataMultiTrack::vector() const | 93 | QVector<GeoDataTrack> GeoDataMultiTrack::vector() const | ||
99 | { | 94 | { | ||
95 | Q_D(const GeoDataMultiTrack); | ||||
96 | | ||||
100 | QVector<GeoDataTrack> results; | 97 | QVector<GeoDataTrack> results; | ||
101 | results.reserve(p()->m_vector.size()); | 98 | results.reserve(d->m_vector.size()); | ||
102 | 99 | | |||
103 | QVector<GeoDataTrack*>::const_iterator it = p()->m_vector.constBegin(); | 100 | QVector<GeoDataTrack*>::const_iterator it = d->m_vector.constBegin(); | ||
104 | QVector<GeoDataTrack*>::const_iterator end = p()->m_vector.constEnd(); | 101 | QVector<GeoDataTrack*>::const_iterator end = d->m_vector.constEnd(); | ||
105 | 102 | | |||
106 | for (; it != end; ++it) { | 103 | for (; it != end; ++it) { | ||
107 | const GeoDataTrack f(**it); | 104 | const GeoDataTrack f(**it); | ||
108 | results.append( f ); | 105 | results.append( f ); | ||
109 | } | 106 | } | ||
110 | 107 | | |||
111 | return results; | 108 | return results; | ||
112 | } | 109 | } | ||
113 | 110 | | |||
114 | GeoDataTrack& GeoDataMultiTrack::at( int pos ) | 111 | GeoDataTrack& GeoDataMultiTrack::at( int pos ) | ||
115 | { | 112 | { | ||
116 | mDebug() << "detaching!"; | 113 | mDebug() << "detaching!"; | ||
117 | detach(); | 114 | detach(); | ||
118 | return *(p()->m_vector[ pos ]); | 115 | | ||
116 | Q_D(GeoDataMultiTrack); | ||||
117 | return *(d->m_vector[pos]); | ||||
119 | } | 118 | } | ||
120 | 119 | | |||
121 | const GeoDataTrack& GeoDataMultiTrack::at( int pos ) const | 120 | const GeoDataTrack& GeoDataMultiTrack::at( int pos ) const | ||
122 | { | 121 | { | ||
123 | return *(p()->m_vector.at( pos )); | 122 | Q_D(const GeoDataMultiTrack); | ||
123 | return *(d->m_vector.at(pos)); | ||||
124 | } | 124 | } | ||
125 | 125 | | |||
126 | GeoDataTrack& GeoDataMultiTrack::operator[]( int pos ) | 126 | GeoDataTrack& GeoDataMultiTrack::operator[]( int pos ) | ||
127 | { | 127 | { | ||
128 | detach(); | 128 | detach(); | ||
129 | return *(p()->m_vector[ pos ]); | 129 | | ||
130 | Q_D(GeoDataMultiTrack); | ||||
131 | return *(d->m_vector[pos]); | ||||
130 | } | 132 | } | ||
131 | 133 | | |||
132 | const GeoDataTrack& GeoDataMultiTrack::operator[]( int pos ) const | 134 | const GeoDataTrack& GeoDataMultiTrack::operator[]( int pos ) const | ||
133 | { | 135 | { | ||
134 | return *(p()->m_vector[ pos ]); | 136 | Q_D(const GeoDataMultiTrack); | ||
137 | return *(d->m_vector[pos]); | ||||
135 | } | 138 | } | ||
136 | 139 | | |||
137 | GeoDataTrack& GeoDataMultiTrack::last() | 140 | GeoDataTrack& GeoDataMultiTrack::last() | ||
138 | { | 141 | { | ||
139 | detach(); | 142 | detach(); | ||
140 | return *(p()->m_vector.last()); | 143 | | ||
144 | Q_D(GeoDataMultiTrack); | ||||
145 | return *(d->m_vector.last()); | ||||
141 | } | 146 | } | ||
142 | 147 | | |||
143 | GeoDataTrack& GeoDataMultiTrack::first() | 148 | GeoDataTrack& GeoDataMultiTrack::first() | ||
144 | { | 149 | { | ||
145 | detach(); | 150 | detach(); | ||
146 | return *(p()->m_vector.first()); | 151 | | ||
152 | Q_D(GeoDataMultiTrack); | ||||
153 | return *(d->m_vector.first()); | ||||
147 | } | 154 | } | ||
148 | 155 | | |||
149 | const GeoDataTrack& GeoDataMultiTrack::last() const | 156 | const GeoDataTrack& GeoDataMultiTrack::last() const | ||
150 | { | 157 | { | ||
151 | return *(p()->m_vector.last()); | 158 | Q_D(const GeoDataMultiTrack); | ||
159 | return *(d->m_vector.last()); | ||||
152 | } | 160 | } | ||
153 | 161 | | |||
154 | const GeoDataTrack& GeoDataMultiTrack::first() const | 162 | const GeoDataTrack& GeoDataMultiTrack::first() const | ||
155 | { | 163 | { | ||
156 | return *(p()->m_vector.first()); | 164 | Q_D(const GeoDataMultiTrack); | ||
165 | return *(d->m_vector.first()); | ||||
157 | } | 166 | } | ||
158 | 167 | | |||
159 | QVector<GeoDataTrack*>::Iterator GeoDataMultiTrack::begin() | 168 | QVector<GeoDataTrack*>::Iterator GeoDataMultiTrack::begin() | ||
160 | { | 169 | { | ||
161 | detach(); | 170 | detach(); | ||
162 | return p()->m_vector.begin(); | 171 | | ||
172 | Q_D(GeoDataMultiTrack); | ||||
173 | return d->m_vector.begin(); | ||||
163 | } | 174 | } | ||
164 | 175 | | |||
165 | QVector<GeoDataTrack*>::Iterator GeoDataMultiTrack::end() | 176 | QVector<GeoDataTrack*>::Iterator GeoDataMultiTrack::end() | ||
166 | { | 177 | { | ||
167 | detach(); | 178 | detach(); | ||
168 | return p()->m_vector.end(); | 179 | | ||
180 | Q_D(GeoDataMultiTrack); | ||||
181 | return d->m_vector.end(); | ||||
169 | } | 182 | } | ||
170 | 183 | | |||
171 | QVector<GeoDataTrack*>::ConstIterator GeoDataMultiTrack::constBegin() const | 184 | QVector<GeoDataTrack*>::ConstIterator GeoDataMultiTrack::constBegin() const | ||
172 | { | 185 | { | ||
173 | return p()->m_vector.constBegin(); | 186 | Q_D(const GeoDataMultiTrack); | ||
187 | return d->m_vector.constBegin(); | ||||
174 | } | 188 | } | ||
175 | 189 | | |||
176 | QVector<GeoDataTrack*>::ConstIterator GeoDataMultiTrack::constEnd() const | 190 | QVector<GeoDataTrack*>::ConstIterator GeoDataMultiTrack::constEnd() const | ||
177 | { | 191 | { | ||
178 | return p()->m_vector.constEnd(); | 192 | Q_D(const GeoDataMultiTrack); | ||
193 | return d->m_vector.constEnd(); | ||||
179 | } | 194 | } | ||
180 | 195 | | |||
181 | /** | 196 | /** | ||
182 | * @brief returns the requested child item | 197 | * @brief returns the requested child item | ||
183 | */ | 198 | */ | ||
184 | GeoDataTrack* GeoDataMultiTrack::child( int i ) | 199 | GeoDataTrack* GeoDataMultiTrack::child( int i ) | ||
185 | { | 200 | { | ||
186 | detach(); | 201 | detach(); | ||
187 | return p()->m_vector.at( i ); | 202 | | ||
203 | Q_D(const GeoDataMultiTrack); | ||||
204 | return d->m_vector.at(i); | ||||
188 | } | 205 | } | ||
189 | 206 | | |||
190 | const GeoDataTrack* GeoDataMultiTrack::child( int i ) const | 207 | const GeoDataTrack* GeoDataMultiTrack::child( int i ) const | ||
191 | { | 208 | { | ||
192 | return p()->m_vector.at( i ); | 209 | Q_D(const GeoDataMultiTrack); | ||
210 | return d->m_vector.at(i); | ||||
193 | } | 211 | } | ||
194 | 212 | | |||
195 | /** | 213 | /** | ||
196 | * @brief returns the position of an item in the list | 214 | * @brief returns the position of an item in the list | ||
197 | */ | 215 | */ | ||
198 | int GeoDataMultiTrack::childPosition( const GeoDataTrack *object ) const | 216 | int GeoDataMultiTrack::childPosition( const GeoDataTrack *object ) const | ||
199 | { | 217 | { | ||
200 | for ( int i=0; i< p()->m_vector.size(); i++ ) | 218 | Q_D(const GeoDataMultiTrack); | ||
201 | { | 219 | for (int i = 0; i < d->m_vector.size(); ++i) { | ||
202 | if ( p()->m_vector.at( i ) == object ) | 220 | if (d->m_vector.at(i) == object) { | ||
203 | { | | |||
204 | return i; | 221 | return i; | ||
205 | } | 222 | } | ||
206 | } | 223 | } | ||
207 | return -1; | 224 | return -1; | ||
208 | } | 225 | } | ||
209 | 226 | | |||
210 | /** | 227 | /** | ||
211 | * @brief add an element | 228 | * @brief add an element | ||
212 | */ | 229 | */ | ||
213 | void GeoDataMultiTrack::append( GeoDataTrack *other ) | 230 | void GeoDataMultiTrack::append( GeoDataTrack *other ) | ||
214 | { | 231 | { | ||
215 | detach(); | 232 | detach(); | ||
233 | | ||||
234 | Q_D(GeoDataMultiTrack); | ||||
216 | other->setParent( this ); | 235 | other->setParent( this ); | ||
217 | p()->m_vector.append( other ); | 236 | d->m_vector.append(other); | ||
218 | } | 237 | } | ||
219 | 238 | | |||
220 | 239 | | |||
221 | GeoDataMultiTrack& GeoDataMultiTrack::operator << ( const GeoDataTrack& value ) | 240 | GeoDataMultiTrack& GeoDataMultiTrack::operator << ( const GeoDataTrack& value ) | ||
222 | { | 241 | { | ||
223 | detach(); | 242 | detach(); | ||
243 | | ||||
244 | Q_D(GeoDataMultiTrack); | ||||
224 | GeoDataTrack *g = new GeoDataTrack( value ); | 245 | GeoDataTrack *g = new GeoDataTrack( value ); | ||
225 | g->setParent( this ); | 246 | g->setParent( this ); | ||
226 | p()->m_vector.append( g ); | 247 | d->m_vector.append(g); | ||
227 | return *this; | 248 | return *this; | ||
228 | } | 249 | } | ||
229 | 250 | | |||
230 | void GeoDataMultiTrack::clear() | 251 | void GeoDataMultiTrack::clear() | ||
231 | { | 252 | { | ||
232 | detach(); | 253 | detach(); | ||
233 | qDeleteAll(p()->m_vector); | 254 | | ||
234 | p()->m_vector.clear(); | 255 | Q_D(GeoDataMultiTrack); | ||
256 | qDeleteAll(d->m_vector); | ||||
257 | d->m_vector.clear(); | ||||
235 | } | 258 | } | ||
236 | 259 | | |||
237 | void GeoDataMultiTrack::pack( QDataStream& stream ) const | 260 | void GeoDataMultiTrack::pack( QDataStream& stream ) const | ||
238 | { | 261 | { | ||
262 | Q_D(const GeoDataMultiTrack); | ||||
263 | | ||||
239 | GeoDataGeometry::pack( stream ); | 264 | GeoDataGeometry::pack( stream ); | ||
240 | 265 | | |||
241 | stream << p()->m_vector.size(); | 266 | stream << d->m_vector.size(); | ||
242 | 267 | | |||
243 | for( QVector<GeoDataTrack*>::const_iterator iterator | 268 | for( QVector<GeoDataTrack*>::const_iterator iterator | ||
244 | = p()->m_vector.constBegin(); | 269 | = d->m_vector.constBegin(); | ||
245 | iterator != p()->m_vector.constEnd(); | 270 | iterator != d->m_vector.constEnd(); | ||
246 | ++iterator ) { | 271 | ++iterator ) { | ||
247 | const GeoDataTrack *geometry = *iterator; | 272 | const GeoDataTrack *geometry = *iterator; | ||
248 | stream << geometry->geometryId(); | 273 | stream << geometry->geometryId(); | ||
249 | geometry->pack( stream ); | 274 | geometry->pack( stream ); | ||
250 | } | 275 | } | ||
251 | } | 276 | } | ||
252 | 277 | | |||
253 | void GeoDataMultiTrack::unpack( QDataStream& stream ) | 278 | void GeoDataMultiTrack::unpack( QDataStream& stream ) | ||
254 | { | 279 | { | ||
255 | detach(); | 280 | detach(); | ||
281 | | ||||
282 | Q_D(GeoDataMultiTrack); | ||||
256 | GeoDataGeometry::unpack( stream ); | 283 | GeoDataGeometry::unpack( stream ); | ||
257 | 284 | | |||
258 | int size = 0; | 285 | int size = 0; | ||
259 | 286 | | |||
260 | stream >> size; | 287 | stream >> size; | ||
261 | 288 | | |||
262 | for( int i = 0; i < size; i++ ) { | 289 | for( int i = 0; i < size; i++ ) { | ||
263 | int geometryId; | 290 | int geometryId; | ||
264 | stream >> geometryId; | 291 | stream >> geometryId; | ||
265 | switch( geometryId ) { | 292 | switch( geometryId ) { | ||
266 | case InvalidGeometryId: | 293 | case InvalidGeometryId: | ||
267 | break; | 294 | break; | ||
268 | case GeoDataTrackId: | 295 | case GeoDataTrackId: | ||
269 | { | 296 | { | ||
270 | GeoDataTrack *track = new GeoDataTrack; | 297 | GeoDataTrack *track = new GeoDataTrack; | ||
271 | track->unpack( stream ); | 298 | track->unpack( stream ); | ||
272 | p()->m_vector.append( track ); | 299 | d->m_vector.append( track ); | ||
273 | } | 300 | } | ||
274 | break; | 301 | break; | ||
275 | case GeoDataModelId: | 302 | case GeoDataModelId: | ||
276 | break; | 303 | break; | ||
277 | default: break; | 304 | default: break; | ||
278 | }; | 305 | }; | ||
279 | } | 306 | } | ||
280 | } | 307 | } | ||
281 | 308 | | |||
282 | } | 309 | } |