@ladybugmem/icebug 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -0
- package/binding.gyp +54 -0
- package/build/Release/.deps/Release/icebug.node.d +1 -0
- package/build/Release/.deps/Release/obj.target/icebug/src/addon.o.d +291 -0
- package/build/Release/icebug.node +0 -0
- package/build/Release/obj.target/icebug/src/addon.o +0 -0
- package/lib/index.d.ts +361 -0
- package/lib/index.js +102 -0
- package/package.json +42 -0
- package/src/addon.cpp +1253 -0
- package/vendor/include/networkit/GlobalState.hpp +86 -0
- package/vendor/include/networkit/Globals.hpp +41 -0
- package/vendor/include/networkit/algebraic/AlgebraicGlobals.hpp +27 -0
- package/vendor/include/networkit/algebraic/CSRGeneralMatrix.hpp +1292 -0
- package/vendor/include/networkit/algebraic/CSRMatrix.hpp +11 -0
- package/vendor/include/networkit/algebraic/DenseMatrix.hpp +537 -0
- package/vendor/include/networkit/algebraic/DynamicMatrix.hpp +514 -0
- package/vendor/include/networkit/algebraic/GraphBLAS.hpp +323 -0
- package/vendor/include/networkit/algebraic/MatrixTools.hpp +156 -0
- package/vendor/include/networkit/algebraic/Semirings.hpp +171 -0
- package/vendor/include/networkit/algebraic/SparseAccumulator.hpp +111 -0
- package/vendor/include/networkit/algebraic/Vector.hpp +371 -0
- package/vendor/include/networkit/algebraic/algorithms/AlgebraicBFS.hpp +72 -0
- package/vendor/include/networkit/algebraic/algorithms/AlgebraicBellmanFord.hpp +88 -0
- package/vendor/include/networkit/algebraic/algorithms/AlgebraicMatchingCoarsening.hpp +96 -0
- package/vendor/include/networkit/algebraic/algorithms/AlgebraicPageRank.hpp +145 -0
- package/vendor/include/networkit/algebraic/algorithms/AlgebraicSpanningEdgeCentrality.hpp +122 -0
- package/vendor/include/networkit/algebraic/algorithms/AlgebraicTriangleCounting.hpp +76 -0
- package/vendor/include/networkit/auxiliary/AlignedAllocator.hpp +113 -0
- package/vendor/include/networkit/auxiliary/ArrayTools.hpp +85 -0
- package/vendor/include/networkit/auxiliary/BloomFilter.hpp +70 -0
- package/vendor/include/networkit/auxiliary/BucketPQ.hpp +142 -0
- package/vendor/include/networkit/auxiliary/Enforce.hpp +117 -0
- package/vendor/include/networkit/auxiliary/FunctionTraits.hpp +74 -0
- package/vendor/include/networkit/auxiliary/HashUtils.hpp +28 -0
- package/vendor/include/networkit/auxiliary/IncrementalUniformRandomSelector.hpp +52 -0
- package/vendor/include/networkit/auxiliary/Log.hpp +119 -0
- package/vendor/include/networkit/auxiliary/MissingMath.hpp +48 -0
- package/vendor/include/networkit/auxiliary/Multiprecision.hpp +17 -0
- package/vendor/include/networkit/auxiliary/NumberParsing.hpp +307 -0
- package/vendor/include/networkit/auxiliary/NumericTools.hpp +57 -0
- package/vendor/include/networkit/auxiliary/Parallel.hpp +56 -0
- package/vendor/include/networkit/auxiliary/Parallelism.hpp +33 -0
- package/vendor/include/networkit/auxiliary/PrioQueue.hpp +252 -0
- package/vendor/include/networkit/auxiliary/Random.hpp +122 -0
- package/vendor/include/networkit/auxiliary/SetIntersector.hpp +72 -0
- package/vendor/include/networkit/auxiliary/SignalHandling.hpp +39 -0
- package/vendor/include/networkit/auxiliary/SortedList.hpp +128 -0
- package/vendor/include/networkit/auxiliary/SparseVector.hpp +215 -0
- package/vendor/include/networkit/auxiliary/SpinLock.hpp +23 -0
- package/vendor/include/networkit/auxiliary/StringBuilder.hpp +322 -0
- package/vendor/include/networkit/auxiliary/StringTools.hpp +76 -0
- package/vendor/include/networkit/auxiliary/TemplateUtils.hpp +76 -0
- package/vendor/include/networkit/auxiliary/Timer.hpp +145 -0
- package/vendor/include/networkit/auxiliary/VectorComparator.hpp +32 -0
- package/vendor/include/networkit/base/Algorithm.hpp +41 -0
- package/vendor/include/networkit/base/DynAlgorithm.hpp +31 -0
- package/vendor/include/networkit/centrality/ApproxBetweenness.hpp +62 -0
- package/vendor/include/networkit/centrality/ApproxCloseness.hpp +136 -0
- package/vendor/include/networkit/centrality/ApproxElectricalCloseness.hpp +156 -0
- package/vendor/include/networkit/centrality/ApproxGroupBetweenness.hpp +124 -0
- package/vendor/include/networkit/centrality/ApproxSpanningEdge.hpp +84 -0
- package/vendor/include/networkit/centrality/Betweenness.hpp +47 -0
- package/vendor/include/networkit/centrality/Centrality.hpp +98 -0
- package/vendor/include/networkit/centrality/Closeness.hpp +107 -0
- package/vendor/include/networkit/centrality/ComplexPaths.hpp +113 -0
- package/vendor/include/networkit/centrality/CoreDecomposition.hpp +161 -0
- package/vendor/include/networkit/centrality/DegreeCentrality.hpp +55 -0
- package/vendor/include/networkit/centrality/DynApproxBetweenness.hpp +95 -0
- package/vendor/include/networkit/centrality/DynBetweenness.hpp +99 -0
- package/vendor/include/networkit/centrality/DynBetweennessOneNode.hpp +98 -0
- package/vendor/include/networkit/centrality/DynKatzCentrality.hpp +115 -0
- package/vendor/include/networkit/centrality/DynTopHarmonicCloseness.hpp +223 -0
- package/vendor/include/networkit/centrality/EigenvectorCentrality.hpp +41 -0
- package/vendor/include/networkit/centrality/EstimateBetweenness.hpp +51 -0
- package/vendor/include/networkit/centrality/ForestCentrality.hpp +112 -0
- package/vendor/include/networkit/centrality/GedWalk.hpp +225 -0
- package/vendor/include/networkit/centrality/GroupCloseness.hpp +115 -0
- package/vendor/include/networkit/centrality/GroupClosenessGrowShrink.hpp +78 -0
- package/vendor/include/networkit/centrality/GroupClosenessLocalSearch.hpp +77 -0
- package/vendor/include/networkit/centrality/GroupClosenessLocalSwaps.hpp +106 -0
- package/vendor/include/networkit/centrality/GroupDegree.hpp +155 -0
- package/vendor/include/networkit/centrality/GroupHarmonicCloseness.hpp +83 -0
- package/vendor/include/networkit/centrality/HarmonicCloseness.hpp +48 -0
- package/vendor/include/networkit/centrality/KPathCentrality.hpp +52 -0
- package/vendor/include/networkit/centrality/KadabraBetweenness.hpp +242 -0
- package/vendor/include/networkit/centrality/KatzCentrality.hpp +62 -0
- package/vendor/include/networkit/centrality/LaplacianCentrality.hpp +44 -0
- package/vendor/include/networkit/centrality/LocalClusteringCoefficient.hpp +60 -0
- package/vendor/include/networkit/centrality/LocalPartitionCoverage.hpp +43 -0
- package/vendor/include/networkit/centrality/LocalSquareClusteringCoefficient.hpp +42 -0
- package/vendor/include/networkit/centrality/PageRank.hpp +101 -0
- package/vendor/include/networkit/centrality/PermanenceCentrality.hpp +48 -0
- package/vendor/include/networkit/centrality/Sfigality.hpp +45 -0
- package/vendor/include/networkit/centrality/SpanningEdgeCentrality.hpp +86 -0
- package/vendor/include/networkit/centrality/TopCloseness.hpp +136 -0
- package/vendor/include/networkit/centrality/TopHarmonicCloseness.hpp +151 -0
- package/vendor/include/networkit/clique/MaximalCliques.hpp +83 -0
- package/vendor/include/networkit/coarsening/ClusteringProjector.hpp +59 -0
- package/vendor/include/networkit/coarsening/CoarsenedGraphView.hpp +156 -0
- package/vendor/include/networkit/coarsening/GraphCoarsening.hpp +57 -0
- package/vendor/include/networkit/coarsening/MatchingCoarsening.hpp +43 -0
- package/vendor/include/networkit/coarsening/ParallelPartitionCoarsening.hpp +33 -0
- package/vendor/include/networkit/coarsening/ParallelPartitionCoarseningView.hpp +62 -0
- package/vendor/include/networkit/community/AdjustedRandMeasure.hpp +31 -0
- package/vendor/include/networkit/community/ClusteringGenerator.hpp +75 -0
- package/vendor/include/networkit/community/CommunityDetectionAlgorithm.hpp +58 -0
- package/vendor/include/networkit/community/Conductance.hpp +32 -0
- package/vendor/include/networkit/community/CoverF1Similarity.hpp +53 -0
- package/vendor/include/networkit/community/CoverHubDominance.hpp +38 -0
- package/vendor/include/networkit/community/Coverage.hpp +25 -0
- package/vendor/include/networkit/community/CutClustering.hpp +62 -0
- package/vendor/include/networkit/community/DissimilarityMeasure.hpp +31 -0
- package/vendor/include/networkit/community/DynamicNMIDistance.hpp +44 -0
- package/vendor/include/networkit/community/EdgeCut.hpp +24 -0
- package/vendor/include/networkit/community/GraphClusteringTools.hpp +103 -0
- package/vendor/include/networkit/community/GraphStructuralRandMeasure.hpp +28 -0
- package/vendor/include/networkit/community/HubDominance.hpp +46 -0
- package/vendor/include/networkit/community/IntrapartitionDensity.hpp +44 -0
- package/vendor/include/networkit/community/IsolatedInterpartitionConductance.hpp +40 -0
- package/vendor/include/networkit/community/IsolatedInterpartitionExpansion.hpp +40 -0
- package/vendor/include/networkit/community/JaccardMeasure.hpp +25 -0
- package/vendor/include/networkit/community/LFM.hpp +49 -0
- package/vendor/include/networkit/community/LPDegreeOrdered.hpp +48 -0
- package/vendor/include/networkit/community/LocalCommunityEvaluation.hpp +100 -0
- package/vendor/include/networkit/community/LocalCoverEvaluation.hpp +31 -0
- package/vendor/include/networkit/community/LocalPartitionEvaluation.hpp +31 -0
- package/vendor/include/networkit/community/LouvainMapEquation.hpp +135 -0
- package/vendor/include/networkit/community/Modularity.hpp +54 -0
- package/vendor/include/networkit/community/NMIDistance.hpp +28 -0
- package/vendor/include/networkit/community/NodeStructuralRandMeasure.hpp +27 -0
- package/vendor/include/networkit/community/OverlappingCommunityDetectionAlgorithm.hpp +51 -0
- package/vendor/include/networkit/community/OverlappingNMIDistance.hpp +175 -0
- package/vendor/include/networkit/community/PLM.hpp +89 -0
- package/vendor/include/networkit/community/PLP.hpp +83 -0
- package/vendor/include/networkit/community/ParallelAgglomerativeClusterer.hpp +37 -0
- package/vendor/include/networkit/community/ParallelLeiden.hpp +96 -0
- package/vendor/include/networkit/community/ParallelLeidenView.hpp +138 -0
- package/vendor/include/networkit/community/PartitionFragmentation.hpp +30 -0
- package/vendor/include/networkit/community/PartitionHubDominance.hpp +37 -0
- package/vendor/include/networkit/community/PartitionIntersection.hpp +25 -0
- package/vendor/include/networkit/community/QualityMeasure.hpp +27 -0
- package/vendor/include/networkit/community/SampledGraphStructuralRandMeasure.hpp +40 -0
- package/vendor/include/networkit/community/SampledNodeStructuralRandMeasure.hpp +40 -0
- package/vendor/include/networkit/community/StablePartitionNodes.hpp +48 -0
- package/vendor/include/networkit/components/BiconnectedComponents.hpp +116 -0
- package/vendor/include/networkit/components/ComponentDecomposition.hpp +72 -0
- package/vendor/include/networkit/components/ConnectedComponents.hpp +55 -0
- package/vendor/include/networkit/components/DynConnectedComponents.hpp +71 -0
- package/vendor/include/networkit/components/DynWeaklyConnectedComponents.hpp +73 -0
- package/vendor/include/networkit/components/ParallelConnectedComponents.hpp +44 -0
- package/vendor/include/networkit/components/RandomSpanningForest.hpp +36 -0
- package/vendor/include/networkit/components/StronglyConnectedComponents.hpp +50 -0
- package/vendor/include/networkit/components/WeaklyConnectedComponents.hpp +59 -0
- package/vendor/include/networkit/correlation/Assortativity.hpp +64 -0
- package/vendor/include/networkit/distance/APSP.hpp +70 -0
- package/vendor/include/networkit/distance/AStar.hpp +68 -0
- package/vendor/include/networkit/distance/AStarGeneral.hpp +110 -0
- package/vendor/include/networkit/distance/AdamicAdarDistance.hpp +52 -0
- package/vendor/include/networkit/distance/AffectedNodes.hpp +130 -0
- package/vendor/include/networkit/distance/AlgebraicDistance.hpp +63 -0
- package/vendor/include/networkit/distance/BFS.hpp +43 -0
- package/vendor/include/networkit/distance/BidirectionalBFS.hpp +51 -0
- package/vendor/include/networkit/distance/BidirectionalDijkstra.hpp +69 -0
- package/vendor/include/networkit/distance/CommuteTimeDistance.hpp +89 -0
- package/vendor/include/networkit/distance/Diameter.hpp +97 -0
- package/vendor/include/networkit/distance/Dijkstra.hpp +50 -0
- package/vendor/include/networkit/distance/DynAPSP.hpp +67 -0
- package/vendor/include/networkit/distance/DynBFS.hpp +56 -0
- package/vendor/include/networkit/distance/DynDijkstra.hpp +57 -0
- package/vendor/include/networkit/distance/DynPrunedLandmarkLabeling.hpp +67 -0
- package/vendor/include/networkit/distance/DynSSSP.hpp +87 -0
- package/vendor/include/networkit/distance/Eccentricity.hpp +32 -0
- package/vendor/include/networkit/distance/EffectiveDiameter.hpp +47 -0
- package/vendor/include/networkit/distance/EffectiveDiameterApproximation.hpp +57 -0
- package/vendor/include/networkit/distance/FloydWarshall.hpp +93 -0
- package/vendor/include/networkit/distance/GraphDistance.hpp +49 -0
- package/vendor/include/networkit/distance/HopPlotApproximation.hpp +62 -0
- package/vendor/include/networkit/distance/IncompleteDijkstra.hpp +66 -0
- package/vendor/include/networkit/distance/IncompleteSSSP.hpp +41 -0
- package/vendor/include/networkit/distance/JaccardDistance.hpp +57 -0
- package/vendor/include/networkit/distance/MultiTargetBFS.hpp +32 -0
- package/vendor/include/networkit/distance/MultiTargetDijkstra.hpp +40 -0
- package/vendor/include/networkit/distance/NeighborhoodFunction.hpp +47 -0
- package/vendor/include/networkit/distance/NeighborhoodFunctionApproximation.hpp +56 -0
- package/vendor/include/networkit/distance/NeighborhoodFunctionHeuristic.hpp +56 -0
- package/vendor/include/networkit/distance/NodeDistance.hpp +54 -0
- package/vendor/include/networkit/distance/PrunedLandmarkLabeling.hpp +76 -0
- package/vendor/include/networkit/distance/ReverseBFS.hpp +46 -0
- package/vendor/include/networkit/distance/SPSP.hpp +143 -0
- package/vendor/include/networkit/distance/SSSP.hpp +216 -0
- package/vendor/include/networkit/distance/STSP.hpp +193 -0
- package/vendor/include/networkit/distance/Volume.hpp +66 -0
- package/vendor/include/networkit/dynamics/DGSStreamParser.hpp +40 -0
- package/vendor/include/networkit/dynamics/DGSWriter.hpp +30 -0
- package/vendor/include/networkit/dynamics/GraphDifference.hpp +110 -0
- package/vendor/include/networkit/dynamics/GraphEvent.hpp +55 -0
- package/vendor/include/networkit/dynamics/GraphEventHandler.hpp +39 -0
- package/vendor/include/networkit/dynamics/GraphEventProxy.hpp +55 -0
- package/vendor/include/networkit/dynamics/GraphUpdater.hpp +38 -0
- package/vendor/include/networkit/edgescores/ChibaNishizekiQuadrangleEdgeScore.hpp +26 -0
- package/vendor/include/networkit/edgescores/ChibaNishizekiTriangleEdgeScore.hpp +33 -0
- package/vendor/include/networkit/edgescores/EdgeScore.hpp +50 -0
- package/vendor/include/networkit/edgescores/EdgeScoreAsWeight.hpp +33 -0
- package/vendor/include/networkit/edgescores/EdgeScoreBlender.hpp +33 -0
- package/vendor/include/networkit/edgescores/EdgeScoreLinearizer.hpp +32 -0
- package/vendor/include/networkit/edgescores/EdgeScoreNormalizer.hpp +35 -0
- package/vendor/include/networkit/edgescores/GeometricMeanScore.hpp +29 -0
- package/vendor/include/networkit/edgescores/PrefixJaccardScore.hpp +23 -0
- package/vendor/include/networkit/edgescores/TriangleEdgeScore.hpp +39 -0
- package/vendor/include/networkit/embedding/Node2Vec.hpp +83 -0
- package/vendor/include/networkit/flow/EdmondsKarp.hpp +112 -0
- package/vendor/include/networkit/generators/BarabasiAlbertGenerator.hpp +87 -0
- package/vendor/include/networkit/generators/ChungLuGenerator.hpp +46 -0
- package/vendor/include/networkit/generators/ChungLuGeneratorAlamEtAl.hpp +63 -0
- package/vendor/include/networkit/generators/ClusteredRandomGraphGenerator.hpp +56 -0
- package/vendor/include/networkit/generators/ConfigurationModel.hpp +36 -0
- package/vendor/include/networkit/generators/DorogovtsevMendesGenerator.hpp +33 -0
- package/vendor/include/networkit/generators/DynamicBarabasiAlbertGenerator.hpp +33 -0
- package/vendor/include/networkit/generators/DynamicDGSParser.hpp +51 -0
- package/vendor/include/networkit/generators/DynamicDorogovtsevMendesGenerator.hpp +34 -0
- package/vendor/include/networkit/generators/DynamicForestFireGenerator.hpp +55 -0
- package/vendor/include/networkit/generators/DynamicGraphGenerator.hpp +40 -0
- package/vendor/include/networkit/generators/DynamicGraphSource.hpp +79 -0
- package/vendor/include/networkit/generators/DynamicHyperbolicGenerator.hpp +143 -0
- package/vendor/include/networkit/generators/DynamicPathGenerator.hpp +26 -0
- package/vendor/include/networkit/generators/DynamicPubWebGenerator.hpp +54 -0
- package/vendor/include/networkit/generators/EdgeSwitchingMarkovChainGenerator.hpp +65 -0
- package/vendor/include/networkit/generators/ErdosRenyiEnumerator.hpp +318 -0
- package/vendor/include/networkit/generators/ErdosRenyiGenerator.hpp +56 -0
- package/vendor/include/networkit/generators/HavelHakimiGenerator.hpp +48 -0
- package/vendor/include/networkit/generators/HyperbolicGenerator.hpp +236 -0
- package/vendor/include/networkit/generators/LFRGenerator.hpp +175 -0
- package/vendor/include/networkit/generators/MocnikGenerator.hpp +147 -0
- package/vendor/include/networkit/generators/MocnikGeneratorBasic.hpp +58 -0
- package/vendor/include/networkit/generators/PowerlawDegreeSequence.hpp +128 -0
- package/vendor/include/networkit/generators/PubWebGenerator.hpp +94 -0
- package/vendor/include/networkit/generators/RegularRingLatticeGenerator.hpp +37 -0
- package/vendor/include/networkit/generators/RmatGenerator.hpp +67 -0
- package/vendor/include/networkit/generators/StaticDegreeSequenceGenerator.hpp +42 -0
- package/vendor/include/networkit/generators/StaticGraphGenerator.hpp +30 -0
- package/vendor/include/networkit/generators/StochasticBlockmodel.hpp +41 -0
- package/vendor/include/networkit/generators/WattsStrogatzGenerator.hpp +43 -0
- package/vendor/include/networkit/generators/quadtree/QuadNode.hpp +857 -0
- package/vendor/include/networkit/generators/quadtree/QuadNodeCartesianEuclid.hpp +587 -0
- package/vendor/include/networkit/generators/quadtree/QuadNodePolarEuclid.hpp +726 -0
- package/vendor/include/networkit/generators/quadtree/Quadtree.hpp +232 -0
- package/vendor/include/networkit/generators/quadtree/QuadtreeCartesianEuclid.hpp +149 -0
- package/vendor/include/networkit/generators/quadtree/QuadtreePolarEuclid.hpp +143 -0
- package/vendor/include/networkit/geometric/HyperbolicSpace.hpp +248 -0
- package/vendor/include/networkit/geometric/Point2DWithIndex.hpp +145 -0
- package/vendor/include/networkit/global/ClusteringCoefficient.hpp +42 -0
- package/vendor/include/networkit/global/GlobalClusteringCoefficient.hpp +24 -0
- package/vendor/include/networkit/graph/Attributes.hpp +568 -0
- package/vendor/include/networkit/graph/BFS.hpp +111 -0
- package/vendor/include/networkit/graph/DFS.hpp +71 -0
- package/vendor/include/networkit/graph/Dijkstra.hpp +83 -0
- package/vendor/include/networkit/graph/EdgeIterators.hpp +171 -0
- package/vendor/include/networkit/graph/Graph.hpp +2083 -0
- package/vendor/include/networkit/graph/GraphBuilder.hpp +289 -0
- package/vendor/include/networkit/graph/GraphR.hpp +133 -0
- package/vendor/include/networkit/graph/GraphTools.hpp +589 -0
- package/vendor/include/networkit/graph/GraphW.hpp +1236 -0
- package/vendor/include/networkit/graph/KruskalMSF.hpp +50 -0
- package/vendor/include/networkit/graph/NeighborIterators.hpp +163 -0
- package/vendor/include/networkit/graph/NodeIterators.hpp +127 -0
- package/vendor/include/networkit/graph/PrimMSF.hpp +66 -0
- package/vendor/include/networkit/graph/RandomMaximumSpanningForest.hpp +133 -0
- package/vendor/include/networkit/graph/SpanningForest.hpp +41 -0
- package/vendor/include/networkit/graph/TopologicalSort.hpp +87 -0
- package/vendor/include/networkit/graph/UnionMaximumSpanningForest.hpp +126 -0
- package/vendor/include/networkit/graph/test/GraphBuilderBenchmark.hpp +68 -0
- package/vendor/include/networkit/independentset/IndependentSetFinder.hpp +44 -0
- package/vendor/include/networkit/independentset/Luby.hpp +27 -0
- package/vendor/include/networkit/io/BinaryEdgeListPartitionReader.hpp +45 -0
- package/vendor/include/networkit/io/BinaryEdgeListPartitionWriter.hpp +47 -0
- package/vendor/include/networkit/io/BinaryPartitionReader.hpp +41 -0
- package/vendor/include/networkit/io/BinaryPartitionWriter.hpp +44 -0
- package/vendor/include/networkit/io/CoverReader.hpp +27 -0
- package/vendor/include/networkit/io/CoverWriter.hpp +21 -0
- package/vendor/include/networkit/io/DGSReader.hpp +39 -0
- package/vendor/include/networkit/io/DibapGraphReader.hpp +43 -0
- package/vendor/include/networkit/io/DotGraphWriter.hpp +39 -0
- package/vendor/include/networkit/io/DotPartitionWriter.hpp +23 -0
- package/vendor/include/networkit/io/DynamicGraphReader.hpp +29 -0
- package/vendor/include/networkit/io/EdgeListCoverReader.hpp +35 -0
- package/vendor/include/networkit/io/EdgeListPartitionReader.hpp +43 -0
- package/vendor/include/networkit/io/EdgeListReader.hpp +61 -0
- package/vendor/include/networkit/io/EdgeListWriter.hpp +48 -0
- package/vendor/include/networkit/io/GMLGraphReader.hpp +33 -0
- package/vendor/include/networkit/io/GMLGraphWriter.hpp +33 -0
- package/vendor/include/networkit/io/GraphIO.hpp +52 -0
- package/vendor/include/networkit/io/GraphReader.hpp +40 -0
- package/vendor/include/networkit/io/GraphToolBinaryReader.hpp +71 -0
- package/vendor/include/networkit/io/GraphToolBinaryWriter.hpp +61 -0
- package/vendor/include/networkit/io/GraphWriter.hpp +27 -0
- package/vendor/include/networkit/io/KONECTGraphReader.hpp +44 -0
- package/vendor/include/networkit/io/LineFileReader.hpp +42 -0
- package/vendor/include/networkit/io/METISGraphReader.hpp +36 -0
- package/vendor/include/networkit/io/METISGraphWriter.hpp +29 -0
- package/vendor/include/networkit/io/METISParser.hpp +63 -0
- package/vendor/include/networkit/io/MTXGraphReader.hpp +31 -0
- package/vendor/include/networkit/io/MTXParser.hpp +87 -0
- package/vendor/include/networkit/io/MatrixMarketReader.hpp +33 -0
- package/vendor/include/networkit/io/MatrixReader.hpp +33 -0
- package/vendor/include/networkit/io/MemoryMappedFile.hpp +80 -0
- package/vendor/include/networkit/io/NetworkitBinaryGraph.hpp +144 -0
- package/vendor/include/networkit/io/NetworkitBinaryReader.hpp +50 -0
- package/vendor/include/networkit/io/NetworkitBinaryWriter.hpp +71 -0
- package/vendor/include/networkit/io/PartitionReader.hpp +34 -0
- package/vendor/include/networkit/io/PartitionWriter.hpp +31 -0
- package/vendor/include/networkit/io/RBGraphReader.hpp +37 -0
- package/vendor/include/networkit/io/RBMatrixReader.hpp +49 -0
- package/vendor/include/networkit/io/RasterReader.hpp +40 -0
- package/vendor/include/networkit/io/SNAPEdgeListPartitionReader.hpp +28 -0
- package/vendor/include/networkit/io/SNAPGraphReader.hpp +53 -0
- package/vendor/include/networkit/io/SNAPGraphWriter.hpp +53 -0
- package/vendor/include/networkit/io/ThrillGraphBinaryReader.hpp +44 -0
- package/vendor/include/networkit/io/ThrillGraphBinaryWriter.hpp +27 -0
- package/vendor/include/networkit/layout/LayoutAlgorithm.hpp +39 -0
- package/vendor/include/networkit/linkprediction/AdamicAdarIndex.hpp +37 -0
- package/vendor/include/networkit/linkprediction/AdjustedRandIndex.hpp +36 -0
- package/vendor/include/networkit/linkprediction/AlgebraicDistanceIndex.hpp +70 -0
- package/vendor/include/networkit/linkprediction/CommonNeighborsIndex.hpp +39 -0
- package/vendor/include/networkit/linkprediction/EvaluationMetric.hpp +135 -0
- package/vendor/include/networkit/linkprediction/JaccardIndex.hpp +44 -0
- package/vendor/include/networkit/linkprediction/KatzIndex.hpp +84 -0
- package/vendor/include/networkit/linkprediction/LinkPredictor.hpp +98 -0
- package/vendor/include/networkit/linkprediction/LinkThresholder.hpp +56 -0
- package/vendor/include/networkit/linkprediction/MissingLinksFinder.hpp +60 -0
- package/vendor/include/networkit/linkprediction/NeighborhoodDistanceIndex.hpp +42 -0
- package/vendor/include/networkit/linkprediction/NeighborhoodUtility.hpp +54 -0
- package/vendor/include/networkit/linkprediction/NeighborsMeasureIndex.hpp +48 -0
- package/vendor/include/networkit/linkprediction/PrecisionRecallMetric.hpp +40 -0
- package/vendor/include/networkit/linkprediction/PredictionsSorter.hpp +66 -0
- package/vendor/include/networkit/linkprediction/PreferentialAttachmentIndex.hpp +37 -0
- package/vendor/include/networkit/linkprediction/ROCMetric.hpp +39 -0
- package/vendor/include/networkit/linkprediction/RandomLinkSampler.hpp +47 -0
- package/vendor/include/networkit/linkprediction/ResourceAllocationIndex.hpp +38 -0
- package/vendor/include/networkit/linkprediction/SameCommunityIndex.hpp +50 -0
- package/vendor/include/networkit/linkprediction/TotalNeighborsIndex.hpp +39 -0
- package/vendor/include/networkit/linkprediction/UDegreeIndex.hpp +35 -0
- package/vendor/include/networkit/linkprediction/VDegreeIndex.hpp +35 -0
- package/vendor/include/networkit/matching/BMatcher.hpp +52 -0
- package/vendor/include/networkit/matching/BMatching.hpp +115 -0
- package/vendor/include/networkit/matching/BSuitorMatcher.hpp +170 -0
- package/vendor/include/networkit/matching/DynamicBSuitorMatcher.hpp +78 -0
- package/vendor/include/networkit/matching/LocalMaxMatcher.hpp +35 -0
- package/vendor/include/networkit/matching/Matcher.hpp +55 -0
- package/vendor/include/networkit/matching/Matching.hpp +111 -0
- package/vendor/include/networkit/matching/PathGrowingMatcher.hpp +46 -0
- package/vendor/include/networkit/matching/SuitorMatcher.hpp +62 -0
- package/vendor/include/networkit/numerics/ConjugateGradient.hpp +163 -0
- package/vendor/include/networkit/numerics/GaussSeidelRelaxation.hpp +99 -0
- package/vendor/include/networkit/numerics/LAMG/LAMGSettings.hpp +70 -0
- package/vendor/include/networkit/numerics/LAMG/Lamg.hpp +460 -0
- package/vendor/include/networkit/numerics/LAMG/Level/EliminationStage.hpp +47 -0
- package/vendor/include/networkit/numerics/LAMG/Level/Level.hpp +56 -0
- package/vendor/include/networkit/numerics/LAMG/Level/LevelAggregation.hpp +52 -0
- package/vendor/include/networkit/numerics/LAMG/Level/LevelElimination.hpp +133 -0
- package/vendor/include/networkit/numerics/LAMG/Level/LevelFinest.hpp +28 -0
- package/vendor/include/networkit/numerics/LAMG/LevelHierarchy.hpp +165 -0
- package/vendor/include/networkit/numerics/LAMG/MultiLevelSetup.hpp +1090 -0
- package/vendor/include/networkit/numerics/LAMG/SolverLamg.hpp +316 -0
- package/vendor/include/networkit/numerics/LinearSolver.hpp +151 -0
- package/vendor/include/networkit/numerics/Preconditioner/DiagonalPreconditioner.hpp +61 -0
- package/vendor/include/networkit/numerics/Preconditioner/IdentityPreconditioner.hpp +36 -0
- package/vendor/include/networkit/numerics/Smoother.hpp +37 -0
- package/vendor/include/networkit/overlap/HashingOverlapper.hpp +28 -0
- package/vendor/include/networkit/overlap/Overlapper.hpp +27 -0
- package/vendor/include/networkit/planarity/LeftRightPlanarityCheck.hpp +113 -0
- package/vendor/include/networkit/randomization/Curveball.hpp +49 -0
- package/vendor/include/networkit/randomization/CurveballGlobalTradeGenerator.hpp +39 -0
- package/vendor/include/networkit/randomization/CurveballUniformTradeGenerator.hpp +39 -0
- package/vendor/include/networkit/randomization/DegreePreservingShuffle.hpp +82 -0
- package/vendor/include/networkit/randomization/EdgeSwitching.hpp +157 -0
- package/vendor/include/networkit/randomization/GlobalCurveball.hpp +69 -0
- package/vendor/include/networkit/randomization/GlobalTradeSequence.hpp +303 -0
- package/vendor/include/networkit/reachability/AllSimplePaths.hpp +122 -0
- package/vendor/include/networkit/reachability/ReachableNodes.hpp +83 -0
- package/vendor/include/networkit/scd/ApproximatePageRank.hpp +51 -0
- package/vendor/include/networkit/scd/CliqueDetect.hpp +55 -0
- package/vendor/include/networkit/scd/CombinedSCD.hpp +51 -0
- package/vendor/include/networkit/scd/GCE.hpp +42 -0
- package/vendor/include/networkit/scd/LFMLocal.hpp +54 -0
- package/vendor/include/networkit/scd/LocalT.hpp +40 -0
- package/vendor/include/networkit/scd/LocalTightnessExpansion.hpp +46 -0
- package/vendor/include/networkit/scd/PageRankNibble.hpp +55 -0
- package/vendor/include/networkit/scd/RandomBFS.hpp +33 -0
- package/vendor/include/networkit/scd/SCDGroundTruthComparison.hpp +121 -0
- package/vendor/include/networkit/scd/SelectiveCommunityDetector.hpp +76 -0
- package/vendor/include/networkit/scd/SetConductance.hpp +47 -0
- package/vendor/include/networkit/scd/TCE.hpp +41 -0
- package/vendor/include/networkit/scd/TwoPhaseL.hpp +40 -0
- package/vendor/include/networkit/scoring/EdgeScoring.hpp +44 -0
- package/vendor/include/networkit/scoring/ModularityScoring.hpp +79 -0
- package/vendor/include/networkit/simulation/EpidemicSimulationSEIR.hpp +59 -0
- package/vendor/include/networkit/sparsification/ChanceCorrectedTriangleScore.hpp +28 -0
- package/vendor/include/networkit/sparsification/ForestFireScore.hpp +34 -0
- package/vendor/include/networkit/sparsification/GlobalThresholdFilter.hpp +40 -0
- package/vendor/include/networkit/sparsification/LocalDegreeScore.hpp +30 -0
- package/vendor/include/networkit/sparsification/LocalFilterScore.hpp +124 -0
- package/vendor/include/networkit/sparsification/LocalSimilarityScore.hpp +63 -0
- package/vendor/include/networkit/sparsification/MultiscaleScore.hpp +38 -0
- package/vendor/include/networkit/sparsification/RandomEdgeScore.hpp +33 -0
- package/vendor/include/networkit/sparsification/RandomNodeEdgeScore.hpp +29 -0
- package/vendor/include/networkit/sparsification/SCANStructuralSimilarityScore.hpp +23 -0
- package/vendor/include/networkit/sparsification/SimmelianOverlapScore.hpp +35 -0
- package/vendor/include/networkit/sparsification/SimmelianScore.hpp +92 -0
- package/vendor/include/networkit/sparsification/Sparsifiers.hpp +166 -0
- package/vendor/include/networkit/structures/Cover.hpp +248 -0
- package/vendor/include/networkit/structures/LocalCommunity.hpp +363 -0
- package/vendor/include/networkit/structures/Partition.hpp +335 -0
- package/vendor/include/networkit/structures/UnionFind.hpp +66 -0
- package/vendor/include/networkit/viz/GraphLayoutAlgorithm.hpp +157 -0
- package/vendor/include/networkit/viz/MaxentStress.hpp +346 -0
- package/vendor/include/networkit/viz/Octree.hpp +428 -0
- package/vendor/include/networkit/viz/PivotMDS.hpp +63 -0
- package/vendor/include/networkit/viz/Point.hpp +415 -0
- package/vendor/include/networkit/viz/PostscriptWriter.hpp +78 -0
- package/vendor/include/tlx/algorithm/exclusive_scan.hpp +56 -0
- package/vendor/include/tlx/algorithm/is_sorted_cmp.hpp +56 -0
- package/vendor/include/tlx/algorithm/merge_advance.hpp +177 -0
- package/vendor/include/tlx/algorithm/merge_combine.hpp +76 -0
- package/vendor/include/tlx/algorithm/multisequence_partition.hpp +346 -0
- package/vendor/include/tlx/algorithm/multisequence_selection.hpp +351 -0
- package/vendor/include/tlx/algorithm/multiway_merge.hpp +1385 -0
- package/vendor/include/tlx/algorithm/multiway_merge_splitting.hpp +257 -0
- package/vendor/include/tlx/algorithm/parallel_multiway_merge.hpp +408 -0
- package/vendor/include/tlx/algorithm/random_bipartition_shuffle.hpp +116 -0
- package/vendor/include/tlx/algorithm.hpp +36 -0
- package/vendor/include/tlx/allocator_base.hpp +100 -0
- package/vendor/include/tlx/backtrace.hpp +54 -0
- package/vendor/include/tlx/cmdline_parser.hpp +498 -0
- package/vendor/include/tlx/container/btree.hpp +3977 -0
- package/vendor/include/tlx/container/btree_map.hpp +634 -0
- package/vendor/include/tlx/container/btree_multimap.hpp +627 -0
- package/vendor/include/tlx/container/btree_multiset.hpp +612 -0
- package/vendor/include/tlx/container/btree_set.hpp +612 -0
- package/vendor/include/tlx/container/d_ary_addressable_int_heap.hpp +416 -0
- package/vendor/include/tlx/container/d_ary_heap.hpp +311 -0
- package/vendor/include/tlx/container/loser_tree.hpp +1009 -0
- package/vendor/include/tlx/container/lru_cache.hpp +319 -0
- package/vendor/include/tlx/container/radix_heap.hpp +735 -0
- package/vendor/include/tlx/container/ring_buffer.hpp +428 -0
- package/vendor/include/tlx/container/simple_vector.hpp +304 -0
- package/vendor/include/tlx/container/splay_tree.hpp +399 -0
- package/vendor/include/tlx/container/string_view.hpp +805 -0
- package/vendor/include/tlx/container.hpp +40 -0
- package/vendor/include/tlx/counting_ptr.hpp +522 -0
- package/vendor/include/tlx/define/attribute_always_inline.hpp +34 -0
- package/vendor/include/tlx/define/attribute_fallthrough.hpp +36 -0
- package/vendor/include/tlx/define/attribute_format_printf.hpp +34 -0
- package/vendor/include/tlx/define/attribute_packed.hpp +34 -0
- package/vendor/include/tlx/define/attribute_warn_unused_result.hpp +34 -0
- package/vendor/include/tlx/define/constexpr.hpp +31 -0
- package/vendor/include/tlx/define/deprecated.hpp +39 -0
- package/vendor/include/tlx/define/endian.hpp +49 -0
- package/vendor/include/tlx/define/likely.hpp +33 -0
- package/vendor/include/tlx/define/visibility_hidden.hpp +34 -0
- package/vendor/include/tlx/define.hpp +36 -0
- package/vendor/include/tlx/delegate.hpp +524 -0
- package/vendor/include/tlx/die/core.hpp +311 -0
- package/vendor/include/tlx/die.hpp +106 -0
- package/vendor/include/tlx/digest/md5.hpp +81 -0
- package/vendor/include/tlx/digest/sha1.hpp +81 -0
- package/vendor/include/tlx/digest/sha256.hpp +81 -0
- package/vendor/include/tlx/digest/sha512.hpp +81 -0
- package/vendor/include/tlx/digest.hpp +30 -0
- package/vendor/include/tlx/logger/all.hpp +33 -0
- package/vendor/include/tlx/logger/array.hpp +43 -0
- package/vendor/include/tlx/logger/core.hpp +287 -0
- package/vendor/include/tlx/logger/deque.hpp +42 -0
- package/vendor/include/tlx/logger/map.hpp +65 -0
- package/vendor/include/tlx/logger/set.hpp +60 -0
- package/vendor/include/tlx/logger/tuple.hpp +66 -0
- package/vendor/include/tlx/logger/unordered_map.hpp +68 -0
- package/vendor/include/tlx/logger/unordered_set.hpp +64 -0
- package/vendor/include/tlx/logger/wrap_unprintable.hpp +75 -0
- package/vendor/include/tlx/logger.hpp +44 -0
- package/vendor/include/tlx/math/abs_diff.hpp +35 -0
- package/vendor/include/tlx/math/aggregate.hpp +231 -0
- package/vendor/include/tlx/math/aggregate_min_max.hpp +116 -0
- package/vendor/include/tlx/math/bswap.hpp +148 -0
- package/vendor/include/tlx/math/bswap_be.hpp +79 -0
- package/vendor/include/tlx/math/bswap_le.hpp +79 -0
- package/vendor/include/tlx/math/clz.hpp +174 -0
- package/vendor/include/tlx/math/ctz.hpp +174 -0
- package/vendor/include/tlx/math/div_ceil.hpp +36 -0
- package/vendor/include/tlx/math/ffs.hpp +123 -0
- package/vendor/include/tlx/math/integer_log2.hpp +189 -0
- package/vendor/include/tlx/math/is_power_of_two.hpp +74 -0
- package/vendor/include/tlx/math/polynomial_regression.hpp +243 -0
- package/vendor/include/tlx/math/popcount.hpp +173 -0
- package/vendor/include/tlx/math/power_to_the.hpp +44 -0
- package/vendor/include/tlx/math/rol.hpp +112 -0
- package/vendor/include/tlx/math/ror.hpp +112 -0
- package/vendor/include/tlx/math/round_to_power_of_two.hpp +121 -0
- package/vendor/include/tlx/math/round_up.hpp +36 -0
- package/vendor/include/tlx/math/sgn.hpp +38 -0
- package/vendor/include/tlx/math.hpp +46 -0
- package/vendor/include/tlx/meta/apply_tuple.hpp +55 -0
- package/vendor/include/tlx/meta/call_for_range.hpp +78 -0
- package/vendor/include/tlx/meta/call_foreach.hpp +60 -0
- package/vendor/include/tlx/meta/call_foreach_tuple.hpp +60 -0
- package/vendor/include/tlx/meta/call_foreach_tuple_with_index.hpp +61 -0
- package/vendor/include/tlx/meta/call_foreach_with_index.hpp +64 -0
- package/vendor/include/tlx/meta/enable_if.hpp +37 -0
- package/vendor/include/tlx/meta/fold_left.hpp +63 -0
- package/vendor/include/tlx/meta/fold_left_tuple.hpp +60 -0
- package/vendor/include/tlx/meta/fold_right.hpp +63 -0
- package/vendor/include/tlx/meta/fold_right_tuple.hpp +60 -0
- package/vendor/include/tlx/meta/function_chain.hpp +197 -0
- package/vendor/include/tlx/meta/function_stack.hpp +189 -0
- package/vendor/include/tlx/meta/has_member.hpp +80 -0
- package/vendor/include/tlx/meta/has_method.hpp +117 -0
- package/vendor/include/tlx/meta/index_sequence.hpp +66 -0
- package/vendor/include/tlx/meta/is_std_array.hpp +40 -0
- package/vendor/include/tlx/meta/is_std_pair.hpp +39 -0
- package/vendor/include/tlx/meta/is_std_tuple.hpp +39 -0
- package/vendor/include/tlx/meta/is_std_vector.hpp +39 -0
- package/vendor/include/tlx/meta/log2.hpp +101 -0
- package/vendor/include/tlx/meta/no_operation.hpp +55 -0
- package/vendor/include/tlx/meta/static_index.hpp +42 -0
- package/vendor/include/tlx/meta/vexpand.hpp +34 -0
- package/vendor/include/tlx/meta/vmap_for_range.hpp +84 -0
- package/vendor/include/tlx/meta/vmap_foreach.hpp +63 -0
- package/vendor/include/tlx/meta/vmap_foreach_tuple.hpp +59 -0
- package/vendor/include/tlx/meta/vmap_foreach_tuple_with_index.hpp +62 -0
- package/vendor/include/tlx/meta/vmap_foreach_with_index.hpp +70 -0
- package/vendor/include/tlx/meta.hpp +55 -0
- package/vendor/include/tlx/multi_timer.hpp +148 -0
- package/vendor/include/tlx/port/setenv.hpp +31 -0
- package/vendor/include/tlx/port.hpp +27 -0
- package/vendor/include/tlx/semaphore.hpp +119 -0
- package/vendor/include/tlx/simple_vector.hpp +20 -0
- package/vendor/include/tlx/siphash.hpp +282 -0
- package/vendor/include/tlx/sort/networks/best.hpp +611 -0
- package/vendor/include/tlx/sort/networks/bose_nelson.hpp +412 -0
- package/vendor/include/tlx/sort/networks/bose_nelson_parameter.hpp +507 -0
- package/vendor/include/tlx/sort/networks/cswap.hpp +60 -0
- package/vendor/include/tlx/sort/parallel_mergesort.hpp +398 -0
- package/vendor/include/tlx/sort/strings/insertion_sort.hpp +232 -0
- package/vendor/include/tlx/sort/strings/multikey_quicksort.hpp +185 -0
- package/vendor/include/tlx/sort/strings/parallel_sample_sort.hpp +1647 -0
- package/vendor/include/tlx/sort/strings/radix_sort.hpp +934 -0
- package/vendor/include/tlx/sort/strings/sample_sort_tools.hpp +756 -0
- package/vendor/include/tlx/sort/strings/string_ptr.hpp +426 -0
- package/vendor/include/tlx/sort/strings/string_set.hpp +800 -0
- package/vendor/include/tlx/sort/strings.hpp +329 -0
- package/vendor/include/tlx/sort/strings_parallel.hpp +325 -0
- package/vendor/include/tlx/sort.hpp +29 -0
- package/vendor/include/tlx/stack_allocator.hpp +226 -0
- package/vendor/include/tlx/string/appendline.hpp +35 -0
- package/vendor/include/tlx/string/base64.hpp +87 -0
- package/vendor/include/tlx/string/bitdump.hpp +139 -0
- package/vendor/include/tlx/string/compare_icase.hpp +42 -0
- package/vendor/include/tlx/string/contains.hpp +36 -0
- package/vendor/include/tlx/string/contains_word.hpp +42 -0
- package/vendor/include/tlx/string/ends_with.hpp +79 -0
- package/vendor/include/tlx/string/equal_icase.hpp +42 -0
- package/vendor/include/tlx/string/erase_all.hpp +70 -0
- package/vendor/include/tlx/string/escape_html.hpp +34 -0
- package/vendor/include/tlx/string/escape_uri.hpp +34 -0
- package/vendor/include/tlx/string/expand_environment_variables.hpp +49 -0
- package/vendor/include/tlx/string/extract_between.hpp +40 -0
- package/vendor/include/tlx/string/format_iec_units.hpp +32 -0
- package/vendor/include/tlx/string/format_si_iec_units.hpp +19 -0
- package/vendor/include/tlx/string/format_si_units.hpp +32 -0
- package/vendor/include/tlx/string/hash_djb2.hpp +87 -0
- package/vendor/include/tlx/string/hash_sdbm.hpp +86 -0
- package/vendor/include/tlx/string/hexdump.hpp +154 -0
- package/vendor/include/tlx/string/index_of.hpp +56 -0
- package/vendor/include/tlx/string/join.hpp +65 -0
- package/vendor/include/tlx/string/join_generic.hpp +89 -0
- package/vendor/include/tlx/string/join_quoted.hpp +46 -0
- package/vendor/include/tlx/string/less_icase.hpp +64 -0
- package/vendor/include/tlx/string/levenshtein.hpp +193 -0
- package/vendor/include/tlx/string/pad.hpp +39 -0
- package/vendor/include/tlx/string/parse_si_iec_units.hpp +46 -0
- package/vendor/include/tlx/string/parse_uri.hpp +66 -0
- package/vendor/include/tlx/string/parse_uri_form_data.hpp +136 -0
- package/vendor/include/tlx/string/replace.hpp +141 -0
- package/vendor/include/tlx/string/split.hpp +170 -0
- package/vendor/include/tlx/string/split_quoted.hpp +49 -0
- package/vendor/include/tlx/string/split_view.hpp +218 -0
- package/vendor/include/tlx/string/split_words.hpp +53 -0
- package/vendor/include/tlx/string/ssprintf.hpp +45 -0
- package/vendor/include/tlx/string/ssprintf_generic.hpp +95 -0
- package/vendor/include/tlx/string/starts_with.hpp +44 -0
- package/vendor/include/tlx/string/to_lower.hpp +47 -0
- package/vendor/include/tlx/string/to_upper.hpp +47 -0
- package/vendor/include/tlx/string/trim.hpp +298 -0
- package/vendor/include/tlx/string/union_words.hpp +33 -0
- package/vendor/include/tlx/string/word_wrap.hpp +35 -0
- package/vendor/include/tlx/string.hpp +68 -0
- package/vendor/include/tlx/thread_barrier_mutex.hpp +109 -0
- package/vendor/include/tlx/thread_barrier_spin.hpp +127 -0
- package/vendor/include/tlx/thread_pool.hpp +151 -0
- package/vendor/include/tlx/timestamp.hpp +23 -0
- package/vendor/include/tlx/unused.hpp +28 -0
- package/vendor/include/tlx/vector_free.hpp +30 -0
- package/vendor/include/tlx/version.hpp +49 -0
- package/vendor/include/ttmath/ttmath.h +2881 -0
- package/vendor/include/ttmath/ttmathbig.h +6111 -0
- package/vendor/include/ttmath/ttmathdec.h +419 -0
- package/vendor/include/ttmath/ttmathint.h +1923 -0
- package/vendor/include/ttmath/ttmathmisc.h +250 -0
- package/vendor/include/ttmath/ttmathobjects.h +812 -0
- package/vendor/include/ttmath/ttmathparser.h +2791 -0
- package/vendor/include/ttmath/ttmaththreads.h +252 -0
- package/vendor/include/ttmath/ttmathtypes.h +707 -0
- package/vendor/include/ttmath/ttmathuint.h +4190 -0
- package/vendor/include/ttmath/ttmathuint_noasm.h +1038 -0
- package/vendor/include/ttmath/ttmathuint_x86.h +1620 -0
- package/vendor/include/ttmath/ttmathuint_x86_64.h +1177 -0
- package/vendor/lib/cmake/tlx/tlx-config.cmake +51 -0
- package/vendor/lib/cmake/tlx/tlx-targets-release.cmake +19 -0
- package/vendor/lib/cmake/tlx/tlx-targets.cmake +106 -0
- package/vendor/lib/cmake/tlx/tlx-version.cmake +11 -0
- package/vendor/lib/libnetworkit.dylib +0 -0
- package/vendor/lib/libtlx.a +0 -0
- package/vendor/lib/pkgconfig/networkit.pc +11 -0
- package/vendor/lib/pkgconfig/tlx.pc +11 -0
|
@@ -0,0 +1,1385 @@
|
|
|
1
|
+
/*******************************************************************************
|
|
2
|
+
* tlx/algorithm/multiway_merge.hpp
|
|
3
|
+
*
|
|
4
|
+
* Many variants of multiway merge.
|
|
5
|
+
*
|
|
6
|
+
* Copied and modified from STXXL, see http://stxxl.org, which itself extracted
|
|
7
|
+
* it from MCSTL http://algo2.iti.uni-karlsruhe.de/singler/mcstl/. Both are
|
|
8
|
+
* distributed under the Boost Software License, Version 1.0.
|
|
9
|
+
*
|
|
10
|
+
* Part of tlx - http://panthema.net/tlx
|
|
11
|
+
*
|
|
12
|
+
* Copyright (C) 2007 Johannes Singler <singler@ira.uka.de>
|
|
13
|
+
* Copyright (C) 2014-2018 Timo Bingmann <tb@panthema.net>
|
|
14
|
+
*
|
|
15
|
+
* All rights reserved. Published under the Boost Software License, Version 1.0
|
|
16
|
+
******************************************************************************/
|
|
17
|
+
|
|
18
|
+
#ifndef TLX_ALGORITHM_MULTIWAY_MERGE_HEADER
|
|
19
|
+
#define TLX_ALGORITHM_MULTIWAY_MERGE_HEADER
|
|
20
|
+
|
|
21
|
+
#include <tlx/algorithm/merge_advance.hpp>
|
|
22
|
+
#include <tlx/container/loser_tree.hpp>
|
|
23
|
+
#include <tlx/container/simple_vector.hpp>
|
|
24
|
+
#include <tlx/define/likely.hpp>
|
|
25
|
+
#include <tlx/unused.hpp>
|
|
26
|
+
#include <algorithm>
|
|
27
|
+
#include <cassert>
|
|
28
|
+
#include <functional>
|
|
29
|
+
#include <iterator>
|
|
30
|
+
#include <numeric>
|
|
31
|
+
#include <utility>
|
|
32
|
+
#include <vector>
|
|
33
|
+
|
|
34
|
+
namespace tlx {
|
|
35
|
+
|
|
36
|
+
//! \addtogroup tlx_algorithm
|
|
37
|
+
//! \{
|
|
38
|
+
|
|
39
|
+
namespace multiway_merge_detail {
|
|
40
|
+
|
|
41
|
+
//! Size of a sequence described by a pair of iterators.
|
|
42
|
+
template <typename RandomAccessIteratorPair>
|
|
43
|
+
typename std::iterator_traits<
|
|
44
|
+
typename RandomAccessIteratorPair::first_type>::difference_type
|
|
45
|
+
iterpair_size(const RandomAccessIteratorPair& p)
|
|
46
|
+
{
|
|
47
|
+
return p.second - p.first;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/*!
|
|
51
|
+
* Iterator wrapper supporting an implicit supremum at the end of the sequence,
|
|
52
|
+
* dominating all comparisons. Deriving from RandomAccessIterator is not
|
|
53
|
+
* possible since RandomAccessIterator need not be a class.
|
|
54
|
+
*/
|
|
55
|
+
template <typename RandomAccessIterator, typename Comparator>
|
|
56
|
+
class guarded_iterator
|
|
57
|
+
{
|
|
58
|
+
public:
|
|
59
|
+
//! Our own type
|
|
60
|
+
using self_type = guarded_iterator<RandomAccessIterator, Comparator>;
|
|
61
|
+
|
|
62
|
+
//! Value type of the iterator
|
|
63
|
+
using value_type =
|
|
64
|
+
typename std::iterator_traits<RandomAccessIterator>::value_type;
|
|
65
|
+
|
|
66
|
+
private:
|
|
67
|
+
//! Current iterator position.
|
|
68
|
+
RandomAccessIterator current;
|
|
69
|
+
//! End iterator of the sequence.
|
|
70
|
+
RandomAccessIterator end_;
|
|
71
|
+
//! Comparator.
|
|
72
|
+
Comparator& comp_;
|
|
73
|
+
|
|
74
|
+
public:
|
|
75
|
+
/*!
|
|
76
|
+
* Constructor. Sets iterator to beginning of sequence.
|
|
77
|
+
* \param begin Begin iterator of sequence.
|
|
78
|
+
* \param end End iterator of sequence.
|
|
79
|
+
* \param comp Comparator provided for associated overloaded compare
|
|
80
|
+
* operators.
|
|
81
|
+
*/
|
|
82
|
+
guarded_iterator(RandomAccessIterator begin, RandomAccessIterator end,
|
|
83
|
+
Comparator& comp)
|
|
84
|
+
: current(begin), end_(end), comp_(comp)
|
|
85
|
+
{
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/*!
|
|
89
|
+
* Pre-increment operator.
|
|
90
|
+
* \return This.
|
|
91
|
+
*/
|
|
92
|
+
self_type& operator++()
|
|
93
|
+
{
|
|
94
|
+
++current;
|
|
95
|
+
return *this;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/*!
|
|
99
|
+
* Dereference operator.
|
|
100
|
+
* \return Referenced element.
|
|
101
|
+
*/
|
|
102
|
+
value_type& operator*()
|
|
103
|
+
{
|
|
104
|
+
return *current;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/*!
|
|
108
|
+
* Convert to wrapped iterator.
|
|
109
|
+
* \return Wrapped iterator.
|
|
110
|
+
*/
|
|
111
|
+
RandomAccessIterator& iterator()
|
|
112
|
+
{
|
|
113
|
+
return current;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/*!
|
|
117
|
+
* Compare two elements referenced by guarded iterators.
|
|
118
|
+
* \param bi1 First iterator.
|
|
119
|
+
* \param bi2 Second iterator.
|
|
120
|
+
* \return \c True if less.
|
|
121
|
+
*/
|
|
122
|
+
friend bool operator<(self_type& bi1, self_type& bi2)
|
|
123
|
+
{
|
|
124
|
+
if (bi1.current == bi1.end_) // bi1 is sup
|
|
125
|
+
return bi2.current == bi2.end_; // bi2 is not sup
|
|
126
|
+
if (bi2.current == bi2.end_) // bi2 is sup
|
|
127
|
+
return true;
|
|
128
|
+
return bi1.comp_(*bi1, *bi2); // normal compare
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/*!
|
|
132
|
+
* Compare two elements referenced by guarded iterators.
|
|
133
|
+
* \param bi1 First iterator.
|
|
134
|
+
* \param bi2 Second iterator.
|
|
135
|
+
* \return \c True if less equal.
|
|
136
|
+
*/
|
|
137
|
+
friend bool operator<=(self_type& bi1, self_type& bi2)
|
|
138
|
+
{
|
|
139
|
+
if (bi2.current == bi2.end_) // bi1 is sup
|
|
140
|
+
return bi1.current != bi1.end_; // bi2 is not sup
|
|
141
|
+
if (bi1.current == bi1.end_) // bi2 is sup
|
|
142
|
+
return false;
|
|
143
|
+
return !bi1.comp_(*bi2, *bi1); // normal compare
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
template <typename RandomAccessIterator, typename Comparator>
|
|
148
|
+
class unguarded_iterator
|
|
149
|
+
{
|
|
150
|
+
public:
|
|
151
|
+
//! Our own type
|
|
152
|
+
using self_type = unguarded_iterator<RandomAccessIterator, Comparator>;
|
|
153
|
+
|
|
154
|
+
//! Value type of the iterator
|
|
155
|
+
using value_type =
|
|
156
|
+
typename std::iterator_traits<RandomAccessIterator>::value_type;
|
|
157
|
+
|
|
158
|
+
private:
|
|
159
|
+
//! Current iterator position.
|
|
160
|
+
RandomAccessIterator current;
|
|
161
|
+
//! Comparator.
|
|
162
|
+
Comparator& comp_;
|
|
163
|
+
|
|
164
|
+
public:
|
|
165
|
+
/*!
|
|
166
|
+
* Constructor. Sets iterator to beginning of sequence.
|
|
167
|
+
* \param begin Begin iterator of sequence.
|
|
168
|
+
* param end Unused, only for compatibility.
|
|
169
|
+
* \param comp Unused, only for compatibility.
|
|
170
|
+
*/
|
|
171
|
+
unguarded_iterator(RandomAccessIterator begin,
|
|
172
|
+
RandomAccessIterator /* end */, Comparator& comp)
|
|
173
|
+
: current(begin), comp_(comp)
|
|
174
|
+
{
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/*!
|
|
178
|
+
* Pre-increment operator.
|
|
179
|
+
* \return This.
|
|
180
|
+
*/
|
|
181
|
+
self_type& operator++()
|
|
182
|
+
{
|
|
183
|
+
++current;
|
|
184
|
+
return *this;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/*!
|
|
188
|
+
* Dereference operator.
|
|
189
|
+
* \return Referenced element.
|
|
190
|
+
*/
|
|
191
|
+
value_type& operator*()
|
|
192
|
+
{
|
|
193
|
+
return *current;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/*!
|
|
197
|
+
* Convert to wrapped iterator.
|
|
198
|
+
* \return Wrapped iterator.
|
|
199
|
+
*/
|
|
200
|
+
RandomAccessIterator& iterator()
|
|
201
|
+
{
|
|
202
|
+
return current;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/*!
|
|
206
|
+
* Compare two elements referenced by unguarded iterators.
|
|
207
|
+
* \param bi1 First iterator.
|
|
208
|
+
* \param bi2 Second iterator.
|
|
209
|
+
* \return \c True if less.
|
|
210
|
+
*/
|
|
211
|
+
friend bool operator<(self_type& bi1, self_type& bi2)
|
|
212
|
+
{
|
|
213
|
+
return bi1.comp_(*bi1, *bi2); // normal compare, unguarded
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/*!
|
|
217
|
+
* Compare two elements referenced by unguarded iterators.
|
|
218
|
+
* \param bi1 First iterator.
|
|
219
|
+
* \param bi2 Second iterator.
|
|
220
|
+
* \return \c True if less equal.
|
|
221
|
+
*/
|
|
222
|
+
friend bool operator<=(self_type& bi1, self_type& bi2)
|
|
223
|
+
{
|
|
224
|
+
return !bi1.comp_(*bi2, *bi1); // normal compare, unguarded
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
/*!
|
|
229
|
+
* Prepare a set of sequences to be merged without a (end) guard
|
|
230
|
+
*
|
|
231
|
+
* \param seqs_begin
|
|
232
|
+
* \param seqs_end
|
|
233
|
+
* \param comp
|
|
234
|
+
* \param min_sequence
|
|
235
|
+
* \tparam Stable
|
|
236
|
+
* \pre (seqs_end - seqs_begin > 0)
|
|
237
|
+
*/
|
|
238
|
+
template <bool Stable, typename RandomAccessIteratorIterator,
|
|
239
|
+
typename Comparator>
|
|
240
|
+
typename std::iterator_traits<typename std::iterator_traits<
|
|
241
|
+
RandomAccessIteratorIterator>::value_type::first_type>::difference_type
|
|
242
|
+
prepare_unguarded(RandomAccessIteratorIterator seqs_begin,
|
|
243
|
+
RandomAccessIteratorIterator seqs_end, Comparator comp,
|
|
244
|
+
int& min_sequence)
|
|
245
|
+
{
|
|
246
|
+
using RandomAccessIterator = typename std::iterator_traits<
|
|
247
|
+
RandomAccessIteratorIterator>::value_type::first_type;
|
|
248
|
+
using value_type =
|
|
249
|
+
typename std::iterator_traits<RandomAccessIterator>::value_type;
|
|
250
|
+
using diff_type =
|
|
251
|
+
typename std::iterator_traits<RandomAccessIterator>::difference_type;
|
|
252
|
+
|
|
253
|
+
if ((*seqs_begin).first == (*seqs_begin).second)
|
|
254
|
+
{
|
|
255
|
+
// empty sequence found, it's the first one
|
|
256
|
+
min_sequence = 0;
|
|
257
|
+
return -1;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// last element in sequence
|
|
261
|
+
value_type min = *((*seqs_begin).second - 1);
|
|
262
|
+
min_sequence = 0;
|
|
263
|
+
for (RandomAccessIteratorIterator s = seqs_begin + 1; s != seqs_end; ++s)
|
|
264
|
+
{
|
|
265
|
+
if ((*s).first == (*s).second)
|
|
266
|
+
{
|
|
267
|
+
// empty sequence found
|
|
268
|
+
min_sequence = static_cast<int>(s - seqs_begin);
|
|
269
|
+
return -1;
|
|
270
|
+
}
|
|
271
|
+
const value_type& v = *((*s).second - 1);
|
|
272
|
+
if (comp(v, min))
|
|
273
|
+
{
|
|
274
|
+
// last element in sequence is strictly smaller
|
|
275
|
+
min = v;
|
|
276
|
+
min_sequence = static_cast<int>(s - seqs_begin);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
diff_type overhang_size = 0;
|
|
281
|
+
|
|
282
|
+
int s = 0;
|
|
283
|
+
for (s = 0; s <= min_sequence; ++s)
|
|
284
|
+
{
|
|
285
|
+
RandomAccessIterator split;
|
|
286
|
+
if (Stable)
|
|
287
|
+
split = std::upper_bound(seqs_begin[s].first, seqs_begin[s].second,
|
|
288
|
+
min, comp);
|
|
289
|
+
else
|
|
290
|
+
split = std::lower_bound(seqs_begin[s].first, seqs_begin[s].second,
|
|
291
|
+
min, comp);
|
|
292
|
+
|
|
293
|
+
overhang_size += seqs_begin[s].second - split;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
for (; s < (seqs_end - seqs_begin); ++s)
|
|
297
|
+
{
|
|
298
|
+
RandomAccessIterator split = std::lower_bound(
|
|
299
|
+
seqs_begin[s].first, seqs_begin[s].second, min, comp);
|
|
300
|
+
overhang_size += seqs_begin[s].second - split;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// so many elements will be left over afterwards
|
|
304
|
+
return overhang_size;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/*!
|
|
308
|
+
* Prepare a set of sequences to be merged with a (end) guard (sentinel)
|
|
309
|
+
* \param seqs_begin
|
|
310
|
+
* \param seqs_end
|
|
311
|
+
* \param comp
|
|
312
|
+
*/
|
|
313
|
+
template <typename RandomAccessIteratorIterator, typename Comparator>
|
|
314
|
+
typename std::iterator_traits<typename std::iterator_traits<
|
|
315
|
+
RandomAccessIteratorIterator>::value_type::first_type>::difference_type
|
|
316
|
+
prepare_unguarded_sentinel(RandomAccessIteratorIterator seqs_begin,
|
|
317
|
+
RandomAccessIteratorIterator seqs_end,
|
|
318
|
+
Comparator comp)
|
|
319
|
+
{
|
|
320
|
+
using RandomAccessIterator = typename std::iterator_traits<
|
|
321
|
+
RandomAccessIteratorIterator>::value_type::first_type;
|
|
322
|
+
using value_type =
|
|
323
|
+
typename std::iterator_traits<RandomAccessIterator>::value_type;
|
|
324
|
+
using diff_type =
|
|
325
|
+
typename std::iterator_traits<RandomAccessIterator>::difference_type;
|
|
326
|
+
|
|
327
|
+
value_type* max_value = nullptr; // last element in sequence
|
|
328
|
+
for (RandomAccessIteratorIterator s = seqs_begin; s != seqs_end; ++s)
|
|
329
|
+
{
|
|
330
|
+
if ((*s).first == (*s).second)
|
|
331
|
+
continue;
|
|
332
|
+
value_type& v = *((*s).second - 1); // last element in sequence
|
|
333
|
+
if (!max_value || comp(*max_value, v)) // strictly greater
|
|
334
|
+
max_value = &v;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
diff_type overhang_size = 0;
|
|
338
|
+
|
|
339
|
+
for (RandomAccessIteratorIterator s = seqs_begin; s != seqs_end; ++s)
|
|
340
|
+
{
|
|
341
|
+
RandomAccessIterator split =
|
|
342
|
+
std::lower_bound((*s).first, (*s).second, *max_value, comp);
|
|
343
|
+
overhang_size += (*s).second - split;
|
|
344
|
+
*((*s).second) = *max_value; // set sentinel
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// so many elements will be left over afterwards
|
|
348
|
+
return overhang_size;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/*!
|
|
352
|
+
* Highly efficient 3-way merging procedure.
|
|
353
|
+
*
|
|
354
|
+
* Merging is done with the algorithm implementation described by Peter
|
|
355
|
+
* Sanders. Basically, the idea is to minimize the number of necessary
|
|
356
|
+
* comparison after merging an element. The implementation trick that makes
|
|
357
|
+
* this fast is that the order of the sequences is stored in the instruction
|
|
358
|
+
* pointer (translated into labels in C++).
|
|
359
|
+
*
|
|
360
|
+
* This works well for merging up to 3 sequences.
|
|
361
|
+
*
|
|
362
|
+
* Note that making the merging stable does \a not come at a performance hit.
|
|
363
|
+
*
|
|
364
|
+
* Whether the merging is done guarded or unguarded is selected by the used
|
|
365
|
+
* iterator class.
|
|
366
|
+
*
|
|
367
|
+
* \param seqs_begin Begin iterator of iterator pair input sequence.
|
|
368
|
+
* \param seqs_end End iterator of iterator pair input sequence.
|
|
369
|
+
* \param target Begin iterator out output sequence.
|
|
370
|
+
* \param size Maximum size to merge.
|
|
371
|
+
* \param comp Comparator.
|
|
372
|
+
* \return End iterator of output sequence.
|
|
373
|
+
*/
|
|
374
|
+
template <template <typename RAI, typename C> class Iterator,
|
|
375
|
+
typename RandomAccessIteratorIterator, typename RandomAccessIterator3,
|
|
376
|
+
typename Comparator>
|
|
377
|
+
RandomAccessIterator3 multiway_merge_3_variant(
|
|
378
|
+
RandomAccessIteratorIterator seqs_begin,
|
|
379
|
+
RandomAccessIteratorIterator seqs_end, RandomAccessIterator3 target,
|
|
380
|
+
typename std::iterator_traits<typename std::iterator_traits<
|
|
381
|
+
RandomAccessIteratorIterator>::value_type::first_type>::difference_type
|
|
382
|
+
size,
|
|
383
|
+
Comparator comp)
|
|
384
|
+
{
|
|
385
|
+
assert(seqs_end - seqs_begin == 3);
|
|
386
|
+
unused(seqs_end);
|
|
387
|
+
|
|
388
|
+
using RandomAccessIterator = typename std::iterator_traits<
|
|
389
|
+
RandomAccessIteratorIterator>::value_type::first_type;
|
|
390
|
+
|
|
391
|
+
if (size == 0)
|
|
392
|
+
return target;
|
|
393
|
+
|
|
394
|
+
Iterator<RandomAccessIterator, Comparator> seq0(seqs_begin[0].first,
|
|
395
|
+
seqs_begin[0].second, comp),
|
|
396
|
+
seq1(seqs_begin[1].first, seqs_begin[1].second, comp),
|
|
397
|
+
seq2(seqs_begin[2].first, seqs_begin[2].second, comp);
|
|
398
|
+
|
|
399
|
+
if (seq0 <= seq1)
|
|
400
|
+
{
|
|
401
|
+
if (seq1 <= seq2)
|
|
402
|
+
goto s012;
|
|
403
|
+
else if (seq2 < seq0)
|
|
404
|
+
goto s201;
|
|
405
|
+
else
|
|
406
|
+
goto s021;
|
|
407
|
+
}
|
|
408
|
+
else
|
|
409
|
+
{
|
|
410
|
+
if (seq1 <= seq2)
|
|
411
|
+
{
|
|
412
|
+
if (seq0 <= seq2)
|
|
413
|
+
goto s102;
|
|
414
|
+
else
|
|
415
|
+
goto s120;
|
|
416
|
+
}
|
|
417
|
+
else
|
|
418
|
+
goto s210;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
#define TLX_MERGE3CASE(a, b, c, c0, c1) \
|
|
422
|
+
s##a##b##c : * target = *seq##a; \
|
|
423
|
+
++target; \
|
|
424
|
+
--size; \
|
|
425
|
+
++seq##a; \
|
|
426
|
+
if (size == 0) \
|
|
427
|
+
goto finish; \
|
|
428
|
+
if (seq##a c0 seq##b) \
|
|
429
|
+
goto s##a##b##c; \
|
|
430
|
+
if (seq##a c1 seq##c) \
|
|
431
|
+
goto s##b##a##c; \
|
|
432
|
+
goto s##b##c##a;
|
|
433
|
+
|
|
434
|
+
TLX_MERGE3CASE(0, 1, 2, <=, <=);
|
|
435
|
+
TLX_MERGE3CASE(1, 2, 0, <=, <);
|
|
436
|
+
TLX_MERGE3CASE(2, 0, 1, <, <);
|
|
437
|
+
TLX_MERGE3CASE(1, 0, 2, <, <=);
|
|
438
|
+
TLX_MERGE3CASE(0, 2, 1, <=, <=);
|
|
439
|
+
TLX_MERGE3CASE(2, 1, 0, <, <);
|
|
440
|
+
|
|
441
|
+
#undef TLX_MERGE3CASE
|
|
442
|
+
|
|
443
|
+
finish:
|
|
444
|
+
seqs_begin[0].first = seq0.iterator();
|
|
445
|
+
seqs_begin[1].first = seq1.iterator();
|
|
446
|
+
seqs_begin[2].first = seq2.iterator();
|
|
447
|
+
|
|
448
|
+
return target;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
template <typename RandomAccessIteratorIterator, typename RandomAccessIterator3,
|
|
452
|
+
typename Comparator>
|
|
453
|
+
RandomAccessIterator3 multiway_merge_3_combined(
|
|
454
|
+
RandomAccessIteratorIterator seqs_begin,
|
|
455
|
+
RandomAccessIteratorIterator seqs_end, RandomAccessIterator3 target,
|
|
456
|
+
typename std::iterator_traits<typename std::iterator_traits<
|
|
457
|
+
RandomAccessIteratorIterator>::value_type::first_type>::difference_type
|
|
458
|
+
size,
|
|
459
|
+
Comparator comp)
|
|
460
|
+
{
|
|
461
|
+
using RandomAccessIterator = typename std::iterator_traits<
|
|
462
|
+
RandomAccessIteratorIterator>::value_type::first_type;
|
|
463
|
+
using DiffType =
|
|
464
|
+
typename std::iterator_traits<RandomAccessIterator>::difference_type;
|
|
465
|
+
|
|
466
|
+
assert(seqs_end - seqs_begin == 3);
|
|
467
|
+
|
|
468
|
+
int min_seq;
|
|
469
|
+
RandomAccessIterator3 target_end;
|
|
470
|
+
DiffType overhang =
|
|
471
|
+
prepare_unguarded<true>(seqs_begin, seqs_end, comp, min_seq);
|
|
472
|
+
|
|
473
|
+
DiffType total_size = 0;
|
|
474
|
+
for (RandomAccessIteratorIterator s = seqs_begin; s != seqs_end; ++s)
|
|
475
|
+
total_size += iterpair_size(*s);
|
|
476
|
+
|
|
477
|
+
if (overhang != static_cast<DiffType>(-1))
|
|
478
|
+
{
|
|
479
|
+
DiffType unguarded_size = std::min(size, total_size - overhang);
|
|
480
|
+
target_end = multiway_merge_3_variant<unguarded_iterator>(
|
|
481
|
+
seqs_begin, seqs_end, target, unguarded_size, comp);
|
|
482
|
+
overhang = size - unguarded_size;
|
|
483
|
+
}
|
|
484
|
+
else
|
|
485
|
+
{
|
|
486
|
+
// empty sequence found
|
|
487
|
+
overhang = size;
|
|
488
|
+
target_end = target;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
switch (min_seq)
|
|
492
|
+
{
|
|
493
|
+
case 0:
|
|
494
|
+
// iterators will be advanced accordingly
|
|
495
|
+
target_end = merge_advance(seqs_begin[1].first, seqs_begin[1].second,
|
|
496
|
+
seqs_begin[2].first, seqs_begin[2].second,
|
|
497
|
+
target_end, overhang, comp);
|
|
498
|
+
break;
|
|
499
|
+
case 1:
|
|
500
|
+
target_end = merge_advance(seqs_begin[0].first, seqs_begin[0].second,
|
|
501
|
+
seqs_begin[2].first, seqs_begin[2].second,
|
|
502
|
+
target_end, overhang, comp);
|
|
503
|
+
break;
|
|
504
|
+
case 2:
|
|
505
|
+
target_end = merge_advance(seqs_begin[0].first, seqs_begin[0].second,
|
|
506
|
+
seqs_begin[1].first, seqs_begin[1].second,
|
|
507
|
+
target_end, overhang, comp);
|
|
508
|
+
break;
|
|
509
|
+
default:
|
|
510
|
+
assert(false);
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
return target_end;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
/*!
|
|
517
|
+
* Highly efficient 4-way merging procedure.
|
|
518
|
+
*
|
|
519
|
+
* Merging is done with the algorithm implementation described by Peter
|
|
520
|
+
* Sanders. Basically, the idea is to minimize the number of necessary
|
|
521
|
+
* comparison after merging an element. The implementation trick that makes
|
|
522
|
+
* this fast is that the order of the sequences is stored in the instruction
|
|
523
|
+
* pointer (translated into goto labels in C++).
|
|
524
|
+
*
|
|
525
|
+
* This works well for merging up to 4 sequences.
|
|
526
|
+
*
|
|
527
|
+
* Note that making the merging stable does \a not come at a performance hit.
|
|
528
|
+
*
|
|
529
|
+
* Whether the merging is done guarded or unguarded is selected by the used
|
|
530
|
+
* iterator class.
|
|
531
|
+
*
|
|
532
|
+
* \param seqs_begin Begin iterator of iterator pair input sequence.
|
|
533
|
+
* \param seqs_end End iterator of iterator pair input sequence.
|
|
534
|
+
* \param target Begin iterator out output sequence.
|
|
535
|
+
* \param size Maximum size to merge.
|
|
536
|
+
* \param comp Comparator.
|
|
537
|
+
* \return End iterator of output sequence.
|
|
538
|
+
*/
|
|
539
|
+
template <template <typename RAI, typename C> class iterator,
|
|
540
|
+
typename RandomAccessIteratorIterator, typename RandomAccessIterator3,
|
|
541
|
+
typename Comparator>
|
|
542
|
+
RandomAccessIterator3 multiway_merge_4_variant(
|
|
543
|
+
RandomAccessIteratorIterator seqs_begin,
|
|
544
|
+
RandomAccessIteratorIterator seqs_end, RandomAccessIterator3 target,
|
|
545
|
+
typename std::iterator_traits<typename std::iterator_traits<
|
|
546
|
+
RandomAccessIteratorIterator>::value_type::first_type>::difference_type
|
|
547
|
+
size,
|
|
548
|
+
Comparator comp)
|
|
549
|
+
{
|
|
550
|
+
assert(seqs_end - seqs_begin == 4);
|
|
551
|
+
unused(seqs_end);
|
|
552
|
+
using RandomAccessIterator = typename std::iterator_traits<
|
|
553
|
+
RandomAccessIteratorIterator>::value_type::first_type;
|
|
554
|
+
|
|
555
|
+
if (size == 0)
|
|
556
|
+
return target;
|
|
557
|
+
|
|
558
|
+
iterator<RandomAccessIterator, Comparator> seq0(seqs_begin[0].first,
|
|
559
|
+
seqs_begin[0].second, comp),
|
|
560
|
+
seq1(seqs_begin[1].first, seqs_begin[1].second, comp),
|
|
561
|
+
seq2(seqs_begin[2].first, seqs_begin[2].second, comp),
|
|
562
|
+
seq3(seqs_begin[3].first, seqs_begin[3].second, comp);
|
|
563
|
+
|
|
564
|
+
#define TLX_DECISION(a, b, c, d) \
|
|
565
|
+
do \
|
|
566
|
+
{ \
|
|
567
|
+
if (seq##d < seq##a) \
|
|
568
|
+
goto s##d##a##b##c; \
|
|
569
|
+
if (seq##d < seq##b) \
|
|
570
|
+
goto s##a##d##b##c; \
|
|
571
|
+
if (seq##d < seq##c) \
|
|
572
|
+
goto s##a##b##d##c; \
|
|
573
|
+
goto s##a##b##c##d; \
|
|
574
|
+
} while (0)
|
|
575
|
+
|
|
576
|
+
if (seq0 <= seq1)
|
|
577
|
+
{
|
|
578
|
+
if (seq1 <= seq2)
|
|
579
|
+
TLX_DECISION(0, 1, 2, 3);
|
|
580
|
+
else if (seq2 < seq0)
|
|
581
|
+
TLX_DECISION(2, 0, 1, 3);
|
|
582
|
+
else
|
|
583
|
+
TLX_DECISION(0, 2, 1, 3);
|
|
584
|
+
}
|
|
585
|
+
else
|
|
586
|
+
{
|
|
587
|
+
if (seq1 <= seq2)
|
|
588
|
+
{
|
|
589
|
+
if (seq0 <= seq2)
|
|
590
|
+
TLX_DECISION(1, 0, 2, 3);
|
|
591
|
+
else
|
|
592
|
+
TLX_DECISION(1, 2, 0, 3);
|
|
593
|
+
}
|
|
594
|
+
else
|
|
595
|
+
TLX_DECISION(2, 1, 0, 3);
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
#define TLX_MERGE4CASE(a, b, c, d, c0, c1, c2) \
|
|
599
|
+
s##a##b##c##d : * target = *seq##a; \
|
|
600
|
+
++target; \
|
|
601
|
+
--size; \
|
|
602
|
+
++seq##a; \
|
|
603
|
+
if (size == 0) \
|
|
604
|
+
goto finish; \
|
|
605
|
+
if (seq##a c0 seq##b) \
|
|
606
|
+
goto s##a##b##c##d; \
|
|
607
|
+
if (seq##a c1 seq##c) \
|
|
608
|
+
goto s##b##a##c##d; \
|
|
609
|
+
if (seq##a c2 seq##d) \
|
|
610
|
+
goto s##b##c##a##d; \
|
|
611
|
+
goto s##b##c##d##a;
|
|
612
|
+
|
|
613
|
+
TLX_MERGE4CASE(0, 1, 2, 3, <=, <=, <=);
|
|
614
|
+
TLX_MERGE4CASE(0, 1, 3, 2, <=, <=, <=);
|
|
615
|
+
TLX_MERGE4CASE(0, 2, 1, 3, <=, <=, <=);
|
|
616
|
+
TLX_MERGE4CASE(0, 2, 3, 1, <=, <=, <=);
|
|
617
|
+
TLX_MERGE4CASE(0, 3, 1, 2, <=, <=, <=);
|
|
618
|
+
TLX_MERGE4CASE(0, 3, 2, 1, <=, <=, <=);
|
|
619
|
+
TLX_MERGE4CASE(1, 0, 2, 3, <, <=, <=);
|
|
620
|
+
TLX_MERGE4CASE(1, 0, 3, 2, <, <=, <=);
|
|
621
|
+
TLX_MERGE4CASE(1, 2, 0, 3, <=, <, <=);
|
|
622
|
+
TLX_MERGE4CASE(1, 2, 3, 0, <=, <=, <);
|
|
623
|
+
TLX_MERGE4CASE(1, 3, 0, 2, <=, <, <=);
|
|
624
|
+
TLX_MERGE4CASE(1, 3, 2, 0, <=, <=, <);
|
|
625
|
+
TLX_MERGE4CASE(2, 0, 1, 3, <, <, <=);
|
|
626
|
+
TLX_MERGE4CASE(2, 0, 3, 1, <, <=, <);
|
|
627
|
+
TLX_MERGE4CASE(2, 1, 0, 3, <, <, <=);
|
|
628
|
+
TLX_MERGE4CASE(2, 1, 3, 0, <, <=, <);
|
|
629
|
+
TLX_MERGE4CASE(2, 3, 0, 1, <=, <, <);
|
|
630
|
+
TLX_MERGE4CASE(2, 3, 1, 0, <=, <, <);
|
|
631
|
+
TLX_MERGE4CASE(3, 0, 1, 2, <, <, <);
|
|
632
|
+
TLX_MERGE4CASE(3, 0, 2, 1, <, <, <);
|
|
633
|
+
TLX_MERGE4CASE(3, 1, 0, 2, <, <, <);
|
|
634
|
+
TLX_MERGE4CASE(3, 1, 2, 0, <, <, <);
|
|
635
|
+
TLX_MERGE4CASE(3, 2, 0, 1, <, <, <);
|
|
636
|
+
TLX_MERGE4CASE(3, 2, 1, 0, <, <, <);
|
|
637
|
+
|
|
638
|
+
#undef TLX_MERGE4CASE
|
|
639
|
+
#undef TLX_DECISION
|
|
640
|
+
|
|
641
|
+
finish:
|
|
642
|
+
seqs_begin[0].first = seq0.iterator();
|
|
643
|
+
seqs_begin[1].first = seq1.iterator();
|
|
644
|
+
seqs_begin[2].first = seq2.iterator();
|
|
645
|
+
seqs_begin[3].first = seq3.iterator();
|
|
646
|
+
|
|
647
|
+
return target;
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
template <typename RandomAccessIteratorIterator, typename RandomAccessIterator3,
|
|
651
|
+
typename Comparator>
|
|
652
|
+
RandomAccessIterator3 multiway_merge_4_combined(
|
|
653
|
+
RandomAccessIteratorIterator seqs_begin,
|
|
654
|
+
RandomAccessIteratorIterator seqs_end, RandomAccessIterator3 target,
|
|
655
|
+
typename std::iterator_traits<typename std::iterator_traits<
|
|
656
|
+
RandomAccessIteratorIterator>::value_type::first_type>::difference_type
|
|
657
|
+
size,
|
|
658
|
+
Comparator comp)
|
|
659
|
+
{
|
|
660
|
+
assert(seqs_end - seqs_begin == 4);
|
|
661
|
+
using RandomAccessIteratorPair =
|
|
662
|
+
typename std::iterator_traits<RandomAccessIteratorIterator>::value_type;
|
|
663
|
+
using DiffType = typename std::iterator_traits<
|
|
664
|
+
RandomAccessIteratorIterator>::difference_type;
|
|
665
|
+
|
|
666
|
+
int min_seq;
|
|
667
|
+
RandomAccessIterator3 target_end;
|
|
668
|
+
DiffType overhang =
|
|
669
|
+
prepare_unguarded<true>(seqs_begin, seqs_end, comp, min_seq);
|
|
670
|
+
|
|
671
|
+
DiffType total_size = 0;
|
|
672
|
+
for (RandomAccessIteratorIterator s = seqs_begin; s != seqs_end; ++s)
|
|
673
|
+
total_size += iterpair_size(*s);
|
|
674
|
+
|
|
675
|
+
if (overhang != static_cast<DiffType>(-1))
|
|
676
|
+
{
|
|
677
|
+
DiffType unguarded_size = std::min(size, total_size - overhang);
|
|
678
|
+
target_end = multiway_merge_4_variant<unguarded_iterator>(
|
|
679
|
+
seqs_begin, seqs_end, target, unguarded_size, comp);
|
|
680
|
+
overhang = size - unguarded_size;
|
|
681
|
+
}
|
|
682
|
+
else
|
|
683
|
+
{
|
|
684
|
+
// empty sequence found
|
|
685
|
+
overhang = size;
|
|
686
|
+
target_end = target;
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
std::vector<RandomAccessIteratorPair> one_missing(seqs_begin, seqs_end);
|
|
690
|
+
// remove
|
|
691
|
+
one_missing.erase(one_missing.begin() + min_seq);
|
|
692
|
+
|
|
693
|
+
target_end = multiway_merge_3_variant<guarded_iterator>(
|
|
694
|
+
one_missing.begin(), one_missing.end(), target_end, overhang, comp);
|
|
695
|
+
|
|
696
|
+
// insert back again
|
|
697
|
+
one_missing.insert(one_missing.begin() + min_seq, seqs_begin[min_seq]);
|
|
698
|
+
// write back modified iterators
|
|
699
|
+
std::copy(one_missing.begin(), one_missing.end(), seqs_begin);
|
|
700
|
+
|
|
701
|
+
return target_end;
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
/*!
|
|
705
|
+
* Basic multi-way merging procedure.
|
|
706
|
+
*
|
|
707
|
+
* The head elements are kept in a sorted array, new heads are inserted
|
|
708
|
+
* linearly.
|
|
709
|
+
*
|
|
710
|
+
* \param seqs_begin Begin iterator of iterator pair input sequence.
|
|
711
|
+
* \param seqs_end End iterator of iterator pair input sequence.
|
|
712
|
+
* \param target Begin iterator out output sequence.
|
|
713
|
+
* \param size Maximum size to merge.
|
|
714
|
+
* \param comp Comparator.
|
|
715
|
+
* \tparam Stable Stable merging incurs a performance penalty.
|
|
716
|
+
* \return End iterator of output sequence.
|
|
717
|
+
*/
|
|
718
|
+
template <bool Stable, typename RandomAccessIteratorIterator,
|
|
719
|
+
typename RandomAccessIterator3, typename Comparator>
|
|
720
|
+
RandomAccessIterator3 multiway_merge_bubble(
|
|
721
|
+
RandomAccessIteratorIterator seqs_begin,
|
|
722
|
+
RandomAccessIteratorIterator seqs_end, RandomAccessIterator3 target,
|
|
723
|
+
typename std::iterator_traits<typename std::iterator_traits<
|
|
724
|
+
RandomAccessIteratorIterator>::value_type::first_type>::difference_type
|
|
725
|
+
size,
|
|
726
|
+
Comparator comp)
|
|
727
|
+
{
|
|
728
|
+
using RandomAccessIterator = typename std::iterator_traits<
|
|
729
|
+
RandomAccessIteratorIterator>::value_type::first_type;
|
|
730
|
+
using value_type =
|
|
731
|
+
typename std::iterator_traits<RandomAccessIterator>::value_type;
|
|
732
|
+
using DiffType =
|
|
733
|
+
typename std::iterator_traits<RandomAccessIterator>::difference_type;
|
|
734
|
+
|
|
735
|
+
// num remaining pieces
|
|
736
|
+
int num_seqs = static_cast<int>(seqs_end - seqs_begin), nrp;
|
|
737
|
+
|
|
738
|
+
simple_vector<value_type> pl(num_seqs);
|
|
739
|
+
simple_vector<int> source(num_seqs);
|
|
740
|
+
DiffType total_size = 0;
|
|
741
|
+
|
|
742
|
+
#define TLX_POS(i) seqs_begin[(i)].first
|
|
743
|
+
#define TLX_STOPS(i) seqs_begin[(i)].second
|
|
744
|
+
|
|
745
|
+
// write entries into queue
|
|
746
|
+
nrp = 0;
|
|
747
|
+
for (int pi = 0; pi < num_seqs; ++pi)
|
|
748
|
+
{
|
|
749
|
+
if (TLX_STOPS(pi) != TLX_POS(pi))
|
|
750
|
+
{
|
|
751
|
+
pl[nrp] = *(TLX_POS(pi));
|
|
752
|
+
source[nrp] = pi;
|
|
753
|
+
++nrp;
|
|
754
|
+
total_size += iterpair_size(seqs_begin[pi]);
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
if (Stable)
|
|
759
|
+
{
|
|
760
|
+
for (int k = 0; k < nrp - 1; ++k)
|
|
761
|
+
for (int pi = nrp - 1; pi > k; --pi)
|
|
762
|
+
if (comp(pl[pi], pl[pi - 1]) ||
|
|
763
|
+
(!comp(pl[pi - 1], pl[pi]) && source[pi] < source[pi - 1]))
|
|
764
|
+
{
|
|
765
|
+
std::swap(pl[pi - 1], pl[pi]);
|
|
766
|
+
std::swap(source[pi - 1], source[pi]);
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
else
|
|
770
|
+
{
|
|
771
|
+
for (int k = 0; k < nrp - 1; ++k)
|
|
772
|
+
for (int pi = nrp - 1; pi > k; --pi)
|
|
773
|
+
if (comp(pl[pi], pl[pi - 1]))
|
|
774
|
+
{
|
|
775
|
+
std::swap(pl[pi - 1], pl[pi]);
|
|
776
|
+
std::swap(source[pi - 1], source[pi]);
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
// iterate
|
|
781
|
+
if (Stable)
|
|
782
|
+
{
|
|
783
|
+
int j;
|
|
784
|
+
while (nrp > 0 && size > 0)
|
|
785
|
+
{
|
|
786
|
+
if (source[0] < source[1])
|
|
787
|
+
{
|
|
788
|
+
// pl[0] <= pl[1] ?
|
|
789
|
+
while ((nrp == 1 || !(comp(pl[1], pl[0]))) && size > 0)
|
|
790
|
+
{
|
|
791
|
+
*target = pl[0];
|
|
792
|
+
++target;
|
|
793
|
+
++TLX_POS(source[0]);
|
|
794
|
+
--size;
|
|
795
|
+
if (TLX_POS(source[0]) == TLX_STOPS(source[0]))
|
|
796
|
+
{
|
|
797
|
+
// move everything to the left
|
|
798
|
+
for (int s = 0; s < nrp - 1; ++s)
|
|
799
|
+
{
|
|
800
|
+
pl[s] = pl[s + 1];
|
|
801
|
+
source[s] = source[s + 1];
|
|
802
|
+
}
|
|
803
|
+
--nrp;
|
|
804
|
+
break;
|
|
805
|
+
}
|
|
806
|
+
pl[0] = *(TLX_POS(source[0]));
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
else
|
|
810
|
+
{
|
|
811
|
+
// pl[0] < pl[1] ?
|
|
812
|
+
while ((nrp == 1 || comp(pl[0], pl[1])) && size > 0)
|
|
813
|
+
{
|
|
814
|
+
*target = pl[0];
|
|
815
|
+
++target;
|
|
816
|
+
++TLX_POS(source[0]);
|
|
817
|
+
--size;
|
|
818
|
+
if (TLX_POS(source[0]) == TLX_STOPS(source[0]))
|
|
819
|
+
{
|
|
820
|
+
for (int s = 0; s < nrp - 1; ++s)
|
|
821
|
+
{
|
|
822
|
+
pl[s] = pl[s + 1];
|
|
823
|
+
source[s] = source[s + 1];
|
|
824
|
+
}
|
|
825
|
+
--nrp;
|
|
826
|
+
break;
|
|
827
|
+
}
|
|
828
|
+
pl[0] = *(TLX_POS(source[0]));
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
// sink down
|
|
833
|
+
j = 1;
|
|
834
|
+
while ((j < nrp) &&
|
|
835
|
+
(comp(pl[j], pl[j - 1]) ||
|
|
836
|
+
(!comp(pl[j - 1], pl[j]) && (source[j] < source[j - 1]))))
|
|
837
|
+
{
|
|
838
|
+
std::swap(pl[j - 1], pl[j]);
|
|
839
|
+
std::swap(source[j - 1], source[j]);
|
|
840
|
+
++j;
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
}
|
|
844
|
+
else
|
|
845
|
+
{
|
|
846
|
+
int j;
|
|
847
|
+
while (nrp > 0 && size > 0)
|
|
848
|
+
{
|
|
849
|
+
// pl[0] <= pl[1] ?
|
|
850
|
+
while ((nrp == 1 || !comp(pl[1], pl[0])) && size > 0)
|
|
851
|
+
{
|
|
852
|
+
*target = pl[0];
|
|
853
|
+
++target;
|
|
854
|
+
++TLX_POS(source[0]);
|
|
855
|
+
--size;
|
|
856
|
+
if (TLX_POS(source[0]) == TLX_STOPS(source[0]))
|
|
857
|
+
{
|
|
858
|
+
for (int s = 0; s < (nrp - 1); ++s)
|
|
859
|
+
{
|
|
860
|
+
pl[s] = pl[s + 1];
|
|
861
|
+
source[s] = source[s + 1];
|
|
862
|
+
}
|
|
863
|
+
--nrp;
|
|
864
|
+
break;
|
|
865
|
+
}
|
|
866
|
+
pl[0] = *(TLX_POS(source[0]));
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
// sink down
|
|
870
|
+
j = 1;
|
|
871
|
+
while ((j < nrp) && comp(pl[j], pl[j - 1]))
|
|
872
|
+
{
|
|
873
|
+
std::swap(pl[j - 1], pl[j]);
|
|
874
|
+
std::swap(source[j - 1], source[j]);
|
|
875
|
+
++j;
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
#undef TLX_POS
|
|
881
|
+
#undef TLX_STOPS
|
|
882
|
+
|
|
883
|
+
return target;
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
/*!
|
|
887
|
+
* Multi-way merging procedure for a high branching factor, guarded case.
|
|
888
|
+
*
|
|
889
|
+
* The head elements are kept in a loser tree.
|
|
890
|
+
* \param seqs_begin Begin iterator of iterator pair input sequence.
|
|
891
|
+
* \param seqs_end End iterator of iterator pair input sequence.
|
|
892
|
+
* \param target Begin iterator out output sequence.
|
|
893
|
+
* \param size Maximum size to merge.
|
|
894
|
+
* \param comp Comparator.
|
|
895
|
+
* \tparam Stable Stable merging incurs a performance penalty.
|
|
896
|
+
* \return End iterator of output sequence.
|
|
897
|
+
*/
|
|
898
|
+
template <typename LoserTreeType, typename RandomAccessIteratorIterator,
|
|
899
|
+
typename RandomAccessIterator3, typename Comparator>
|
|
900
|
+
RandomAccessIterator3 multiway_merge_loser_tree(
|
|
901
|
+
RandomAccessIteratorIterator seqs_begin,
|
|
902
|
+
RandomAccessIteratorIterator seqs_end, RandomAccessIterator3 target,
|
|
903
|
+
typename std::iterator_traits<typename std::iterator_traits<
|
|
904
|
+
RandomAccessIteratorIterator>::value_type::first_type>::difference_type
|
|
905
|
+
size,
|
|
906
|
+
Comparator comp)
|
|
907
|
+
{
|
|
908
|
+
using Source = typename LoserTreeType::Source;
|
|
909
|
+
using size_type = typename LoserTreeType::Source;
|
|
910
|
+
using RandomAccessIteratorPair =
|
|
911
|
+
typename std::iterator_traits<RandomAccessIteratorIterator>::value_type;
|
|
912
|
+
using RandomAccessIterator = typename RandomAccessIteratorPair::first_type;
|
|
913
|
+
using DiffType =
|
|
914
|
+
typename std::iterator_traits<RandomAccessIterator>::difference_type;
|
|
915
|
+
|
|
916
|
+
const Source k = static_cast<Source>(seqs_end - seqs_begin);
|
|
917
|
+
|
|
918
|
+
LoserTreeType lt(static_cast<size_type>(k), comp);
|
|
919
|
+
|
|
920
|
+
const DiffType total_size = std::min<DiffType>(
|
|
921
|
+
size,
|
|
922
|
+
std::accumulate(seqs_begin, seqs_end, DiffType(0),
|
|
923
|
+
[](DiffType sum, const RandomAccessIteratorPair& x) {
|
|
924
|
+
return sum + iterpair_size(x);
|
|
925
|
+
}));
|
|
926
|
+
|
|
927
|
+
for (Source t = 0; t < k; ++t)
|
|
928
|
+
{
|
|
929
|
+
if (TLX_UNLIKELY(seqs_begin[t].first == seqs_begin[t].second))
|
|
930
|
+
lt.insert_start(nullptr, t, true);
|
|
931
|
+
else
|
|
932
|
+
lt.insert_start(&*seqs_begin[t].first, t, false);
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
lt.init();
|
|
936
|
+
|
|
937
|
+
if (total_size == 0)
|
|
938
|
+
return target;
|
|
939
|
+
|
|
940
|
+
// take out first
|
|
941
|
+
Source source = lt.min_source();
|
|
942
|
+
|
|
943
|
+
*target = *seqs_begin[source].first;
|
|
944
|
+
++target;
|
|
945
|
+
++seqs_begin[source].first;
|
|
946
|
+
|
|
947
|
+
for (DiffType i = 1; i < total_size; ++i)
|
|
948
|
+
{
|
|
949
|
+
// feed
|
|
950
|
+
if (seqs_begin[source].first == seqs_begin[source].second)
|
|
951
|
+
lt.delete_min_insert(nullptr, true);
|
|
952
|
+
else
|
|
953
|
+
// replace from same source
|
|
954
|
+
lt.delete_min_insert(&*seqs_begin[source].first, false);
|
|
955
|
+
|
|
956
|
+
// take out following
|
|
957
|
+
source = lt.min_source();
|
|
958
|
+
|
|
959
|
+
*target = *seqs_begin[source].first;
|
|
960
|
+
++target;
|
|
961
|
+
++seqs_begin[source].first;
|
|
962
|
+
}
|
|
963
|
+
|
|
964
|
+
return target;
|
|
965
|
+
}
|
|
966
|
+
|
|
967
|
+
/*!
|
|
968
|
+
* Multi-way merging procedure for a high branching factor, unguarded case.
|
|
969
|
+
* The head elements are kept in a loser tree.
|
|
970
|
+
*
|
|
971
|
+
* \param seqs_begin Begin iterator of iterator pair input sequence.
|
|
972
|
+
* \param seqs_end End iterator of iterator pair input sequence.
|
|
973
|
+
* \param target Begin iterator out output sequence.
|
|
974
|
+
* \param size Maximum size to merge.
|
|
975
|
+
* \param comp Comparator.
|
|
976
|
+
* \tparam Stable Stable merging incurs a performance penalty.
|
|
977
|
+
* \return End iterator of output sequence.
|
|
978
|
+
* \pre No input will run out of elements during the merge.
|
|
979
|
+
*/
|
|
980
|
+
template <typename LoserTreeType, typename RandomAccessIteratorIterator,
|
|
981
|
+
typename RandomAccessIterator3, typename Comparator>
|
|
982
|
+
RandomAccessIterator3 multiway_merge_loser_tree_unguarded(
|
|
983
|
+
RandomAccessIteratorIterator seqs_begin,
|
|
984
|
+
RandomAccessIteratorIterator seqs_end, RandomAccessIterator3 target,
|
|
985
|
+
typename std::iterator_traits<typename std::iterator_traits<
|
|
986
|
+
RandomAccessIteratorIterator>::value_type::first_type>::difference_type
|
|
987
|
+
size,
|
|
988
|
+
Comparator comp)
|
|
989
|
+
{
|
|
990
|
+
using Source = typename LoserTreeType::Source;
|
|
991
|
+
using size_type = typename LoserTreeType::Source;
|
|
992
|
+
using RandomAccessIteratorPair =
|
|
993
|
+
typename std::iterator_traits<RandomAccessIteratorIterator>::value_type;
|
|
994
|
+
using RandomAccessIterator = typename RandomAccessIteratorPair ::first_type;
|
|
995
|
+
using DiffType =
|
|
996
|
+
typename std::iterator_traits<RandomAccessIterator>::difference_type;
|
|
997
|
+
|
|
998
|
+
Source k = static_cast<Source>(seqs_end - seqs_begin);
|
|
999
|
+
|
|
1000
|
+
// sentinel is item at end of first sequence.
|
|
1001
|
+
LoserTreeType lt(static_cast<size_type>(k), *(seqs_begin->second - 1),
|
|
1002
|
+
comp);
|
|
1003
|
+
|
|
1004
|
+
DiffType total_size = 0;
|
|
1005
|
+
|
|
1006
|
+
for (Source t = 0; t < k; ++t)
|
|
1007
|
+
{
|
|
1008
|
+
assert(seqs_begin[t].first != seqs_begin[t].second);
|
|
1009
|
+
|
|
1010
|
+
lt.insert_start(&*seqs_begin[t].first, t, false);
|
|
1011
|
+
|
|
1012
|
+
total_size += iterpair_size(seqs_begin[t]);
|
|
1013
|
+
}
|
|
1014
|
+
|
|
1015
|
+
lt.init();
|
|
1016
|
+
|
|
1017
|
+
// do not go past end
|
|
1018
|
+
size = std::min(total_size, size);
|
|
1019
|
+
|
|
1020
|
+
RandomAccessIterator3 target_end = target + size;
|
|
1021
|
+
if (target == target_end)
|
|
1022
|
+
return target;
|
|
1023
|
+
|
|
1024
|
+
// take out first
|
|
1025
|
+
int source = lt.min_source();
|
|
1026
|
+
|
|
1027
|
+
*target = *seqs_begin[source].first;
|
|
1028
|
+
++seqs_begin[source].first;
|
|
1029
|
+
++target;
|
|
1030
|
+
|
|
1031
|
+
while (target < target_end)
|
|
1032
|
+
{
|
|
1033
|
+
// feed. replace from same source
|
|
1034
|
+
lt.delete_min_insert(&*seqs_begin[source].first, false);
|
|
1035
|
+
|
|
1036
|
+
// take out following
|
|
1037
|
+
source = lt.min_source();
|
|
1038
|
+
|
|
1039
|
+
*target = *seqs_begin[source].first;
|
|
1040
|
+
++seqs_begin[source].first;
|
|
1041
|
+
++target;
|
|
1042
|
+
}
|
|
1043
|
+
|
|
1044
|
+
return target;
|
|
1045
|
+
}
|
|
1046
|
+
|
|
1047
|
+
template <bool Stable, typename RandomAccessIteratorIterator,
|
|
1048
|
+
typename RandomAccessIterator3, typename Comparator>
|
|
1049
|
+
RandomAccessIterator3 multiway_merge_loser_tree_combined(
|
|
1050
|
+
RandomAccessIteratorIterator seqs_begin,
|
|
1051
|
+
RandomAccessIteratorIterator seqs_end, RandomAccessIterator3 target,
|
|
1052
|
+
typename std::iterator_traits<typename std::iterator_traits<
|
|
1053
|
+
RandomAccessIteratorIterator>::value_type::first_type>::difference_type
|
|
1054
|
+
size,
|
|
1055
|
+
Comparator comp)
|
|
1056
|
+
{
|
|
1057
|
+
using RandomAccessIterator = typename std::iterator_traits<
|
|
1058
|
+
RandomAccessIteratorIterator>::value_type::first_type;
|
|
1059
|
+
using value_type =
|
|
1060
|
+
typename std::iterator_traits<RandomAccessIterator>::value_type;
|
|
1061
|
+
using DiffType =
|
|
1062
|
+
typename std::iterator_traits<RandomAccessIterator>::difference_type;
|
|
1063
|
+
|
|
1064
|
+
int min_seq;
|
|
1065
|
+
RandomAccessIterator3 target_end;
|
|
1066
|
+
DiffType overhang =
|
|
1067
|
+
prepare_unguarded<Stable>(seqs_begin, seqs_end, comp, min_seq);
|
|
1068
|
+
|
|
1069
|
+
DiffType total_size = 0;
|
|
1070
|
+
for (RandomAccessIteratorIterator s = seqs_begin; s != seqs_end; ++s)
|
|
1071
|
+
total_size += iterpair_size(*s);
|
|
1072
|
+
|
|
1073
|
+
if (overhang != static_cast<DiffType>(-1))
|
|
1074
|
+
{
|
|
1075
|
+
DiffType unguarded_size = std::min(size, total_size - overhang);
|
|
1076
|
+
target_end = multiway_merge_loser_tree_unguarded<
|
|
1077
|
+
LoserTreeUnguarded<Stable, value_type, Comparator> >(
|
|
1078
|
+
seqs_begin, seqs_end, target, unguarded_size, comp);
|
|
1079
|
+
overhang = size - unguarded_size;
|
|
1080
|
+
}
|
|
1081
|
+
else
|
|
1082
|
+
{
|
|
1083
|
+
// empty sequence found
|
|
1084
|
+
overhang = size;
|
|
1085
|
+
target_end = target;
|
|
1086
|
+
}
|
|
1087
|
+
|
|
1088
|
+
target_end =
|
|
1089
|
+
multiway_merge_loser_tree<LoserTree<Stable, value_type, Comparator> >(
|
|
1090
|
+
seqs_begin, seqs_end, target_end, overhang, comp);
|
|
1091
|
+
|
|
1092
|
+
return target_end;
|
|
1093
|
+
}
|
|
1094
|
+
|
|
1095
|
+
template <bool Stable, typename RandomAccessIteratorIterator,
|
|
1096
|
+
typename RandomAccessIterator3, typename Comparator>
|
|
1097
|
+
RandomAccessIterator3 multiway_merge_loser_tree_sentinel(
|
|
1098
|
+
RandomAccessIteratorIterator seqs_begin,
|
|
1099
|
+
RandomAccessIteratorIterator seqs_end, RandomAccessIterator3 target,
|
|
1100
|
+
typename std::iterator_traits<typename std::iterator_traits<
|
|
1101
|
+
RandomAccessIteratorIterator>::value_type::first_type>::difference_type
|
|
1102
|
+
size,
|
|
1103
|
+
Comparator comp)
|
|
1104
|
+
{
|
|
1105
|
+
using RandomAccessIterator = typename std::iterator_traits<
|
|
1106
|
+
RandomAccessIteratorIterator>::value_type::first_type;
|
|
1107
|
+
using value_type =
|
|
1108
|
+
typename std::iterator_traits<RandomAccessIterator>::value_type;
|
|
1109
|
+
|
|
1110
|
+
// move end of sequences to include the sentinel for merging
|
|
1111
|
+
for (RandomAccessIteratorIterator s = seqs_begin; s != seqs_end; ++s)
|
|
1112
|
+
++(*s).second;
|
|
1113
|
+
|
|
1114
|
+
RandomAccessIterator3 target_end = multiway_merge_loser_tree_unguarded<
|
|
1115
|
+
LoserTreeUnguarded<Stable, value_type, Comparator> >(
|
|
1116
|
+
seqs_begin, seqs_end, target, size, comp);
|
|
1117
|
+
|
|
1118
|
+
// restore end of sequences
|
|
1119
|
+
for (RandomAccessIteratorIterator s = seqs_begin; s != seqs_end; ++s)
|
|
1120
|
+
--(*s).second;
|
|
1121
|
+
|
|
1122
|
+
return target_end;
|
|
1123
|
+
}
|
|
1124
|
+
|
|
1125
|
+
} // namespace multiway_merge_detail
|
|
1126
|
+
|
|
1127
|
+
/******************************************************************************/
|
|
1128
|
+
// Multiway Merge Algorithm Switch
|
|
1129
|
+
|
|
1130
|
+
/*!
|
|
1131
|
+
* Different merging algorithms: bubblesort-alike, loser-tree variants, enum
|
|
1132
|
+
* sentinel
|
|
1133
|
+
*/
|
|
1134
|
+
enum MultiwayMergeAlgorithm
|
|
1135
|
+
{
|
|
1136
|
+
MWMA_LOSER_TREE,
|
|
1137
|
+
MWMA_LOSER_TREE_COMBINED,
|
|
1138
|
+
MWMA_LOSER_TREE_SENTINEL,
|
|
1139
|
+
MWMA_BUBBLE,
|
|
1140
|
+
MWMA_ALGORITHM_LAST,
|
|
1141
|
+
MWMA_ALGORITHM_DEFAULT = MWMA_LOSER_TREE_COMBINED
|
|
1142
|
+
};
|
|
1143
|
+
|
|
1144
|
+
/*!
|
|
1145
|
+
* Sequential multi-way merging switch.
|
|
1146
|
+
*
|
|
1147
|
+
* The decision if based on the branching factor and runtime settings.
|
|
1148
|
+
*
|
|
1149
|
+
* \param seqs_begin Begin iterator of iterator pair input sequence.
|
|
1150
|
+
* \param seqs_end End iterator of iterator pair input sequence.
|
|
1151
|
+
* \param target Begin iterator out output sequence.
|
|
1152
|
+
* \param size Maximum size to merge.
|
|
1153
|
+
* \param comp Comparator.
|
|
1154
|
+
* \param mwma MultiwayMergeAlgorithm set to use.
|
|
1155
|
+
* \tparam Stable Stable merging incurs a performance penalty.
|
|
1156
|
+
* \tparam Sentinels The sequences have a sentinel element.
|
|
1157
|
+
* \return End iterator of output sequence.
|
|
1158
|
+
*/
|
|
1159
|
+
template <bool Stable, bool Sentinels, typename RandomAccessIteratorIterator,
|
|
1160
|
+
typename RandomAccessIterator3,
|
|
1161
|
+
typename Comparator = std::less<typename std::iterator_traits<
|
|
1162
|
+
typename std::iterator_traits<RandomAccessIteratorIterator>::
|
|
1163
|
+
value_type::first_type>::value_type> >
|
|
1164
|
+
RandomAccessIterator3 multiway_merge_base(
|
|
1165
|
+
RandomAccessIteratorIterator seqs_begin,
|
|
1166
|
+
RandomAccessIteratorIterator seqs_end, RandomAccessIterator3 target,
|
|
1167
|
+
typename std::iterator_traits<typename std::iterator_traits<
|
|
1168
|
+
RandomAccessIteratorIterator>::value_type::first_type>::difference_type
|
|
1169
|
+
size,
|
|
1170
|
+
Comparator comp = Comparator(),
|
|
1171
|
+
MultiwayMergeAlgorithm mwma = MWMA_ALGORITHM_DEFAULT)
|
|
1172
|
+
{
|
|
1173
|
+
using RandomAccessIterator = typename std::iterator_traits<
|
|
1174
|
+
RandomAccessIteratorIterator>::value_type::first_type;
|
|
1175
|
+
using value_type =
|
|
1176
|
+
typename std::iterator_traits<RandomAccessIterator>::value_type;
|
|
1177
|
+
|
|
1178
|
+
RandomAccessIterator3 return_target = target;
|
|
1179
|
+
int k = static_cast<int>(seqs_end - seqs_begin);
|
|
1180
|
+
|
|
1181
|
+
if (!Sentinels && mwma == MWMA_LOSER_TREE_SENTINEL)
|
|
1182
|
+
mwma = MWMA_LOSER_TREE_COMBINED;
|
|
1183
|
+
|
|
1184
|
+
using namespace multiway_merge_detail;
|
|
1185
|
+
|
|
1186
|
+
switch (k)
|
|
1187
|
+
{
|
|
1188
|
+
case 0:
|
|
1189
|
+
break;
|
|
1190
|
+
case 1:
|
|
1191
|
+
return_target =
|
|
1192
|
+
std::copy(seqs_begin[0].first, seqs_begin[0].first + size, target);
|
|
1193
|
+
seqs_begin[0].first += size;
|
|
1194
|
+
break;
|
|
1195
|
+
case 2:
|
|
1196
|
+
return_target = merge_advance(seqs_begin[0].first, seqs_begin[0].second,
|
|
1197
|
+
seqs_begin[1].first, seqs_begin[1].second,
|
|
1198
|
+
target, size, comp);
|
|
1199
|
+
break;
|
|
1200
|
+
case 3:
|
|
1201
|
+
switch (mwma)
|
|
1202
|
+
{
|
|
1203
|
+
case MWMA_LOSER_TREE_COMBINED:
|
|
1204
|
+
return_target = multiway_merge_3_combined(seqs_begin, seqs_end,
|
|
1205
|
+
target, size, comp);
|
|
1206
|
+
break;
|
|
1207
|
+
case MWMA_LOSER_TREE_SENTINEL:
|
|
1208
|
+
return_target = multiway_merge_3_variant<unguarded_iterator>(
|
|
1209
|
+
seqs_begin, seqs_end, target, size, comp);
|
|
1210
|
+
break;
|
|
1211
|
+
default:
|
|
1212
|
+
return_target = multiway_merge_3_variant<guarded_iterator>(
|
|
1213
|
+
seqs_begin, seqs_end, target, size, comp);
|
|
1214
|
+
break;
|
|
1215
|
+
}
|
|
1216
|
+
break;
|
|
1217
|
+
case 4:
|
|
1218
|
+
switch (mwma)
|
|
1219
|
+
{
|
|
1220
|
+
case MWMA_LOSER_TREE_COMBINED:
|
|
1221
|
+
return_target = multiway_merge_4_combined(seqs_begin, seqs_end,
|
|
1222
|
+
target, size, comp);
|
|
1223
|
+
break;
|
|
1224
|
+
case MWMA_LOSER_TREE_SENTINEL:
|
|
1225
|
+
return_target = multiway_merge_4_variant<unguarded_iterator>(
|
|
1226
|
+
seqs_begin, seqs_end, target, size, comp);
|
|
1227
|
+
break;
|
|
1228
|
+
default:
|
|
1229
|
+
return_target = multiway_merge_4_variant<guarded_iterator>(
|
|
1230
|
+
seqs_begin, seqs_end, target, size, comp);
|
|
1231
|
+
break;
|
|
1232
|
+
}
|
|
1233
|
+
break;
|
|
1234
|
+
default: {
|
|
1235
|
+
switch (mwma)
|
|
1236
|
+
{
|
|
1237
|
+
case MWMA_BUBBLE:
|
|
1238
|
+
return_target = multiway_merge_bubble<Stable>(seqs_begin, seqs_end,
|
|
1239
|
+
target, size, comp);
|
|
1240
|
+
break;
|
|
1241
|
+
case MWMA_LOSER_TREE:
|
|
1242
|
+
return_target = multiway_merge_loser_tree<
|
|
1243
|
+
LoserTree<Stable, value_type, Comparator> >(
|
|
1244
|
+
seqs_begin, seqs_end, target, size, comp);
|
|
1245
|
+
break;
|
|
1246
|
+
case MWMA_LOSER_TREE_COMBINED:
|
|
1247
|
+
return_target = multiway_merge_loser_tree_combined<Stable>(
|
|
1248
|
+
seqs_begin, seqs_end, target, size, comp);
|
|
1249
|
+
break;
|
|
1250
|
+
case MWMA_LOSER_TREE_SENTINEL:
|
|
1251
|
+
return_target = multiway_merge_loser_tree_sentinel<Stable>(
|
|
1252
|
+
seqs_begin, seqs_end, target, size, comp);
|
|
1253
|
+
break;
|
|
1254
|
+
default:
|
|
1255
|
+
assert(0 && "multiway_merge algorithm not implemented");
|
|
1256
|
+
break;
|
|
1257
|
+
}
|
|
1258
|
+
}
|
|
1259
|
+
}
|
|
1260
|
+
|
|
1261
|
+
return return_target;
|
|
1262
|
+
}
|
|
1263
|
+
|
|
1264
|
+
/******************************************************************************/
|
|
1265
|
+
// multiway_merge() Frontends
|
|
1266
|
+
|
|
1267
|
+
/*!
|
|
1268
|
+
* Sequential multi-way merge.
|
|
1269
|
+
*
|
|
1270
|
+
* \param seqs_begin Begin iterator of iterator pair input sequence.
|
|
1271
|
+
* \param seqs_end End iterator of iterator pair input sequence.
|
|
1272
|
+
* \param target Begin iterator out output sequence.
|
|
1273
|
+
* \param size Maximum size to merge.
|
|
1274
|
+
* \param comp Comparator.
|
|
1275
|
+
* \param mwma MultiwayMergeAlgorithm set to use.
|
|
1276
|
+
* \return End iterator of output sequence.
|
|
1277
|
+
*/
|
|
1278
|
+
template <typename RandomAccessIteratorIterator, typename RandomAccessIterator3,
|
|
1279
|
+
typename Comparator = std::less<typename std::iterator_traits<
|
|
1280
|
+
typename std::iterator_traits<RandomAccessIteratorIterator>::
|
|
1281
|
+
value_type::first_type>::value_type> >
|
|
1282
|
+
RandomAccessIterator3 multiway_merge(
|
|
1283
|
+
RandomAccessIteratorIterator seqs_begin,
|
|
1284
|
+
RandomAccessIteratorIterator seqs_end, RandomAccessIterator3 target,
|
|
1285
|
+
typename std::iterator_traits<typename std::iterator_traits<
|
|
1286
|
+
RandomAccessIteratorIterator>::value_type::first_type>::difference_type
|
|
1287
|
+
size,
|
|
1288
|
+
Comparator comp = Comparator(),
|
|
1289
|
+
MultiwayMergeAlgorithm mwma = MWMA_ALGORITHM_DEFAULT)
|
|
1290
|
+
{
|
|
1291
|
+
return multiway_merge_base</* Stable */ false, /* Sentinels */ false>(
|
|
1292
|
+
seqs_begin, seqs_end, target, size, comp, mwma);
|
|
1293
|
+
}
|
|
1294
|
+
|
|
1295
|
+
/*!
|
|
1296
|
+
* Stable sequential multi-way merge.
|
|
1297
|
+
*
|
|
1298
|
+
* \param seqs_begin Begin iterator of iterator pair input sequence.
|
|
1299
|
+
* \param seqs_end End iterator of iterator pair input sequence.
|
|
1300
|
+
* \param target Begin iterator out output sequence.
|
|
1301
|
+
* \param size Maximum size to merge.
|
|
1302
|
+
* \param comp Comparator.
|
|
1303
|
+
* \param mwma MultiwayMergeAlgorithm set to use.
|
|
1304
|
+
* \return End iterator of output sequence.
|
|
1305
|
+
*/
|
|
1306
|
+
template <typename RandomAccessIteratorIterator, typename RandomAccessIterator3,
|
|
1307
|
+
typename Comparator = std::less<typename std::iterator_traits<
|
|
1308
|
+
typename std::iterator_traits<RandomAccessIteratorIterator>::
|
|
1309
|
+
value_type::first_type>::value_type> >
|
|
1310
|
+
RandomAccessIterator3 stable_multiway_merge(
|
|
1311
|
+
RandomAccessIteratorIterator seqs_begin,
|
|
1312
|
+
RandomAccessIteratorIterator seqs_end, RandomAccessIterator3 target,
|
|
1313
|
+
typename std::iterator_traits<typename std::iterator_traits<
|
|
1314
|
+
RandomAccessIteratorIterator>::value_type::first_type>::difference_type
|
|
1315
|
+
size,
|
|
1316
|
+
Comparator comp = Comparator(),
|
|
1317
|
+
MultiwayMergeAlgorithm mwma = MWMA_ALGORITHM_DEFAULT)
|
|
1318
|
+
{
|
|
1319
|
+
return multiway_merge_base</* Stable */ true, /* Sentinels */ false>(
|
|
1320
|
+
seqs_begin, seqs_end, target, size, comp, mwma);
|
|
1321
|
+
}
|
|
1322
|
+
|
|
1323
|
+
/*!
|
|
1324
|
+
* Sequential multi-way merge with sentinels in sequences.
|
|
1325
|
+
*
|
|
1326
|
+
* \param seqs_begin Begin iterator of iterator pair input sequence.
|
|
1327
|
+
* \param seqs_end End iterator of iterator pair input sequence.
|
|
1328
|
+
* \param target Begin iterator out output sequence.
|
|
1329
|
+
* \param size Maximum size to merge.
|
|
1330
|
+
* \param comp Comparator.
|
|
1331
|
+
* \param mwma MultiwayMergeAlgorithm set to use.
|
|
1332
|
+
* \return End iterator of output sequence.
|
|
1333
|
+
*/
|
|
1334
|
+
template <typename RandomAccessIteratorIterator, typename RandomAccessIterator3,
|
|
1335
|
+
typename Comparator = std::less<typename std::iterator_traits<
|
|
1336
|
+
typename std::iterator_traits<RandomAccessIteratorIterator>::
|
|
1337
|
+
value_type::first_type>::value_type> >
|
|
1338
|
+
RandomAccessIterator3 multiway_merge_sentinels(
|
|
1339
|
+
RandomAccessIteratorIterator seqs_begin,
|
|
1340
|
+
RandomAccessIteratorIterator seqs_end, RandomAccessIterator3 target,
|
|
1341
|
+
typename std::iterator_traits<typename std::iterator_traits<
|
|
1342
|
+
RandomAccessIteratorIterator>::value_type::first_type>::difference_type
|
|
1343
|
+
size,
|
|
1344
|
+
Comparator comp = Comparator(),
|
|
1345
|
+
MultiwayMergeAlgorithm mwma = MWMA_ALGORITHM_DEFAULT)
|
|
1346
|
+
{
|
|
1347
|
+
return multiway_merge_base</* Stable */ false, /* Sentinels */ true>(
|
|
1348
|
+
seqs_begin, seqs_end, target, size, comp, mwma);
|
|
1349
|
+
}
|
|
1350
|
+
|
|
1351
|
+
/*!
|
|
1352
|
+
* Stable sequential multi-way merge with sentinels in sequences.
|
|
1353
|
+
*
|
|
1354
|
+
* \param seqs_begin Begin iterator of iterator pair input sequence.
|
|
1355
|
+
* \param seqs_end End iterator of iterator pair input sequence.
|
|
1356
|
+
* \param target Begin iterator out output sequence.
|
|
1357
|
+
* \param size Maximum size to merge.
|
|
1358
|
+
* \param comp Comparator.
|
|
1359
|
+
* \param mwma MultiwayMergeAlgorithm set to use.
|
|
1360
|
+
* \return End iterator of output sequence.
|
|
1361
|
+
*/
|
|
1362
|
+
template <typename RandomAccessIteratorIterator, typename RandomAccessIterator3,
|
|
1363
|
+
typename Comparator = std::less<typename std::iterator_traits<
|
|
1364
|
+
typename std::iterator_traits<RandomAccessIteratorIterator>::
|
|
1365
|
+
value_type::first_type>::value_type> >
|
|
1366
|
+
RandomAccessIterator3 stable_multiway_merge_sentinels(
|
|
1367
|
+
RandomAccessIteratorIterator seqs_begin,
|
|
1368
|
+
RandomAccessIteratorIterator seqs_end, RandomAccessIterator3 target,
|
|
1369
|
+
typename std::iterator_traits<typename std::iterator_traits<
|
|
1370
|
+
RandomAccessIteratorIterator>::value_type::first_type>::difference_type
|
|
1371
|
+
size,
|
|
1372
|
+
Comparator comp = Comparator(),
|
|
1373
|
+
MultiwayMergeAlgorithm mwma = MWMA_ALGORITHM_DEFAULT)
|
|
1374
|
+
{
|
|
1375
|
+
return multiway_merge_base</* Stable */ true, /* Sentinels */ true>(
|
|
1376
|
+
seqs_begin, seqs_end, target, size, comp, mwma);
|
|
1377
|
+
}
|
|
1378
|
+
|
|
1379
|
+
//! \}
|
|
1380
|
+
|
|
1381
|
+
} // namespace tlx
|
|
1382
|
+
|
|
1383
|
+
#endif // !TLX_ALGORITHM_MULTIWAY_MERGE_HEADER
|
|
1384
|
+
|
|
1385
|
+
/******************************************************************************/
|