Logo ROOT   6.18/05
Reference Guide
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
17namespace ROOT {
18
19class TRWSpinLock;
20
21namespace Internal {
22
23struct RHashSet;
24
25/// This class is a TS set of unsigned set
27private:
28 mutable std::unique_ptr<RHashSet> fHashSet;
29 mutable std::unique_ptr<ROOT::TRWSpinLock> fRWLock;
30
31public:
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
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
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
69namespace std {
70template <>
71struct less<ROOT::Internal::RConcurrentHashColl::HashValue> {
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
ROOT::R::TRInterface & r
Definition: Object.C:4
#define h(i)
Definition: RSha256.hxx:106
unsigned long long ULong64_t
Definition: RtypesCore.h:70
TRObject operator()(const T1 &t1) const
friend std::ostream & operator<<(std::ostream &os, const RConcurrentHashColl::HashValue &h)
This class is a TS set of unsigned set.
bool Insert(char *buf, int len) const
If the hash is there, return false. Otherwise, insert the hash and return true;.
std::unique_ptr< RHashSet > fHashSet
static HashValue Hash(char *buf, int len)
Return the hash object corresponding to the buffer.
std::unique_ptr< ROOT::TRWSpinLock > fRWLock
bool Find(const HashValue &hash) const
Return true if the hash is already in already there.
bool operator==(const RConcurrentHashColl::HashValue &lhs, const RConcurrentHashColl::HashValue &rhs)
Namespace for new ROOT classes and functions.
Definition: StringConv.hxx:21
auto * l
Definition: textangle.C:4