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