GEOS: SegmentNodeList.h Source File

- Main Page
- Related Pages
- Namespaces
- Classes
- Files

- File List

# SegmentNodeList.h

    00001 /**********************************************************************
    00002  * $Id: SegmentNodeList.h 2778 2009-12-03 19:44:00Z 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 // Forward declarations
    00035 namespace geos {
    00036         namespace geom {
    00037                 class CoordinateSequence;
    00038         }
    00039         namespace noding {
    00040                 class SegmentString;
    00041                 class NodedSegmentString;
    00042         }
    00043 }
    00044
    00045 namespace geos {
    00046 namespace noding { // geos::noding
    00047
    00052 class GEOS_DLL SegmentNodeList {
    00053 private:
    00054         std::set<SegmentNode*,SegmentNodeLT> nodeMap;
    00055
    00056         // the parent edge
    00057         const NodedSegmentString& edge;
    00058
    00059         // This vector is here to keep track of created splitEdges
    00060         std::vector<SegmentString*> splitEdges;
    00061
    00062         // This vector is here to keep track of created Coordinates
    00063         std::vector<geom::CoordinateSequence*> splitCoordLists;
    00064
    00071         void checkSplitEdgesCorrectness(std::vector<SegmentString*>& splitEdges);
    00072
    00079         SegmentString* createSplitEdge(SegmentNode *ei0, SegmentNode *ei1);
    00080
    00089         void addCollapsedNodes();
    00090
    00095         void findCollapsesFromExistingVertices(
    00096                         std::vector<size_t>& collapsedVertexIndexes);
    00097
    00105         void findCollapsesFromInsertedNodes(
    00106                 std::vector<size_t>& collapsedVertexIndexes);
    00107
    00108         bool findCollapseIndex(SegmentNode& ei0, SegmentNode& ei1,
    00109                 size_t& collapsedVertexIndex);
    00110
    00111     // Declare type as noncopyable
    00112     SegmentNodeList(const SegmentNodeList& other);
    00113     SegmentNodeList& operator=(const SegmentNodeList& rhs);
    00114
    00115 public:
    00116
    00117         friend std::ostream& operator<< (std::ostream& os, const SegmentNodeList& l);
    00118
    00119         typedef std::set<SegmentNode*,SegmentNodeLT> container;
    00120         typedef container::iterator iterator;
    00121         typedef container::const_iterator const_iterator;
    00122
    00123         SegmentNodeList(const NodedSegmentString* newEdge): edge(*newEdge) {}
    00124
    00125         SegmentNodeList(const NodedSegmentString& newEdge): edge(newEdge) {}
    00126
    00127         const NodedSegmentString& getEdge() const { return edge; }
    00128
    00129         // TODO: Is this a final class ?
    00130         // Should remove the virtual in that case
    00131         virtual ~SegmentNodeList();
    00132
    00143         SegmentNode* add(const geom::Coordinate& intPt, size_t segmentIndex);
    00144
    00145         SegmentNode* add(const geom::Coordinate *intPt, size_t segmentIndex) {
    00146                 return add(*intPt, segmentIndex);
    00147         }
    00148
    00149         /*
    00150          * returns the set of SegmentNodes
    00151          */
    00152         //replaces iterator()
    00153         // TODO: obsolete this function
    00154         std::set<SegmentNode*,SegmentNodeLT>* getNodes() { return &nodeMap; }
    00155
    00157         size_t size() const { return nodeMap.size(); }
    00158
    00159         container::iterator begin() { return nodeMap.begin(); }
    00160         container::const_iterator begin() const { return nodeMap.begin(); }
    00161         container::iterator end() { return nodeMap.end(); }
    00162         container::const_iterator end() const { return nodeMap.end(); }
    00163
    00167         void addEndpoints();
    00168
    00175         void addSplitEdges(std::vector<SegmentString*>& edgeList);
    00176
    00177         void addSplitEdges(std::vector<SegmentString*>* edgeList) {
    00178                 assert(edgeList);
    00179                 addSplitEdges(*edgeList);
    00180         }
    00181
    00182         //string print();
    00183 };
    00184
    00185 std::ostream& operator<< (std::ostream& os, const SegmentNodeList& l);
    00186
    00187 } // namespace geos::noding
    00188 } // namespace geos
    00189
    00190 //#ifdef GEOS_INLINE
    00191 //# include "geos/noding/SegmentNodeList.inl"
    00192 //#endif
    00193
    00194 #endif
    00195
    00196 /**********************************************************************
    00197  * $Log$
    00198  * Revision 1.4  2006/06/12 11:29:23  strk
    00199  * unsigned int => size_t
    00200  *
    00201  * Revision 1.3  2006/05/04 07:41:56  strk
    00202  * const-correct size() method for SegmentNodeList
    00203  *
    00204  * Revision 1.2  2006/03/24 09:52:41  strk
    00205  * USE_INLINE => GEOS_INLINE
    00206  *
    00207  * Revision 1.1  2006/03/09 16:46:49  strk
    00208  * geos::geom namespace definition, first pass at headers split
    00209  *
    00210  **********************************************************************/
    00211