5 #include "GeoDataMultiTrack.h"
6 #include "GeoDataMultiTrack_p.h"
8 #include "GeoDataLineString.h"
9 #include "GeoDataLinearRing.h"
10 #include "GeoDataPoint.h"
11 #include "GeoDataPolygon.h"
12 #include "GeoDataTrack.h"
13 #include "GeoDataTypes.h"
15 #include "MarbleDebug.h"
17 #include <QDataStream>
23 GeoDataMultiTrack::GeoDataMultiTrack()
24 : GeoDataGeometry( new GeoDataMultiTrackPrivate )
28 GeoDataMultiTrack::GeoDataMultiTrack(
const GeoDataGeometry& other )
29 : GeoDataGeometry( other )
33 GeoDataMultiTrack::~GeoDataMultiTrack()
37 const char *GeoDataMultiTrack::nodeType()
const
39 return GeoDataTypes::GeoDataMultiTrackType;
42 EnumGeometryId GeoDataMultiTrack::geometryId()
const
44 return GeoDataMultiTrackId;
47 GeoDataGeometry *GeoDataMultiTrack::copy()
const
49 return new GeoDataMultiTrack(*
this);
52 bool GeoDataMultiTrack::operator==(
const GeoDataMultiTrack& other )
const
54 if ( !equals(other) )
return false;
56 Q_D(
const GeoDataMultiTrack);
57 const GeoDataMultiTrackPrivate *other_d = other.d_func();
65 for (; d_it != d_end && other_it != other_end; ++d_it, ++other_it) {
66 if ( **d_it != **other_it )
return false;
69 return d_it == d_end && other_it == other_end;
72 bool GeoDataMultiTrack::operator!=(
const GeoDataMultiTrack& other )
const
77 const GeoDataLatLonAltBox& GeoDataMultiTrack::latLonAltBox()
const
79 Q_D(
const GeoDataMultiTrack);
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();
91 d->m_latLonAltBox |= (*it)->latLonAltBox();
95 return d->m_latLonAltBox;
98 int GeoDataMultiTrack::size()
const
100 Q_D(
const GeoDataMultiTrack);
101 return d->m_vector.size();
106 Q_D(
const GeoDataMultiTrack);
109 results.
reserve(d->m_vector.size());
114 for (; it !=
end; ++it) {
115 const GeoDataTrack f(**it);
122 GeoDataTrack& GeoDataMultiTrack::at(
int pos )
127 Q_D(GeoDataMultiTrack);
128 return *(d->m_vector[pos]);
131 const GeoDataTrack& GeoDataMultiTrack::at(
int pos )
const
133 Q_D(
const GeoDataMultiTrack);
134 return *(d->m_vector.at(pos));
137 GeoDataTrack& GeoDataMultiTrack::operator[](
int pos )
141 Q_D(GeoDataMultiTrack);
142 return *(d->m_vector[pos]);
145 const GeoDataTrack& GeoDataMultiTrack::operator[](
int pos )
const
147 Q_D(
const GeoDataMultiTrack);
148 return *(d->m_vector[pos]);
151 GeoDataTrack& GeoDataMultiTrack::last()
155 Q_D(GeoDataMultiTrack);
156 return *(d->m_vector.last());
159 GeoDataTrack& GeoDataMultiTrack::first()
163 Q_D(GeoDataMultiTrack);
164 return *(d->m_vector.first());
167 const GeoDataTrack& GeoDataMultiTrack::last()
const
169 Q_D(
const GeoDataMultiTrack);
170 return *(d->m_vector.last());
173 const GeoDataTrack& GeoDataMultiTrack::first()
const
175 Q_D(
const GeoDataMultiTrack);
176 return *(d->m_vector.first());
183 Q_D(GeoDataMultiTrack);
184 return d->m_vector.begin();
191 Q_D(GeoDataMultiTrack);
192 return d->m_vector.end();
197 Q_D(
const GeoDataMultiTrack);
198 return d->m_vector.constBegin();
203 Q_D(
const GeoDataMultiTrack);
204 return d->m_vector.constEnd();
210 GeoDataTrack* GeoDataMultiTrack::child(
int i )
214 Q_D(
const GeoDataMultiTrack);
215 return d->m_vector.at(i);
218 const GeoDataTrack* GeoDataMultiTrack::child(
int i )
const
220 Q_D(
const GeoDataMultiTrack);
221 return d->m_vector.at(i);
227 int GeoDataMultiTrack::childPosition(
const GeoDataTrack *
object )
const
229 Q_D(
const GeoDataMultiTrack);
230 for (
int i = 0; i < d->m_vector.size(); ++i) {
231 if (d->m_vector.at(i) ==
object) {
241 void GeoDataMultiTrack::append( GeoDataTrack *other )
245 Q_D(GeoDataMultiTrack);
246 other->setParent(
this );
247 d->m_vector.append(other);
251 GeoDataMultiTrack& GeoDataMultiTrack::operator << (
const GeoDataTrack& value )
255 Q_D(GeoDataMultiTrack);
256 GeoDataTrack *g =
new GeoDataTrack( value );
257 g->setParent(
this );
258 d->m_vector.append(g);
262 void GeoDataMultiTrack::clear()
266 Q_D(GeoDataMultiTrack);
267 qDeleteAll(d->m_vector);
271 void GeoDataMultiTrack::pack(
QDataStream& stream )
const
273 Q_D(
const GeoDataMultiTrack);
277 stream << d->m_vector.size();
281 iterator != d->m_vector.constEnd();
283 const GeoDataTrack *geometry = *iterator;
284 stream << geometry->geometryId();
285 geometry->pack( stream );
289 void GeoDataMultiTrack::unpack(
QDataStream& stream )
293 Q_D(GeoDataMultiTrack);
300 for(
int i = 0; i < size; i++ ) {
302 stream >> geometryId;
303 switch( geometryId ) {
304 case InvalidGeometryId:
308 GeoDataTrack *track =
new GeoDataTrack;
309 track->unpack( stream );
310 d->m_vector.append( track );