/**********************************************************************
 *
 * GEOS - Geometry Engine Open Source
 * http://geos.osgeo.org
 *
 * Copyright (C) 2021 Paul Ramsey <pramsey@cleverelephant.ca>
 *
 * This is free software; you can redistribute and/or modify it under
 * the terms of the GNU Lesser General Public Licence as published
 * by the Free Software Foundation.
 * See the COPYING file for more information.
 *
 **********************************************************************/

#pragma once

#include <geos/export.h>

#include <geos/geom/Coordinate.h>
#include <geos/geom/Envelope.h>
#include <geos/noding/Noder.h>
#include <geos/noding/snap/SnappingPointIndex.h>


// Forward declarations
namespace geos {
namespace geom {
class Envelope;
class PrecisionModel;
}
namespace noding {
class SegmentString;
}
}

namespace geos {
namespace noding { // geos::noding

/**
 * A noder which extracts all line segments
 * as SegmentString.
 * This enables fast overlay of geometries which are known to be already fully noded.
 * In particular, it provides fast union of polygonal and linear coverages.
 * Unioning a noded set of lines is an effective way
 * to perform line merging and line dissolving.
 *
 * No precision reduction is carried out.
 * If that is required, another noder must be used (such as a snap-rounding noder),
 * or the input must be precision-reduced beforehand.
 *
 */
class GEOS_DLL SegmentExtractingNoder : public Noder {

private:

    std::vector<SegmentString*>* segList;

    void extractSegments(
        const std::vector<SegmentString*>& inputSegs,
        std::vector<SegmentString*>& outputSegs);

    void extractSegments(
        const SegmentString* ss,
        std::vector<SegmentString*>& outputSegs);


public:

    /**
    * Creates a new segment-extracting noder.
    */
    SegmentExtractingNoder() : segList(nullptr)
        {};

    void computeNodes(std::vector<SegmentString*>* segStrings) override;

    /**
    * @return a Collection of SegmentString representing the
    * substrings. Caller takes ownership over vector and contents.
    */
    std::vector<SegmentString*>* getNodedSubstrings() const override;


};


} // namespace geos::noding
} // namespace geos