File Coverage

/usr/local/lib/perl5/site_perl/5.26.1/x86_64-linux/CPP/geos.x/i/geos/noding/SegmentNodeList.h
Criterion Covered Total %
statement 1 1 100.0
branch n/a
condition n/a
subroutine n/a
pod n/a
total 1 1 100.0


line stmt bran cond sub pod time code
1             /**********************************************************************
2             *
3             * GEOS - Geometry Engine Open Source
4             * http://geos.osgeo.org
5             *
6             * Copyright (C) 2006 Refractions Research Inc.
7             *
8             * This is free software; you can redistribute and/or modify it under
9             * the terms of the GNU Lesser General Public Licence as published
10             * by the Free Software Foundation.
11             * See the COPYING file for more information.
12             *
13             **********************************************************************
14             *
15             * Last port: noding/SegmentNodeList.java rev. 1.8 (JTS-1.10)
16             *
17             **********************************************************************/
18              
19             #ifndef GEOS_NODING_SEGMENTNODELIST_H
20             #define GEOS_NODING_SEGMENTNODELIST_H
21              
22             #include
23              
24             #include
25              
26             #include
27             #include
28             #include
29             #include
30              
31             #include // for composition
32              
33             #ifdef _MSC_VER
34             #pragma warning(push)
35             #pragma warning(disable: 4251) // warning C4251: needs to have dll-interface to be used by clients of class
36             #endif
37              
38             // Forward declarations
39             namespace geos {
40             namespace geom {
41             class CoordinateSequence;
42             }
43             namespace noding {
44             class SegmentString;
45             class NodedSegmentString;
46             }
47             }
48              
49             namespace geos {
50             namespace noding { // geos::noding
51              
52             /** \brief
53             * A list of the SegmentNode present along a
54             * NodedSegmentString.
55             */
56             class GEOS_DLL SegmentNodeList {
57             private:
58             std::set nodeMap;
59              
60             // the parent edge
61             const NodedSegmentString& edge;
62              
63             /**
64             * Checks the correctness of the set of split edges corresponding
65             * to this edge
66             *
67             * @param splitEdges the split edges for this edge (in order)
68             */
69             void checkSplitEdgesCorrectness(std::vector& splitEdges);
70              
71             /**
72             * Create a new "split edge" with the section of points between
73             * (and including) the two intersections.
74             * The label for the new edge is the same as the label for the
75             * parent edge.
76             *
77             * ownership of return value is transferred
78             */
79             SegmentString* createSplitEdge(SegmentNode *ei0, SegmentNode *ei1);
80              
81             /**
82             * Adds nodes for any collapsed edge pairs.
83             * Collapsed edge pairs can be caused by inserted nodes, or they
84             * can be pre-existing in the edge vertex list.
85             * In order to provide the correct fully noded semantics,
86             * the vertex at the base of a collapsed pair must also be added
87             * as a node.
88             */
89             void addCollapsedNodes();
90              
91             /**
92             * Adds nodes for any collapsed edge pairs
93             * which are pre-existing in the vertex list.
94             */
95             void findCollapsesFromExistingVertices(
96             std::vector& collapsedVertexIndexes);
97              
98             /**
99             * Adds nodes for any collapsed edge pairs caused by inserted nodes
100             * Collapsed edge pairs occur when the same coordinate is inserted
101             * as a node both before and after an existing edge vertex.
102             * To provide the correct fully noded semantics,
103             * the vertex must be added as a node as well.
104             */
105             void findCollapsesFromInsertedNodes(
106             std::vector& collapsedVertexIndexes);
107              
108             bool findCollapseIndex(SegmentNode& ei0, SegmentNode& ei1,
109             size_t& collapsedVertexIndex);
110              
111             // Declare type as noncopyable
112             SegmentNodeList(const SegmentNodeList& other) = delete;
113             SegmentNodeList& operator=(const SegmentNodeList& rhs) = delete;
114              
115             public:
116              
117             friend std::ostream& operator<< (std::ostream& os, const SegmentNodeList& l);
118              
119             typedef std::set container;
120             typedef container::iterator iterator;
121             typedef container::const_iterator const_iterator;
122              
123 32           SegmentNodeList(const NodedSegmentString* newEdge): edge(*newEdge) {}
124              
125             SegmentNodeList(const NodedSegmentString& newEdge): edge(newEdge) {}
126              
127             const NodedSegmentString& getEdge() const { return edge; }
128              
129             // TODO: Is this a final class ?
130             // Should remove the virtual in that case
131             virtual ~SegmentNodeList();
132              
133             /**
134             * Adds an intersection into the list, if it isn't already there.
135             * The input segmentIndex is expected to be normalized.
136             *
137             * @return the SegmentIntersection found or added. It will be
138             * destroyed at SegmentNodeList destruction time.
139             *
140             * @param intPt the intersection Coordinate, will be copied
141             * @param segmentIndex
142             */
143             SegmentNode* add(const geom::Coordinate& intPt, std::size_t segmentIndex);
144              
145             SegmentNode* add(const geom::Coordinate *intPt, std::size_t segmentIndex) {
146             return add(*intPt, segmentIndex);
147             }
148              
149             /*
150             * returns the set of SegmentNodes
151             */
152             //replaces iterator()
153             // TODO: obsolete this function
154             std::set* getNodes() { return &nodeMap; }
155              
156             /// Return the number of nodes in this list
157             size_t size() const { return nodeMap.size(); }
158              
159             container::iterator begin() { return nodeMap.begin(); }
160             container::const_iterator begin() const { return nodeMap.begin(); }
161             container::iterator end() { return nodeMap.end(); }
162             container::const_iterator end() const { return nodeMap.end(); }
163              
164             /**
165             * Adds entries for the first and last points of the edge to the list
166             */
167             void addEndpoints();
168              
169             /**
170             * Creates new edges for all the edges that the intersections in this
171             * list split the parent edge into.
172             * Adds the edges to the input list (this is so a single list
173             * can be used to accumulate all split edges for a Geometry).
174             */
175             void addSplitEdges(std::vector& edgeList);
176              
177             void addSplitEdges(std::vector* edgeList) {
178             assert(edgeList);
179             addSplitEdges(*edgeList);
180             }
181              
182             //string print();
183             };
184              
185             std::ostream& operator<< (std::ostream& os, const SegmentNodeList& l);
186              
187             } // namespace geos::noding
188             } // namespace geos
189              
190             #ifdef _MSC_VER
191             #pragma warning(pop)
192             #endif
193              
194             #endif