LIEF: Library to Instrument Executable Formats
Version 1.0.0
Toggle main menu visibility
Loading...
Searching...
No Matches
lief-install
x86_64
static
include
frozen
bits
elsa.h
Go to the documentation of this file.
1
/*
2
* Frozen
3
* Copyright 2016 QuarksLab
4
*
5
* Licensed to the Apache Software Foundation (ASF) under one
6
* or more contributor license agreements. See the NOTICE file
7
* distributed with this work for additional information
8
* regarding copyright ownership. The ASF licenses this file
9
* to you under the Apache License, Version 2.0 (the
10
* "License"); you may not use this file except in compliance
11
* with the License. You may obtain a copy of the License at
12
*
13
* http://www.apache.org/licenses/LICENSE-2.0
14
*
15
* Unless required by applicable law or agreed to in writing,
16
* software distributed under the License is distributed on an
17
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
18
* KIND, either express or implied. See the License for the
19
* specific language governing permissions and limitations
20
* under the License.
21
*/
22
23
#ifndef FROZEN_LETITGO_ELSA_H
24
#define FROZEN_LETITGO_ELSA_H
25
26
#include <type_traits>
27
28
namespace
frozen
{
29
30
template
<
class
T =
void
>
struct
elsa
{
31
static_assert
(std::is_integral<T>::value || std::is_enum<T>::value,
32
"only supports integral types, specialize for other types"
);
33
34
constexpr
std::size_t
operator()
(T
const
&value, std::size_t seed)
const
{
35
std::size_t key = seed ^
static_cast<
std::size_t
>
(value);
36
key = (~key) + (key << 21);
// key = (key << 21) - key - 1;
37
key = key ^ (key >> 24);
38
key = (key + (key << 3)) + (key << 8);
// key * 265
39
key = key ^ (key >> 14);
40
key = (key + (key << 2)) + (key << 4);
// key * 21
41
key = key ^ (key >> 28);
42
key = key + (key << 31);
43
return
key;
44
}
45
};
46
47
template
<>
struct
elsa
<void> {
48
template
<
class
T>
49
constexpr
std::size_t
operator()
(T
const
&value, std::size_t seed)
const
{
50
return
elsa<T>
{}(value, seed);
51
}
52
};
53
54
template
<
class
T=
void
>
using
anna
=
elsa<T>
;
55
}
// namespace frozen
56
57
#endif
frozen
Definition
algorithm.h:30
frozen::anna
elsa< T > anna
Definition
elsa.h:54
frozen::elsa< void >::operator()
constexpr std::size_t operator()(T const &value, std::size_t seed) const
Definition
elsa.h:49
frozen::elsa
Definition
elsa.h:30
frozen::elsa::operator()
constexpr std::size_t operator()(T const &value, std::size_t seed) const
Definition
elsa.h:34
Generated by
1.17.0