Jpp 20.0.0-27-g39925593c-D
the software that should make you happy
Loading...
Searching...
No Matches
JHashCollection.cc
Go to the documentation of this file.
1
2#include <iostream>
3#include <iomanip>
4#include <cmath>
5#include <set>
6
8
9#include "Jeep/JPrint.hh"
10#include "Jeep/JParser.hh"
11#include "Jeep/JMessage.hh"
12
13
14namespace {
15
16 /**
17 * Example class to get value for hash key.
18 */
19 struct get_value {
20 /**
21 * Constructor.
22 *
23 * \param precision precision
24 */
25 get_value(const double precision)
26 {
27 this->precision = precision;
28 }
29
30
31 /*
32 * Function.
33 *
34 * \param key key
35 * \return hash value
36 */
37 inline int operator()(const double key) const
38 {
39 return (int) ((key + 0.5*precision) / precision);
40 }
41
42
43 double precision;
44 };
45}
46
47
48/**
49 * \file
50 *
51 * Example program to test JTOOLS::JHashCollection class.
52 * \author mdejong
53 */
54int main(int argc, char **argv)
55{
56 using namespace std;
57 using namespace JPP;
58
59 double precision;
60 int debug;
61
62 try {
63
64 JParser<> zap("Example program to test hash collection.");
65
66 zap['e'] = make_field(precision) = 1.0e-3;
67 zap['d'] = make_field(debug) = 3;
68
69 zap(argc, argv);
70 }
71 catch(const exception &error) {
72 FATAL(error.what() << endl);
73 }
74
75
77
78 hash_collection buffer(precision);
79
80
81 set<double> input = { 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0 };
82 set<double> rm = { 1.5, 1.1 };
83
84 for (set<double>::const_reverse_iterator x = input.rbegin(); x != input.rend(); ++x) {
85 buffer.insert(*x);
86 buffer.insert(*x);
87 }
88
89 for (hash_collection::const_iterator i = buffer.begin(); i != buffer.end(); ++i) {
90 DEBUG(FIXED(5,2) << *i << endl);
91 }
92
93 ASSERT(buffer.size() == input.size(), "Test of buffer size with multiple inserts of same element.");
94
95
96 for (set<double>::const_iterator x = input.begin(); x != input.end(); ++x) {
97
98 DEBUG(FIXED(5,2) << *x << ' ' << buffer.getIndex(*x) << endl);
99
100 ASSERT(buffer.has(*x), "Test of buffer content.");
101 }
102
103 {
104 hash_collection out(precision);
105
106 out = buffer;
107
108 for (set<double>::const_iterator x = input.begin(); x != input.end(); ++x) {
109
110 DEBUG(FIXED(5,2) << *x << ' ' << out.getIndex(*x) << endl);
111
112 ASSERT(out.has(*x), "Test of buffer content after assignment.");
113 }
114 }
115
116 for (set<double>::const_iterator x = rm.begin(); x != rm.end(); ++x) {
117
118 hash_collection::iterator p = buffer.find(*x);
119
120 DEBUG("find " << FIXED(5,2) << *x << " at position " << distance(buffer.begin(),p) << ' ' << buffer.getIndex(*x) << endl);
121
122 buffer.erase(p);
123 }
124
125 for (set<double>::const_iterator x = input.begin(); x != input.end(); ++x) {
126
127 ASSERT(buffer.has(*x) == (rm.count(*x) == 0), "Test of buffer content after erase.");
128 }
129
130 return 0;
131}
int main(int argc, char **argv)
General purpose class for a hash collection of unique elements.
General purpose messaging.
#define DEBUG(A)
Message macros.
Definition JMessage.hh:62
#define ASSERT(A,...)
Assert macro.
Definition JMessage.hh:90
#define FATAL(A)
Definition JMessage.hh:67
int debug
debug level
Definition JSirene.cc:72
Utility class to parse command line options.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition JParser.hh:2142
I/O formatting auxiliaries.
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
Template definition of a multi-dimensional oscillation probability interpolation table.
Utility class to parse command line options.
Definition JParser.hh:1698
void insert(const JMultiFunction< __JFunction_t, __JMaplist_t, __JDistance_t > &input)
Insert multidimensional input.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Auxiliary data structure for floating point format specification.
Definition JManip.hh:448