Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
RConcurrentHashColl.hxx
Go to the documentation of this file.
1 // Author: Danilo Piparo May 2018
2 
3 /*************************************************************************
4  * Copyright (C) 1995-2018, Rene Brun and Fons Rademakers. *
5  * All rights reserved. *
6  * *
7  * For the licensing terms see $ROOTSYS/LICENSE. *
8  * For the list of contributors see $ROOTSYS/README/CREDITS. *
9  *************************************************************************/
10 
11 #ifndef ROOT_RConcurrentHashColl
12 #define ROOT_RConcurrentHashColl
13 
14 #include <memory>
15 #include "Rtypes.h"
16 
17 namespace ROOT {
18 
19 class TRWSpinLock;
20 
21 namespace Internal {
22 
23 struct RHashSet;
24 
25 /// This class is a TS set of unsigned set
26 class RConcurrentHashColl {
27 private:
28  mutable std::unique_ptr<RHashSet> fHashSet;
29  mutable std::unique_ptr<ROOT::TRWSpinLock> fRWLock;
30 
31 public:
32  class HashValue {
33  friend std::ostream &operator<<(std::ostream &os, const RConcurrentHashColl::HashValue &h);
34  private:
35  ULong64_t fDigest[4] = {0, 0, 0, 0};
36 
37  public:
38  HashValue() = default;
39  HashValue(const char *data, int len);
40  ULong64_t const *Get() const { return fDigest; }
41  };
42 
43  RConcurrentHashColl();
44  ~RConcurrentHashColl();
45 
46  /// Return true if the hash is already in already there
47  bool Find(const HashValue &hash) const;
48 
49  /// If the hash is there, return false. Otherwise, insert the hash and return true;
50  bool Insert(char *buf, int len) const;
51 
52  /// If the hash is there, return false. Otherwise, insert the hash and return true;
53  bool Insert(const HashValue &hash) const;
54 
55  /// Return the hash object corresponding to the buffer.
56  static HashValue Hash(char *buf, int len);
57 };
58 
59 inline bool operator==(const RConcurrentHashColl::HashValue &lhs, const RConcurrentHashColl::HashValue &rhs)
60 {
61  auto l = lhs.Get();
62  auto r = rhs.Get();
63  return l[0] == r[0] && l[1] == r[1] && l[2] == r[2] && l[3] == r[3];
64 }
65 
66 } // End NS Internal
67 } // End NS ROOT
68 
69 namespace std {
70 template <>
71 struct less<ROOT::Internal::RConcurrentHashColl::HashValue> {
72  bool operator()(const ROOT::Internal::RConcurrentHashColl::HashValue &lhs, const ROOT::Internal::RConcurrentHashColl::HashValue &rhs) const
73  {
74  /// Check piece by piece the 4 64 bits ints which make up the hash.
75  auto l = lhs.Get();
76  auto r = rhs.Get();
77  // clang-format off
78  return l[0] < r[0] ? true :
79  l[0] > r[0] ? false :
80  l[1] < r[1] ? true :
81  l[1] > r[1] ? false :
82  l[2] < r[2] ? true :
83  l[2] > r[2] ? false :
84  l[3] < r[3] ? true : false;
85  // clang-format on
86  }
87 };
88 } // End NS std
89 
90 #endif