cpp-toolbox  0.0.1
A toolbox library for C++
Loading...
Searching...
No Matches
minmax.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <algorithm>
4#include <cmath>
5#include <future>
6#include <iostream>
7#include <iterator>
8#include <limits>
9#include <string> // For std::string, std::wstring
10#include <thread>
11#include <type_traits>
12#include <utility>
13#include <vector>
14
17#include <cpp-toolbox/cpp-toolbox_export.hpp>
20
22{
23
31template<typename T, typename = void>
32struct is_calculable_container : std::false_type
33{
34};
35
46template<typename T>
48 T,
49 std::void_t<decltype(std::begin(std::declval<const T&>())),
50 decltype(std::end(std::declval<const T&>())),
51 typename T::value_type>>
52 : std::bool_constant<!std::is_same_v<std::decay_t<T>, std::string>
53 && !std::is_same_v<std::decay_t<T>, std::wstring>>
54{
55};
56
63template<typename T>
64inline constexpr bool is_calculable_container_v =
66
67} // namespace toolbox::types::detail
68
69namespace toolbox::types
70{
71
90template<typename T>
91struct CPP_TOOLBOX_EXPORT minmax_t
92{
93 T min;
94 T max;
95 bool initialized_ = false;
96
103 minmax_t(T initial_min, T initial_max);
104
108 minmax_t();
109
110 // Rule of Five members (defaulted)
111 minmax_t(const minmax_t& other) = default;
112 minmax_t(minmax_t&& other) noexcept = default;
113 minmax_t& operator=(const minmax_t& other) = default;
114 minmax_t& operator=(minmax_t&& other) noexcept = default;
115 ~minmax_t() = default;
116
122 minmax_t& operator+=(const T& value);
123};
124
125// --- Full specializations for primitive types' default constructors ---
126
130template<>
132 : min(std::numeric_limits<int>::max())
133 , max(std::numeric_limits<int>::min())
134 , initialized_(false)
135{
136}
137
141template<>
143 : min(std::numeric_limits<float>::max())
144 , max(std::numeric_limits<float>::lowest())
145 , initialized_(false)
146{
147}
148
152template<>
154 : min(std::numeric_limits<double>::max())
155 , max(std::numeric_limits<double>::lowest())
156 , initialized_(false)
157{
158}
159
163template<>
165 : min(std::numeric_limits<long>::max())
166 , max(std::numeric_limits<long>::min())
167 , initialized_(false)
168{
169}
170
175template<>
177 : min(std::numeric_limits<unsigned int>::max())
178 , max(std::numeric_limits<unsigned int>::min())
179 , initialized_(false)
180{
181}
182
187template<>
189 : min(std::numeric_limits<unsigned long>::max())
190 , max(std::numeric_limits<unsigned long>::min())
191 , initialized_(false)
192{
193}
194
199template<>
201 : min(std::numeric_limits<unsigned long long>::max())
202 , max(std::numeric_limits<unsigned long long>::min())
203 , initialized_(false)
204{
205}
206
211template<>
213 : min(std::numeric_limits<unsigned char>::max())
214 , max(std::numeric_limits<unsigned char>::min())
215 , initialized_(false)
216{
217}
218
223template<>
225 : min(std::numeric_limits<unsigned short>::max())
226 , max(std::numeric_limits<unsigned short>::min())
227 , initialized_(false)
228{
229}
230
245template<typename T>
246struct CPP_TOOLBOX_EXPORT minmax_t<point_t<T>>
247{
250 bool initialized_ = false;
251
252 minmax_t();
253 minmax_t(point_t<T> initial_min, point_t<T> initial_max);
254
255 // Rule of Five members (defaulted)
256 minmax_t(const minmax_t&) = default;
257 minmax_t(minmax_t&&) noexcept = default;
258 minmax_t& operator=(const minmax_t&) = default;
259 minmax_t& operator=(minmax_t&&) noexcept = default;
260 ~minmax_t() = default;
261
262 minmax_t& operator+=(const point_t<T>& value);
263};
264
278template<typename T>
279[[nodiscard]] minmax_t<T> combine_minmax(const minmax_t<T>& a,
280 const minmax_t<T>& b);
281
291template<typename CoordT>
292[[nodiscard]] minmax_t<point_t<CoordT>> combine_minmax(
293 const minmax_t<point_t<CoordT>>& a, const minmax_t<point_t<CoordT>>& b);
294
303template<typename InputType>
304[[nodiscard]] auto calculate_minmax(const InputType& input)
305 -> std::enable_if_t<!detail::is_calculable_container_v<InputType>,
306 minmax_t<std::decay_t<InputType>>>;
307
321template<typename InputType>
322[[nodiscard]] auto calculate_minmax(const InputType& input)
323 -> std::enable_if_t<detail::is_calculable_container_v<InputType>,
324 minmax_t<typename InputType::value_type>>;
325
334template<typename T>
335[[nodiscard]] auto calculate_minmax(const point_cloud_t<T>& input)
336 -> minmax_t<point_t<T>>;
337
347template<typename InputType>
348[[nodiscard]] auto calculate_minmax_parallel(const InputType& input)
349 -> std::enable_if_t<!detail::is_calculable_container_v<InputType>,
350 minmax_t<std::decay_t<InputType>>>;
351
367template<typename InputType>
368[[nodiscard]] auto calculate_minmax_parallel(const InputType& input)
369 -> std::enable_if_t<detail::is_calculable_container_v<InputType>,
370 minmax_t<typename InputType::value_type>>;
371
381template<typename T>
382[[nodiscard]] auto calculate_minmax_parallel(const point_cloud_t<T>& input)
383 -> minmax_t<point_t<T>>;
384
385} // namespace toolbox::types
386
387// Include the implementation file at the end
388#include "cpp-toolbox/types/impl/minmax_impl.hpp"
包含点和相关数据的点云类 / A point cloud class containing points and associated data
Definition point.hpp:268
Definition minmax.hpp:22
constexpr bool is_calculable_container_v
辅助变量模板,用于快速检查类型是否为可计算容器 / Helper variable template for quick checking if type is calculable container
Definition minmax.hpp:64
Definition minmax_impl.hpp:21
辅助类型特征,用于检查类型是否为可计算容器 / Helper type trait to check if a type is a calculable container
Definition minmax.hpp:33
point_t< T > max
最大点坐标 / Maximum point coordinates
Definition minmax.hpp:249
minmax_t(const minmax_t &)=default
minmax_t(minmax_t &&) noexcept=default
point_t< T > min
最小点坐标 / Minimum point coordinates
Definition minmax.hpp:248
存储和计算最小最大值的主模板类 / Primary template class for storing and calculating minimum and maximum values
Definition minmax.hpp:92
minmax_t & operator=(minmax_t &&other) noexcept=default
minmax_t & operator=(const minmax_t &other)=default
minmax_t(const minmax_t &other)=default
T max
最大值 / Maximum value
Definition minmax.hpp:94
minmax_t()
默认构造函数 / Default constructor
Definition minmax_impl.hpp:27
minmax_t(minmax_t &&other) noexcept=default
T min
最小值 / Minimum value
Definition minmax.hpp:93
3D点/向量模板类 / A 3D point/vector template class
Definition point.hpp:48