GCC Code Coverage Report
Directory: . Exec Total Coverage
File: src/util/hash.h Lines: 7 7 100.0 %
Date: 2021-05-22 Branches: 2 4 50.0 %

Line Exec Source
1
/******************************************************************************
2
 * Top contributors (to current version):
3
 *   Morgan Deters, Andres Noetzli, Mathias Preiner
4
 *
5
 * This file is part of the cvc5 project.
6
 *
7
 * Copyright (c) 2009-2021 by the authors listed in the file AUTHORS
8
 * in the top-level source directory and their institutional affiliations.
9
 * All rights reserved.  See the file COPYING in the top-level source
10
 * directory for licensing information.
11
 * ****************************************************************************
12
 *
13
 * [[ Add one-line brief description here ]]
14
 *
15
 * [[ Add lengthier description here ]]
16
 * \todo document this file
17
 */
18
19
#include "cvc5_public.h"
20
21
#ifndef CVC5__HASH_H
22
#define CVC5__HASH_H
23
24
#include <functional>
25
#include <string>
26
27
namespace std {
28
29
#ifdef CVC5_NEED_HASH_UINT64_T
30
// on some versions and architectures of GNU C++, we need a
31
// specialization of hash for 64-bit values
32
template <>
33
struct hash<uint64_t> {
34
  size_t operator()(uint64_t v) const {
35
    return v;
36
  }
37
};/* struct hash<uint64_t> */
38
#endif /* CVC5_NEED_HASH_UINT64_T */
39
40
}/* std namespace */
41
42
namespace cvc5 {
43
44
namespace fnv1a {
45
46
/**
47
 * FNV-1a hash algorithm for 64-bit numbers.
48
 *
49
 * More details here: http://www.isthe.com/chongo/tech/comp/fnv/index.html
50
 */
51
620968790
inline uint64_t fnv1a_64(uint64_t v, uint64_t hash = 14695981039346656037U) {
52
620968790
  hash ^= v;
53
  // Compute (hash * 1099511628211)
54
1241937580
  return hash + (hash << 1) + (hash << 4) + (hash << 5) + (hash << 7) +
55
1241937580
         (hash << 8) + (hash << 40);
56
}
57
58
}  // namespace fnv1a
59
60
template <class T, class U, class HashT = std::hash<T>, class HashU = std::hash<U> >
61
struct PairHashFunction {
62
190238713
  size_t operator()(const std::pair<T, U>& pr) const {
63
190238713
    uint64_t hash = fnv1a::fnv1a_64(HashT()(pr.first));
64
190238713
    return static_cast<size_t>(fnv1a::fnv1a_64(HashU()(pr.second), hash));
65
  }
66
};/* struct PairHashFunction */
67
68
}  // namespace cvc5
69
70
#endif /* CVC5__HASH_H */