...
This commit is contained in:
@@ -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>;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user