Logo ROOT  
Reference Guide
RConcurrentHashColl.cxx
Go to the documentation of this file.
2 #include <ROOT/RMakeUnique.hxx>
3 #include <ROOT/TRWSpinLock.hxx>
4 #include <ROOT/TSeq.hxx>
5 #include <ROOT/RSha256.hxx>
6 
7 #include <set>
8 
9 namespace ROOT {
10 namespace Internal {
11 
12 
13 std::ostream &operator<<(std::ostream &os, const RConcurrentHashColl::HashValue &h)
14 {
15  auto digest = h.Get();
16  os << digest[0] << "-" << digest[1] << "-" << digest[2] << "-" << digest[3];
17  return os;
18 }
19 
21 {
22  // The cast here is because in the TBuffer ecosystem, the type used is char*
23  Sha256(reinterpret_cast<const unsigned char *>(data), len, fDigest);
24 }
25 
26 struct RHashSet {
27  std::set<ROOT::Internal::RConcurrentHashColl::HashValue> fSet;
28 };
29 
31  : fHashSet(std::make_unique<RHashSet>()), fRWLock(std::make_unique<ROOT::TRWSpinLock>()){};
32 
34 
35 /// Return true if the hash is already in already there
36 bool RConcurrentHashColl::Find(const HashValue &hash) const
37 {
39  return (fHashSet->fSet.end() != fHashSet->fSet.find(hash));
40 }
41 
42 /// If the buffer is there, return false. Otherwise, insert the hash and return true
44 {
45  return HashValue(buffer, len);
46 }
47 
48 /// If the buffer is there, return false. Otherwise, insert the hash and return true
49 bool RConcurrentHashColl::Insert(char *buffer, int len) const
50 {
51  HashValue hash(buffer, len);
52 
53  {
55  if (fHashSet->fSet.end() != fHashSet->fSet.find(hash))
56  return false;
57  }
58  {
60  fHashSet->fSet.insert(hash);
61  return true;
62  }
63 }
64 
65 /// If the buffer is there, return false. Otherwise, insert the hash and return true
66 bool RConcurrentHashColl::Insert(const HashValue &hash) const
67 {
69  auto ret = fHashSet->fSet.insert(hash);
70  return ret.second;
71 }
72 
73 } // End NS Internal
74 } // End NS ROOT
RSha256.hxx
ROOT::Internal::RConcurrentHashColl::fRWLock
std::unique_ptr< ROOT::TRWSpinLock > fRWLock
Definition: RConcurrentHashColl.hxx:29
ROOT::Internal::Sha256
void Sha256(const unsigned char *data, int len, ULong64_t *fDigest)
Definition: RSha256.hxx:267
ROOT::Internal::RConcurrentHashColl::HashValue::fDigest
ULong64_t fDigest[4]
Definition: RConcurrentHashColl.hxx:35
ROOT::Internal::RConcurrentHashColl::fHashSet
std::unique_ptr< RHashSet > fHashSet
Definition: RConcurrentHashColl.hxx:28
ROOT::Internal::RConcurrentHashColl::Hash
static HashValue Hash(char *buf, int len)
Return the hash object corresponding to the buffer.
Definition: RConcurrentHashColl.cxx:43
ROOT::TRWSpinLockWriteGuard
Definition: TRWSpinLock.hxx:51
TRWSpinLock.hxx
ROOT::Internal::operator<<
std::ostream & operator<<(std::ostream &os, const RConcurrentHashColl::HashValue &h)
Definition: RConcurrentHashColl.cxx:13
RConcurrentHashColl.hxx
h
#define h(i)
Definition: RSha256.hxx:106
ROOT::TRWSpinLockReadGuard
Definition: TRWSpinLock.hxx:42
ROOT::Internal::RConcurrentHashColl::HashValue::HashValue
HashValue()=default
TSeq.hxx
ROOT::TRWSpinLock
Definition: TRWSpinLock.hxx:22
ROOT::Internal::RConcurrentHashColl::Find
bool Find(const HashValue &hash) const
Return true if the hash is already in already there.
Definition: RConcurrentHashColl.cxx:36
ROOT::Internal::RConcurrentHashColl::~RConcurrentHashColl
~RConcurrentHashColl()
ROOT::Internal::RConcurrentHashColl::Insert
bool Insert(char *buf, int len) const
If the hash is there, return false. Otherwise, insert the hash and return true;.
Definition: RConcurrentHashColl.cxx:49
ROOT::Internal::RConcurrentHashColl::RConcurrentHashColl
RConcurrentHashColl()
Definition: RConcurrentHashColl.cxx:30
RMakeUnique.hxx
ROOT
VSD Structures.
Definition: StringConv.hxx:21
ROOT::Internal::RConcurrentHashColl::HashValue
Definition: RConcurrentHashColl.hxx:32