Marble

GeoDataMultiTrack.cpp
1 // SPDX-License-Identifier: LGPL-2.1-or-later
2 //
3 // SPDX-FileCopyrightText: 2012 Thibaut Gridel <[email protected]>
4 
5 #include "GeoDataMultiTrack.h"
6 #include "GeoDataMultiTrack_p.h"
7 
8 #include "GeoDataLineString.h"
9 #include "GeoDataLinearRing.h"
10 #include "GeoDataPoint.h"
11 #include "GeoDataPolygon.h"
12 #include "GeoDataTrack.h"
13 #include "GeoDataTypes.h"
14 
15 #include "MarbleDebug.h"
16 
17 #include <QDataStream>
18 
19 
20 namespace Marble
21 {
22 
23 GeoDataMultiTrack::GeoDataMultiTrack()
24  : GeoDataGeometry( new GeoDataMultiTrackPrivate )
25 {
26 }
27 
28 GeoDataMultiTrack::GeoDataMultiTrack( const GeoDataGeometry& other )
29  : GeoDataGeometry( other )
30 {
31 }
32 
33 GeoDataMultiTrack::~GeoDataMultiTrack()
34 {
35 }
36 
37 const char *GeoDataMultiTrack::nodeType() const
38 {
39  return GeoDataTypes::GeoDataMultiTrackType;
40 }
41 
42 EnumGeometryId GeoDataMultiTrack::geometryId() const
43 {
44  return GeoDataMultiTrackId;
45 }
46 
47 GeoDataGeometry *GeoDataMultiTrack::copy() const
48 {
49  return new GeoDataMultiTrack(*this);
50 }
51 
52 bool GeoDataMultiTrack::operator==( const GeoDataMultiTrack& other ) const
53 {
54  if ( !equals(other) ) return false;
55 
56  Q_D(const GeoDataMultiTrack);
57  const GeoDataMultiTrackPrivate *other_d = other.d_func();
58 
61  QVector<GeoDataTrack*>::const_iterator other_it = other_d->m_vector.constBegin();
62  QVector<GeoDataTrack*>::const_iterator other_end = other_d->m_vector.constEnd();
63 
64 
65  for (; d_it != d_end && other_it != other_end; ++d_it, ++other_it) {
66  if ( **d_it != **other_it ) return false;
67  }
68 
69  return d_it == d_end && other_it == other_end;
70 }
71 
72 bool GeoDataMultiTrack::operator!=( const GeoDataMultiTrack& other ) const
73 {
74  return !this->operator==( other );
75 }
76 
77 const GeoDataLatLonAltBox& GeoDataMultiTrack::latLonAltBox() const
78 {
79  Q_D(const GeoDataMultiTrack);
80 
82  QVector<GeoDataTrack*>::const_iterator end = d->m_vector.constEnd();
83 
84  d->m_latLonAltBox.clear();
85  for (; it != end; ++it) {
86  if ( !(*it)->latLonAltBox().isEmpty() ) {
87  if (d->m_latLonAltBox.isEmpty() ) {
88  d->m_latLonAltBox = (*it)->latLonAltBox();
89  }
90  else {
91  d->m_latLonAltBox |= (*it)->latLonAltBox();
92  }
93  }
94  }
95  return d->m_latLonAltBox;
96 }
97 
98 int GeoDataMultiTrack::size() const
99 {
100  Q_D(const GeoDataMultiTrack);
101  return d->m_vector.size();
102 }
103 
104 QVector<GeoDataTrack> GeoDataMultiTrack::vector() const
105 {
106  Q_D(const GeoDataMultiTrack);
107 
108  QVector<GeoDataTrack> results;
109  results.reserve(d->m_vector.size());
110 
112  QVector<GeoDataTrack*>::const_iterator end = d->m_vector.constEnd();
113 
114  for (; it != end; ++it) {
115  const GeoDataTrack f(**it);
116  results.append( f );
117  }
118 
119  return results;
120 }
121 
122 GeoDataTrack& GeoDataMultiTrack::at( int pos )
123 {
124  mDebug() << "detaching!";
125  detach();
126 
127  Q_D(GeoDataMultiTrack);
128  return *(d->m_vector[pos]);
129 }
130 
131 const GeoDataTrack& GeoDataMultiTrack::at( int pos ) const
132 {
133  Q_D(const GeoDataMultiTrack);
134  return *(d->m_vector.at(pos));
135 }
136 
137 GeoDataTrack& GeoDataMultiTrack::operator[]( int pos )
138 {
139  detach();
140 
141  Q_D(GeoDataMultiTrack);
142  return *(d->m_vector[pos]);
143 }
144 
145 const GeoDataTrack& GeoDataMultiTrack::operator[]( int pos ) const
146 {
147  Q_D(const GeoDataMultiTrack);
148  return *(d->m_vector[pos]);
149 }
150 
151 GeoDataTrack& GeoDataMultiTrack::last()
152 {
153  detach();
154 
155  Q_D(GeoDataMultiTrack);
156  return *(d->m_vector.last());
157 }
158 
159 GeoDataTrack& GeoDataMultiTrack::first()
160 {
161  detach();
162 
163  Q_D(GeoDataMultiTrack);
164  return *(d->m_vector.first());
165 }
166 
167 const GeoDataTrack& GeoDataMultiTrack::last() const
168 {
169  Q_D(const GeoDataMultiTrack);
170  return *(d->m_vector.last());
171 }
172 
173 const GeoDataTrack& GeoDataMultiTrack::first() const
174 {
175  Q_D(const GeoDataMultiTrack);
176  return *(d->m_vector.first());
177 }
178 
179 QVector<GeoDataTrack*>::Iterator GeoDataMultiTrack::begin()
180 {
181  detach();
182 
183  Q_D(GeoDataMultiTrack);
184  return d->m_vector.begin();
185 }
186 
187 QVector<GeoDataTrack*>::Iterator GeoDataMultiTrack::end()
188 {
189  detach();
190 
191  Q_D(GeoDataMultiTrack);
192  return d->m_vector.end();
193 }
194 
195 QVector<GeoDataTrack*>::ConstIterator GeoDataMultiTrack::constBegin() const
196 {
197  Q_D(const GeoDataMultiTrack);
198  return d->m_vector.constBegin();
199 }
200 
201 QVector<GeoDataTrack*>::ConstIterator GeoDataMultiTrack::constEnd() const
202 {
203  Q_D(const GeoDataMultiTrack);
204  return d->m_vector.constEnd();
205 }
206 
207 /**
208  * @brief returns the requested child item
209  */
210 GeoDataTrack* GeoDataMultiTrack::child( int i )
211 {
212  detach();
213 
214  Q_D(const GeoDataMultiTrack);
215  return d->m_vector.at(i);
216 }
217 
218 const GeoDataTrack* GeoDataMultiTrack::child( int i ) const
219 {
220  Q_D(const GeoDataMultiTrack);
221  return d->m_vector.at(i);
222 }
223 
224 /**
225  * @brief returns the position of an item in the list
226  */
227 int GeoDataMultiTrack::childPosition( const GeoDataTrack *object ) const
228 {
229  Q_D(const GeoDataMultiTrack);
230  for (int i = 0; i < d->m_vector.size(); ++i) {
231  if (d->m_vector.at(i) == object) {
232  return i;
233  }
234  }
235  return -1;
236 }
237 
238 /**
239 * @brief add an element
240 */
241 void GeoDataMultiTrack::append( GeoDataTrack *other )
242 {
243  detach();
244 
245  Q_D(GeoDataMultiTrack);
246  other->setParent( this );
247  d->m_vector.append(other);
248 }
249 
250 
251 GeoDataMultiTrack& GeoDataMultiTrack::operator << ( const GeoDataTrack& value )
252 {
253  detach();
254 
255  Q_D(GeoDataMultiTrack);
256  GeoDataTrack *g = new GeoDataTrack( value );
257  g->setParent( this );
258  d->m_vector.append(g);
259  return *this;
260 }
261 
262 void GeoDataMultiTrack::clear()
263 {
264  detach();
265 
266  Q_D(GeoDataMultiTrack);
267  qDeleteAll(d->m_vector);
268  d->m_vector.clear();
269 }
270 
271 void GeoDataMultiTrack::pack( QDataStream& stream ) const
272 {
273  Q_D(const GeoDataMultiTrack);
274 
275  GeoDataGeometry::pack( stream );
276 
277  stream << d->m_vector.size();
278 
280  = d->m_vector.constBegin();
281  iterator != d->m_vector.constEnd();
282  ++iterator ) {
283  const GeoDataTrack *geometry = *iterator;
284  stream << geometry->geometryId();
285  geometry->pack( stream );
286  }
287 }
288 
289 void GeoDataMultiTrack::unpack( QDataStream& stream )
290 {
291  detach();
292 
293  Q_D(GeoDataMultiTrack);
294  GeoDataGeometry::unpack( stream );
295 
296  int size = 0;
297 
298  stream >> size;
299 
300  for( int i = 0; i < size; i++ ) {
301  int geometryId;
302  stream >> geometryId;
303  switch( geometryId ) {
304  case InvalidGeometryId:
305  break;
306  case GeoDataTrackId:
307  {
308  GeoDataTrack *track = new GeoDataTrack;
309  track->unpack( stream );
310  d->m_vector.append( track );
311  }
312  break;
313  case GeoDataModelId:
314  break;
315  default: break;
316  };
317  }
318 }
319 
320 }
void append(const T &value)
QVector::const_iterator constEnd() const const
void unpack(QDataStream &stream) override
Unserialize the contents of the feature from stream.
bool operator==(const Qt3DRender::QGraphicsApiFilter &reference, const Qt3DRender::QGraphicsApiFilter &sample)
Binds a QML item to a specific geodetic location in screen coordinates.
void reserve(int size)
QVector::const_iterator constBegin() const const
void pack(QDataStream &stream) const override
Serialize the contents of the feature to stream.
const QList< QKeySequence > & end()
Q_D(Todo)
QDebug mDebug()
a function to replace qDebug() in Marble library code
Definition: MarbleDebug.cpp:31
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon Oct 2 2023 03:52:08 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.