GEOS
3.3.9
|
00001 /********************************************************************** 00002 * $Id: SegmentNodeList.h 3255 2011-03-01 17:56:10Z mloskot $ 00003 * 00004 * GEOS - Geometry Engine Open Source 00005 * http://geos.refractions.net 00006 * 00007 * Copyright (C) 2006 Refractions Research Inc. 00008 * 00009 * This is free software; you can redistribute and/or modify it under 00010 * the terms of the GNU Lesser General Public Licence as published 00011 * by the Free Software Foundation. 00012 * See the COPYING file for more information. 00013 * 00014 ********************************************************************** 00015 * 00016 * Last port: noding/SegmentNodeList.java rev. 1.8 (JTS-1.10) 00017 * 00018 **********************************************************************/ 00019 00020 #ifndef GEOS_NODING_SEGMENTNODELIST_H 00021 #define GEOS_NODING_SEGMENTNODELIST_H 00022 00023 #include <geos/export.h> 00024 00025 #include <geos/inline.h> 00026 00027 #include <cassert> 00028 #include <iostream> 00029 #include <vector> 00030 #include <set> 00031 00032 #include <geos/noding/SegmentNode.h> // for composition 00033 00034 #ifdef _MSC_VER 00035 #pragma warning(push) 00036 #pragma warning(disable: 4251) // warning C4251: needs to have dll-interface to be used by clients of class 00037 #endif 00038 00039 // Forward declarations 00040 namespace geos { 00041 namespace geom { 00042 class CoordinateSequence; 00043 } 00044 namespace noding { 00045 class SegmentString; 00046 class NodedSegmentString; 00047 } 00048 } 00049 00050 namespace geos { 00051 namespace noding { // geos::noding 00052 00057 class GEOS_DLL SegmentNodeList { 00058 private: 00059 std::set<SegmentNode*,SegmentNodeLT> nodeMap; 00060 00061 // the parent edge 00062 const NodedSegmentString& edge; 00063 00064 // This vector is here to keep track of created splitEdges 00065 std::vector<SegmentString*> splitEdges; 00066 00067 // This vector is here to keep track of created Coordinates 00068 std::vector<geom::CoordinateSequence*> splitCoordLists; 00069 00076 void checkSplitEdgesCorrectness(std::vector<SegmentString*>& splitEdges); 00077 00084 SegmentString* createSplitEdge(SegmentNode *ei0, SegmentNode *ei1); 00085 00094 void addCollapsedNodes(); 00095 00100 void findCollapsesFromExistingVertices( 00101 std::vector<std::size_t>& collapsedVertexIndexes); 00102 00110 void findCollapsesFromInsertedNodes( 00111 std::vector<std::size_t>& collapsedVertexIndexes); 00112 00113 bool findCollapseIndex(SegmentNode& ei0, SegmentNode& ei1, 00114 size_t& collapsedVertexIndex); 00115 00116 // Declare type as noncopyable 00117 SegmentNodeList(const SegmentNodeList& other); 00118 SegmentNodeList& operator=(const SegmentNodeList& rhs); 00119 00120 public: 00121 00122 friend std::ostream& operator<< (std::ostream& os, const SegmentNodeList& l); 00123 00124 typedef std::set<SegmentNode*,SegmentNodeLT> container; 00125 typedef container::iterator iterator; 00126 typedef container::const_iterator const_iterator; 00127 00128 SegmentNodeList(const NodedSegmentString* newEdge): edge(*newEdge) {} 00129 00130 SegmentNodeList(const NodedSegmentString& newEdge): edge(newEdge) {} 00131 00132 const NodedSegmentString& getEdge() const { return edge; } 00133 00134 // TODO: Is this a final class ? 00135 // Should remove the virtual in that case 00136 virtual ~SegmentNodeList(); 00137 00148 SegmentNode* add(const geom::Coordinate& intPt, std::size_t segmentIndex); 00149 00150 SegmentNode* add(const geom::Coordinate *intPt, std::size_t segmentIndex) { 00151 return add(*intPt, segmentIndex); 00152 } 00153 00154 /* 00155 * returns the set of SegmentNodes 00156 */ 00157 //replaces iterator() 00158 // TODO: obsolete this function 00159 std::set<SegmentNode*,SegmentNodeLT>* getNodes() { return &nodeMap; } 00160 00162 size_t size() const { return nodeMap.size(); } 00163 00164 container::iterator begin() { return nodeMap.begin(); } 00165 container::const_iterator begin() const { return nodeMap.begin(); } 00166 container::iterator end() { return nodeMap.end(); } 00167 container::const_iterator end() const { return nodeMap.end(); } 00168 00172 void addEndpoints(); 00173 00180 void addSplitEdges(std::vector<SegmentString*>& edgeList); 00181 00182 void addSplitEdges(std::vector<SegmentString*>* edgeList) { 00183 assert(edgeList); 00184 addSplitEdges(*edgeList); 00185 } 00186 00187 //string print(); 00188 }; 00189 00190 std::ostream& operator<< (std::ostream& os, const SegmentNodeList& l); 00191 00192 } // namespace geos::noding 00193 } // namespace geos 00194 00195 #ifdef _MSC_VER 00196 #pragma warning(pop) 00197 #endif 00198 00199 //#ifdef GEOS_INLINE 00200 //# include "geos/noding/SegmentNodeList.inl" 00201 //#endif 00202 00203 #endif 00204 00205 /********************************************************************** 00206 * $Log$ 00207 * Revision 1.4 2006/06/12 11:29:23 strk 00208 * unsigned int => size_t 00209 * 00210 * Revision 1.3 2006/05/04 07:41:56 strk 00211 * const-correct size() method for SegmentNodeList 00212 * 00213 * Revision 1.2 2006/03/24 09:52:41 strk 00214 * USE_INLINE => GEOS_INLINE 00215 * 00216 * Revision 1.1 2006/03/09 16:46:49 strk 00217 * geos::geom namespace definition, first pass at headers split 00218 * 00219 **********************************************************************/ 00220