This commit is contained in:
Timur A. Fatkhullin
2024-10-08 01:50:40 +03:00
parent 7e3aed284c
commit 6bd447c458
4 changed files with 478 additions and 113 deletions

View File

@@ -59,6 +59,11 @@ concept adc_range_of_input_char_range =
std::ranges::range<R> && traits::adc_input_char_range<std::ranges::range_value_t<R>>;
template <typename R>
concept adc_range_of_output_char_range =
std::ranges::range<R> && traits::adc_output_char_range<std::ranges::range_value_t<R>>;
template <typename R>
concept adc_range_of_view_or_output_char_range = adc_range_of_view_char_range<R> || adc_output_char_range<R>;

View File

@@ -453,15 +453,17 @@ template <const char* DELIMITER = constants::DEFAULT_CONVERTER_DELIMITER>
class AdcDefaultValueConverter
{
public:
static constexpr std::span compositeValueDelimiter{DELIMITER, AdcCharArrSize(DELIMITER)};
template <typename SerializedT, typename ValueT>
static SerializedT serialize(const ValueT& value)
{
SerializedT res;
if constexpr (traits::adc_is_tuple_v<ValueT>) {
AdcCharRangeFromTuple(res, value, DELIMITER);
} else if constexpr (std::ranges::range<ValueT>) {
AdcCharRangeFromValueRange(res, value, DELIMITER);
AdcCharRangeFromTuple(res, value, compositeValueDelimiter);
} else if constexpr (std::ranges::range<ValueT> && !traits::adc_input_char_range<ValueT>) {
AdcCharRangeFromValueRange(res, value, compositeValueDelimiter);
} else {
res = AdcTrivialSerializer<SerializedT>(value);
}
@@ -480,9 +482,9 @@ public:
ValueT res;
if constexpr (traits::adc_is_tuple_v<ValueT>) {
AdcTupleFromCharRange(res, svalue, DELIMITER);
} else if constexpr (traits::adc_output_char_range<ValueT>) {
AdcValueRangeFromCharRange(res, svalue, DELIMITER);
AdcTupleFromCharRange(res, svalue, compositeValueDelimiter);
} else if constexpr (std::ranges::range<ValueT> && !traits::adc_output_char_range<ValueT>) {
AdcValueRangeFromCharRange(res, svalue, compositeValueDelimiter);
} else {
res = AdcTrivialDeserializer<ValueT>(svalue);
}
@@ -623,4 +625,29 @@ static auto AdcSplitCharRange(R&& r, DR&& delim, size_t start = 0, size_t num =
return res;
}
// FVN-1a hash function
template <traits::adc_input_char_range R>
static constexpr size_t AdcFNV1aHash(const R& r)
{
static_assert(sizeof(size_t) == 8 || sizeof(size_t) == 4, "ONLY FOR 32 or 64-bit size_t!!!");
size_t hash = 0, prime = 0;
if constexpr (sizeof(size_t) == 8) { // 64-bit
prime = 1099511628211UL;
hash = 14695981039346656037UL;
} else if constexpr (sizeof(size_t) == 4) { // 32-bit
prime = 16777619;
hash = 2166136261;
}
std::ranges::for_each(r, [&hash, &prime](const char& ch) {
hash ^= ch;
hash *= prime;
});
return hash;
}
} // namespace adc::utils