00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef GEOS_GEOM_COORDINATELIST_H
00021 #define GEOS_GEOM_COORDINATELIST_H
00022
00023 #include <geos/export.h>
00024 #include <geos/geom/Coordinate.h>
00025
00026 #include <list>
00027 #include <ostream>
00028 #include <memory>
00029
00030 #ifdef _MSC_VER
00031 #pragma warning(push)
00032 #pragma warning(disable: 4251) // warning C4251: needs to have dll-interface to be used by clients of class
00033 #endif
00034
00035
00036 namespace geos {
00037 namespace geom {
00038
00039 }
00040 }
00041
00042
00043 namespace geos {
00044 namespace geom {
00045
00055 class GEOS_DLL CoordinateList {
00056
00057 public:
00058
00059 typedef std::list<Coordinate>::iterator iterator;
00060 typedef std::list<Coordinate>::const_iterator const_iterator;
00061 typedef std::list<Coordinate>::size_type size_type;
00062
00063 friend std::ostream& operator<< (std::ostream& os,
00064 const CoordinateList& cl);
00065
00075 CoordinateList(const std::vector<Coordinate>& v)
00076 :
00077 coords(v.begin(), v.end())
00078 {
00079 }
00080
00081 CoordinateList()
00082 :
00083 coords()
00084 {
00085 }
00086
00087 size_type size() const
00088 {
00089 return coords.size();
00090 }
00091
00092 bool empty() const
00093 {
00094 return coords.empty();
00095 }
00096
00097 iterator begin()
00098 {
00099 return coords.begin();
00100 }
00101
00102 iterator end()
00103 {
00104 return coords.end();
00105 }
00106
00107 const_iterator begin() const
00108 {
00109 return coords.begin();
00110 }
00111
00112 const_iterator end() const
00113 {
00114 return coords.end();
00115 }
00116
00130 iterator insert(iterator pos, const Coordinate& c, bool allowRepeated)
00131 {
00132 if ( !allowRepeated && pos != coords.begin() ) {
00133 iterator prev = pos; --prev;
00134 if ( c.equals2D(*prev) ) return prev;
00135 }
00136 return coords.insert(pos, c);
00137 }
00138
00139 iterator insert(iterator pos, const Coordinate& c)
00140 {
00141 return coords.insert(pos, c);
00142 }
00143
00144 iterator erase(iterator pos)
00145 {
00146 return coords.erase(pos);
00147 }
00148
00149 iterator erase(iterator first, iterator last)
00150 {
00151 return coords.erase(first, last);
00152 }
00153
00154 std::auto_ptr<Coordinate::Vect> toCoordinateArray() const
00155 {
00156 std::auto_ptr<Coordinate::Vect> ret(new Coordinate::Vect);
00157 ret->assign(coords.begin(), coords.end());
00158 return ret;
00159 }
00160 void closeRing()
00161 {
00162 if(!coords.empty() && ! (*(coords.begin())).equals(*(coords.rbegin())))
00163 {
00164 const Coordinate &c = *(coords.begin());
00165 coords.insert(coords.end(),c);
00166 }
00167 }
00168
00169
00170 private:
00171
00172 std::list<Coordinate> coords;
00173 };
00174
00175 inline
00176 std::ostream& operator<< (std::ostream& os, const CoordinateList& cl)
00177 {
00178 os << "(";
00179 for (CoordinateList::const_iterator
00180 it=cl.begin(), end=cl.end();
00181 it != end;
00182 ++it)
00183 {
00184 const Coordinate& c = *it;
00185 if ( it != cl.begin() ) os << ", ";
00186 os << c;
00187 }
00188 os << ")";
00189
00190 return os;
00191 }
00192
00193 }
00194 }
00195
00196 #ifdef _MSC_VER
00197 #pragma warning(pop)
00198 #endif
00199
00200 #endif // ndef GEOS_GEOM_COORDINATELIST_H