LIEF: Library to Instrument Executable Formats Version 1.0.0
Loading...
Searching...
No Matches
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
28namespace frozen {
29
30template <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
47template <> 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
54template <class T=void> using anna = elsa<T>;
55} // namespace frozen
56
57#endif
Definition algorithm.h:30
elsa< T > anna
Definition elsa.h:54
constexpr std::size_t operator()(T const &value, std::size_t seed) const
Definition elsa.h:49
Definition elsa.h:30
constexpr std::size_t operator()(T const &value, std::size_t seed) const
Definition elsa.h:34