Geogram Version 1.10.0-rc
A programming library of geometric algorithms
Loading...
Searching...
No Matches
algorithm.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2000-2022 Inria
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * * Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * * Neither the name of the ALICE Project-Team nor the names of its
14 * contributors may be used to endorse or promote products derived from this
15 * software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
21 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 * POSSIBILITY OF SUCH DAMAGE.
28 *
29 * Contact: Bruno Levy
30 *
31 * https://www.inria.fr/fr/bruno-levy
32 *
33 * Inria,
34 * Domaine de Voluceau,
35 * 78150 Le Chesnay - Rocquencourt
36 * FRANCE
37 *
38 */
39
40#ifndef GEOGRAM_BASIC_ALGORITHM
41#define GEOGRAM_BASIC_ALGORITHM
42
44#include <algorithm>
45#include <random>
46
47#ifdef GEO_PARALLEL_STL
48#include <execution>
49#endif
50
56namespace GEO {
57
69 bool GEOGRAM_API uses_parallel_algorithm(size_t size=0);
70
83 template <typename ITERATOR>
84 inline void sort(
85 const ITERATOR& begin, const ITERATOR& end
86 ) {
87#ifdef GEO_PARALLEL_STL
88 if(uses_parallel_algorithm(size_t(end - begin))) {
89 std::sort(std::execution::par, begin, end);
90 } else
91#endif
92 {
93 std::sort(begin, end);
94 }
95 }
96
116 template <typename ITERATOR, typename CMP>
117 inline void sort(
118 const ITERATOR& begin, const ITERATOR& end, const CMP& cmp
119 ) {
120#ifdef GEO_PARALLEL_STL
121 if(uses_parallel_algorithm(size_t(end - begin))) {
122 std::sort(std::execution::par, begin, end, cmp);
123 } else
124#endif
125 {
126 std::sort(begin, end, cmp);
127 }
128 }
129
130
135 template <typename VECTOR> inline void sort_unique(VECTOR& v) {
136 std::sort(v.begin(), v.end());
137 // Note that std::unique leaves a 'queue' of duplicated elements
138 // at the end of the vector, and returns an iterator that
139 // indicates where to stop.
140 v.erase(
141 std::unique(v.begin(), v.end()), v.end()
142 );
143 }
144
151 template <typename ITERATOR> inline void sort_3(ITERATOR items) {
152 if (items[0]> items[1]) {
153 std::swap(items[0], items[1]);
154 }
155 if (items[1]> items[2]) {
156 std::swap(items[1], items[2]);
157 }
158 if (items[0]> items[1]) {
159 std::swap(items[0], items[1]);
160 }
161 }
162
169 template <typename ITERATOR> inline void sort_4(ITERATOR items) {
170 if (items[1] < items[0]) {
171 std::swap(items[0], items[1]);
172 }
173 if (items[3] < items[2]) {
174 std::swap(items[2], items[3]);
175 }
176 if (items[2] < items[0]) {
177 std::swap(items[0], items[2]);
178 std::swap(items[1], items[3]);
179 }
180 if (items[2] < items[1]) {
181 std::swap(items[1], items[2]);
182 }
183 if (items[3] < items[2]) {
184 std::swap(items[2], items[3]);
185 }
186 }
187
195 template <typename ITERATOR>
196 inline void random_shuffle(
197 const ITERATOR& begin, const ITERATOR& end
198 ) {
199 std::random_device rng;
200 std::mt19937 urng(rng());
201 std::shuffle(begin, end, urng);
202 }
203
204}
205
206#endif
Common include file, providing basic definitions. Should be included before anything else by all head...
Global Vorpaline namespace.
Definition basic.h:55
void sort_unique(VECTOR &v)
Sorts a vector and suppresses all duplicated elements.
Definition algorithm.h:135
void sort_4(ITERATOR items)
Specialized sort routine for 4 elements.
Definition algorithm.h:169
void sort(const ITERATOR &begin, const ITERATOR &end)
Sorts elements in parallel.
Definition algorithm.h:84
bool uses_parallel_algorithm(size_t size=0)
Checks whether parallel algorithms are used.
void sort_3(ITERATOR items)
Specialized sort routine for 3 elements.
Definition algorithm.h:151
void random_shuffle(const ITERATOR &begin, const ITERATOR &end)
Applies a random permutation to a sequence.
Definition algorithm.h:196