RapidFuzz
Loading...
Searching...
No Matches
common.hpp
1/* SPDX-License-Identifier: MIT */
2/* Copyright © 2021 Max Bachmann */
3
4#pragma once
5#include <cstring>
6#include <rapidfuzz/details/Range.hpp>
7#include <rapidfuzz/details/SplittedSentenceView.hpp>
8#include <rapidfuzz/details/intrinsics.hpp>
9#include <rapidfuzz/details/type_traits.hpp>
10#include <rapidfuzz/details/types.hpp>
11
12#if defined(__APPLE__) && !defined(_LIBCPP_HAS_C11_FEATURES)
13# include <mm_malloc.h>
14#endif
15
16namespace rapidfuzz {
17namespace detail {
18
19template <typename InputIt1, typename InputIt2, typename InputIt3>
20struct DecomposedSet {
21 SplittedSentenceView<InputIt1> difference_ab;
22 SplittedSentenceView<InputIt2> difference_ba;
23 SplittedSentenceView<InputIt3> intersection;
24 DecomposedSet(SplittedSentenceView<InputIt1> diff_ab, SplittedSentenceView<InputIt2> diff_ba,
25 SplittedSentenceView<InputIt3> intersect)
26 : difference_ab(std::move(diff_ab)),
27 difference_ba(std::move(diff_ba)),
28 intersection(std::move(intersect))
29 {}
30};
31
32static inline size_t abs_diff(size_t a, size_t b)
33{
34 return a > b ? a - b : b - a;
35}
36
37template <typename TO, typename FROM>
38TO opt_static_cast(const FROM& value)
39{
40 /* calling the cast through this template function somehow avoids useless cast warnings */
41 return static_cast<TO>(value);
42}
43
44static inline double NormSim_to_NormDist(double score_cutoff, double imprecision = 0.00001)
45{
46 return std::min(1.0, 1.0 - score_cutoff + imprecision);
47}
48
49template <typename InputIt1, typename InputIt2>
50DecomposedSet<InputIt1, InputIt2, InputIt1> set_decomposition(SplittedSentenceView<InputIt1> a,
51 SplittedSentenceView<InputIt2> b);
52
53template <typename InputIt1, typename InputIt2>
54StringAffix remove_common_affix(Range<InputIt1>& s1, Range<InputIt2>& s2);
55
56template <typename InputIt1, typename InputIt2>
57size_t remove_common_prefix(Range<InputIt1>& s1, Range<InputIt2>& s2);
58
59template <typename InputIt1, typename InputIt2>
60size_t remove_common_suffix(Range<InputIt1>& s1, Range<InputIt2>& s2);
61
62template <typename InputIt, typename CharT = iter_value_t<InputIt>>
63SplittedSentenceView<InputIt> sorted_split(InputIt first, InputIt last);
64
65static inline void* rf_aligned_alloc(size_t alignment, size_t size)
66{
67#if defined(_WIN32)
68 return _aligned_malloc(size, alignment);
69#elif defined(__APPLE__) && !defined(_LIBCPP_HAS_C11_FEATURES)
70 return _mm_malloc(size, alignment);
71#elif defined(__ANDROID__) && __ANDROID_API__ > 16
72 void* ptr = nullptr;
73 return posix_memalign(&ptr, alignment, size) ? nullptr : ptr;
74#else
75 return aligned_alloc(alignment, size);
76#endif
77}
78
79static inline void rf_aligned_free(void* ptr)
80{
81#if defined(_WIN32)
82 _aligned_free(ptr);
83#elif defined(__APPLE__) && !defined(_LIBCPP_HAS_C11_FEATURES)
84 _mm_free(ptr);
85#else
86 free(ptr);
87#endif
88}
89
90} // namespace detail
91} // namespace rapidfuzz
92
93#include <rapidfuzz/details/common_impl.hpp>