1
1
// Licensed under the MIT License <http://opensource.org/licenses/MIT>.
2
2
// SPDX-License-Identifier: MIT
3
3
// RapidFuzz v1.0.2
4
- // Generated: 2024-12-25 02:45:23.298368
4
+ // Generated: 2024-12-25 03:52:00.425895
5
5
// ----------------------------------------------------------
6
6
// This file is an amalgamation of multiple different files.
7
7
// You probably shouldn't edit it directly.
@@ -392,12 +392,12 @@ struct ShiftedBitMatrix {
392
392
return bool (m_matrix[row][col_word] & col_mask);
393
393
}
394
394
395
- auto operator [](size_t row) noexcept
395
+ BitMatrixView<value_type, false > operator [](size_t row) noexcept
396
396
{
397
397
return m_matrix[row];
398
398
}
399
399
400
- auto operator [](size_t row) const noexcept
400
+ BitMatrixView<value_type, true > operator [](size_t row) const noexcept
401
401
{
402
402
return m_matrix[row];
403
403
}
@@ -436,6 +436,12 @@ struct ShiftedBitMatrix {
436
436
# define RAPIDFUZZ_IF_CONSTEXPR if
437
437
#endif
438
438
439
+ #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201402L) || __cplusplus >= 201402L)
440
+ # define RAPIDFUZZ_CONSTEXPR_CXX14 constexpr
441
+ #else
442
+ # define RAPIDFUZZ_CONSTEXPR_CXX14
443
+ #endif
444
+
439
445
#include < stddef.h>
440
446
#include < stdexcept>
441
447
#include < vector>
@@ -1088,18 +1094,27 @@ static inline void assume(bool b)
1088
1094
#endif
1089
1095
}
1090
1096
1097
+ namespace to_begin_detail {
1098
+ using std::begin;
1099
+
1091
1100
template <typename CharT>
1092
1101
CharT* to_begin (CharT* s)
1093
1102
{
1094
1103
return s;
1095
1104
}
1096
1105
1097
1106
template <typename T>
1098
- auto to_begin (T& x)
1107
+ auto to_begin (T& x) -> decltype(begin(x))
1099
1108
{
1100
- using std::begin;
1109
+
1101
1110
return begin (x);
1102
1111
}
1112
+ } // namespace to_begin_detail
1113
+
1114
+ using to_begin_detail::to_begin;
1115
+
1116
+ namespace to_end_detail {
1117
+ using std::end;
1103
1118
1104
1119
template <typename CharT>
1105
1120
CharT* to_end (CharT* s)
@@ -1112,11 +1127,13 @@ CharT* to_end(CharT* s)
1112
1127
}
1113
1128
1114
1129
template <typename T>
1115
- auto to_end (T& x)
1130
+ auto to_end (T& x) -> decltype(end(x))
1116
1131
{
1117
- using std::end;
1118
1132
return end (x);
1119
1133
}
1134
+ } // namespace to_end_detail
1135
+
1136
+ using to_end_detail::to_end;
1120
1137
1121
1138
template <typename Iter>
1122
1139
class Range {
@@ -1131,47 +1148,47 @@ class Range {
1131
1148
using iterator = Iter;
1132
1149
using reverse_iterator = std::reverse_iterator<iterator>;
1133
1150
1134
- constexpr Range (Iter first, Iter last) : _first(first), _last(last)
1151
+ Range (Iter first, Iter last) : _first(first), _last(last)
1135
1152
{
1136
1153
assert (std::distance (_first, _last) >= 0 );
1137
1154
_size = static_cast <size_t >(std::distance (_first, _last));
1138
1155
}
1139
1156
1140
- constexpr Range (Iter first, Iter last, size_t size) : _first(first), _last(last), _size(size)
1157
+ Range (Iter first, Iter last, size_t size) : _first(first), _last(last), _size(size)
1141
1158
{}
1142
1159
1143
1160
template <typename T>
1144
- constexpr Range (T& x) : Range(to_begin(x), to_end(x))
1161
+ Range (T& x) : Range(to_begin(x), to_end(x))
1145
1162
{}
1146
1163
1147
- constexpr iterator begin () const noexcept
1164
+ iterator begin () const noexcept
1148
1165
{
1149
1166
return _first;
1150
1167
}
1151
- constexpr iterator end () const noexcept
1168
+ iterator end () const noexcept
1152
1169
{
1153
1170
return _last;
1154
1171
}
1155
1172
1156
- constexpr reverse_iterator rbegin () const noexcept
1173
+ reverse_iterator rbegin () const noexcept
1157
1174
{
1158
1175
return reverse_iterator (end ());
1159
1176
}
1160
- constexpr reverse_iterator rend () const noexcept
1177
+ reverse_iterator rend () const noexcept
1161
1178
{
1162
1179
return reverse_iterator (begin ());
1163
1180
}
1164
1181
1165
- constexpr size_t size () const
1182
+ size_t size () const
1166
1183
{
1167
1184
return _size;
1168
1185
}
1169
1186
1170
- constexpr bool empty () const
1187
+ bool empty () const
1171
1188
{
1172
1189
return size () == 0 ;
1173
1190
}
1174
- explicit constexpr operator bool () const
1191
+ explicit operator bool () const
1175
1192
{
1176
1193
return !empty ();
1177
1194
}
@@ -1180,23 +1197,24 @@ class Range {
1180
1197
typename = rapidfuzz::rf_enable_if_t <
1181
1198
std::is_base_of<std::random_access_iterator_tag,
1182
1199
typename std::iterator_traits<IterCopy>::iterator_category>::value>>
1183
- constexpr decltype ( auto ) operator[](size_t n) const
1200
+ auto operator [](size_t n) const -> decltype (*_first)
1184
1201
{
1185
1202
return _first[static_cast <ptrdiff_t >(n)];
1186
1203
}
1187
1204
1188
- constexpr void remove_prefix (size_t n)
1205
+ void remove_prefix (size_t n)
1189
1206
{
1190
1207
std::advance (_first, static_cast <ptrdiff_t >(n));
1191
1208
_size -= n;
1192
1209
}
1193
- constexpr void remove_suffix (size_t n)
1210
+
1211
+ void remove_suffix (size_t n)
1194
1212
{
1195
1213
std::advance (_last, -static_cast <ptrdiff_t >(n));
1196
1214
_size -= n;
1197
1215
}
1198
1216
1199
- constexpr Range subseq (size_t pos = 0 , size_t count = std::numeric_limits<size_t >::max())
1217
+ Range subseq (size_t pos = 0 , size_t count = std::numeric_limits<size_t >::max())
1200
1218
{
1201
1219
if (pos > size ()) throw std::out_of_range (" Index out of range in Range::substr" );
1202
1220
@@ -1207,17 +1225,17 @@ class Range {
1207
1225
return res;
1208
1226
}
1209
1227
1210
- constexpr decltype ( auto ) front() const
1228
+ const value_type& front () const
1211
1229
{
1212
- return *( _first) ;
1230
+ return *_first;
1213
1231
}
1214
1232
1215
- constexpr decltype ( auto ) back() const
1233
+ const value_type& back () const
1216
1234
{
1217
1235
return *(_last - 1 );
1218
1236
}
1219
1237
1220
- constexpr Range<reverse_iterator> reversed () const
1238
+ Range<reverse_iterator> reversed () const
1221
1239
{
1222
1240
return {rbegin (), rend (), _size};
1223
1241
}
@@ -1233,16 +1251,15 @@ class Range {
1233
1251
};
1234
1252
1235
1253
template <typename Iter>
1236
- constexpr auto make_range (Iter first, Iter last) -> Range<Iter>
1254
+ auto make_range (Iter first, Iter last) -> Range<Iter>
1237
1255
{
1238
1256
return Range<Iter>(first, last);
1239
1257
}
1240
1258
1241
1259
template <typename T>
1242
- constexpr auto make_range (T& x) -> Range<decltype(to_begin(x))>
1260
+ auto make_range (T& x) -> Range<decltype(to_begin(x))>
1243
1261
{
1244
- auto first = to_begin (x);
1245
- return Range<decltype (first)>(first, to_end (x));
1262
+ return {to_begin (x), to_end (x)};
1246
1263
}
1247
1264
1248
1265
template <typename InputIt1, typename InputIt2>
@@ -1425,7 +1442,7 @@ constexpr uint64_t shl64(uint64_t a, U shift)
1425
1442
return (shift < 64 ) ? a << shift : 0 ;
1426
1443
}
1427
1444
1428
- constexpr uint64_t addc64 (uint64_t a, uint64_t b, uint64_t carryin, uint64_t * carryout)
1445
+ RAPIDFUZZ_CONSTEXPR_CXX14 uint64_t addc64 (uint64_t a, uint64_t b, uint64_t carryin, uint64_t * carryout)
1429
1446
{
1430
1447
/* todo should use _addcarry_u64 when available */
1431
1448
a += carryin;
@@ -1436,7 +1453,7 @@ constexpr uint64_t addc64(uint64_t a, uint64_t b, uint64_t carryin, uint64_t* ca
1436
1453
}
1437
1454
1438
1455
template <typename T, typename U>
1439
- constexpr T ceil_div (T a, U divisor)
1456
+ RAPIDFUZZ_CONSTEXPR_CXX14 T ceil_div (T a, U divisor)
1440
1457
{
1441
1458
T _div = static_cast <T>(divisor);
1442
1459
return a / _div + static_cast <T>(a % _div != 0 );
@@ -1472,7 +1489,7 @@ static inline size_t popcount(uint8_t x)
1472
1489
}
1473
1490
1474
1491
template <typename T>
1475
- constexpr T rotl (T x, unsigned int n)
1492
+ RAPIDFUZZ_CONSTEXPR_CXX14 T rotl (T x, unsigned int n)
1476
1493
{
1477
1494
unsigned int num_bits = std::numeric_limits<T>::digits;
1478
1495
assert (n < num_bits);
@@ -1723,6 +1740,15 @@ DecomposedSet<InputIt1, InputIt2, InputIt1> set_decomposition(SplittedSentenceVi
1723
1740
return {difference_ab, difference_ba, intersection};
1724
1741
}
1725
1742
1743
+ template <class InputIt1 , class InputIt2 >
1744
+ std::pair<InputIt1, InputIt2> mismatch (InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2)
1745
+ {
1746
+ while (first1 != last1 && first2 != last2 && *first1 == *first2)
1747
+ ++first1, ++first2;
1748
+
1749
+ return std::make_pair (first1, first2);
1750
+ }
1751
+
1726
1752
/* *
1727
1753
* Removes common prefix of two string views
1728
1754
*/
@@ -1731,7 +1757,7 @@ size_t remove_common_prefix(Range<InputIt1>& s1, Range<InputIt2>& s2)
1731
1757
{
1732
1758
auto first1 = std::begin (s1);
1733
1759
size_t prefix = static_cast <size_t >(
1734
- std::distance (first1, std:: mismatch (first1, std::end (s1), std::begin (s2), std::end (s2)).first ));
1760
+ std::distance (first1, mismatch (first1, std::end (s1), std::begin (s2), std::end (s2)).first ));
1735
1761
s1.remove_prefix (prefix);
1736
1762
s2.remove_prefix (prefix);
1737
1763
return prefix;
@@ -1745,7 +1771,7 @@ size_t remove_common_suffix(Range<InputIt1>& s1, Range<InputIt2>& s2)
1745
1771
{
1746
1772
auto rfirst1 = s1.rbegin ();
1747
1773
size_t suffix = static_cast <size_t >(
1748
- std::distance (rfirst1, std:: mismatch (rfirst1, s1.rend (), s2.rbegin (), s2.rend ()).first ));
1774
+ std::distance (rfirst1, mismatch (rfirst1, s1.rend (), s2.rbegin (), s2.rend ()).first ));
1749
1775
s1.remove_suffix (suffix);
1750
1776
s2.remove_suffix (suffix);
1751
1777
return suffix;
@@ -5903,6 +5929,11 @@ struct JaroSimilaritySimdBounds {
5903
5929
5904
5930
template <typename VecType, typename InputIt, int _lto_hack = RAPIDFUZZ_LTO_HACK>
5905
5931
static inline auto jaro_similarity_prepare_bound_short_s2 (const VecType* s1_lengths, Range<InputIt>& s2)
5932
+ # ifdef RAPIDFUZZ_AVX2
5933
+ -> JaroSimilaritySimdBounds<simd_avx2::native_simd<VecType>>
5934
+ # else
5935
+ -> JaroSimilaritySimdBounds<simd_sse2::native_simd<VecType>>
5936
+ # endif
5906
5937
{
5907
5938
# ifdef RAPIDFUZZ_AVX2
5908
5939
using namespace simd_avx2 ;
@@ -5970,6 +6001,11 @@ static inline auto jaro_similarity_prepare_bound_short_s2(const VecType* s1_leng
5970
6001
5971
6002
template <typename VecType, typename InputIt, int _lto_hack = RAPIDFUZZ_LTO_HACK>
5972
6003
static inline auto jaro_similarity_prepare_bound_long_s2 (const VecType* s1_lengths, Range<InputIt>& s2)
6004
+ # ifdef RAPIDFUZZ_AVX2
6005
+ -> JaroSimilaritySimdBounds<simd_avx2::native_simd<VecType>>
6006
+ # else
6007
+ -> JaroSimilaritySimdBounds<simd_sse2::native_simd<VecType>>
6008
+ # endif
5973
6009
{
5974
6010
# ifdef RAPIDFUZZ_AVX2
5975
6011
using namespace simd_avx2 ;
@@ -6354,7 +6390,7 @@ struct MultiJaro : public detail::MultiSimilarityBase<MultiJaro<MaxLen>, double,
6354
6390
friend detail::MultiSimilarityBase<MultiJaro<MaxLen>, double , 0 , 1 >;
6355
6391
friend detail::MultiNormalizedMetricBase<MultiJaro<MaxLen>, double >;
6356
6392
6357
- static_assert (MaxLen == 8 || MaxLen == 16 || MaxLen == 32 || MaxLen == 64 );
6393
+ static_assert (MaxLen == 8 || MaxLen == 16 || MaxLen == 32 || MaxLen == 64 , " incorrect MaxLen used " );
6358
6394
6359
6395
using VecType = typename std::conditional<
6360
6396
MaxLen == 8 , uint8_t ,
@@ -10415,7 +10451,7 @@ double CachedRatio<CharT1>::similarity(const Sentence2& s2, double score_cutoff,
10415
10451
10416
10452
namespace fuzz_detail {
10417
10453
10418
- static constexpr double norm_distance (size_t dist, size_t lensum, double score_cutoff = 0 )
10454
+ static RAPIDFUZZ_CONSTEXPR_CXX14 double norm_distance (size_t dist, size_t lensum, double score_cutoff = 0 )
10419
10455
{
10420
10456
double score =
10421
10457
(lensum > 0 ) ? (100.0 - 100.0 * static_cast <double >(dist) / static_cast <double >(lensum)) : 100.0 ;
0 commit comments