Line data Source code
1 : // DUNE DAQ modification notice:
2 : // This file has been modified from the original ATLAS oks source for the DUNE DAQ project.
3 : // Fork baseline commit: oks-08-03-04 (2022-04-14).
4 : // Renamed since fork: yes (from oks/index.h to include/oks/index.hpp).
5 :
6 : #ifndef __OKS_INDEX
7 : #define __OKS_INDEX
8 :
9 : #include "oks/query.hpp"
10 : #include "oks/attribute.hpp"
11 : #include "oks/object.hpp"
12 :
13 : #include <set>
14 :
15 : namespace dunedaq {
16 : namespace oks {
17 : class OksObjectSortBy {
18 :
19 : public:
20 :
21 0 : OksObjectSortBy (size_t i = 0) : offset(i) {;}
22 :
23 0 : bool operator() (const OksObject * o1, const OksObject * o2) const {
24 0 : return o1->data[offset] < o2->data[offset];
25 : }
26 :
27 :
28 : private:
29 :
30 : size_t offset;
31 :
32 : };
33 :
34 :
35 : class OksIndex : public std::multiset<OksObject *, OksObjectSortBy> {
36 : friend class OksClass;
37 : friend class OksObject;
38 :
39 :
40 : public:
41 :
42 : // Declare map of poiters to OksIndex sorted by attribute name
43 :
44 : struct SortByName {
45 0 : bool operator() (const OksAttribute * a1, const OksAttribute * a2) const {
46 0 : return a1->get_name() < a2->get_name();
47 : }
48 : };
49 :
50 : typedef std::map<const OksAttribute *, OksIndex *, SortByName> Map;
51 :
52 : typedef std::multiset<OksObject *, OksObjectSortBy>::iterator Position;
53 : typedef std::multiset<OksObject *, OksObjectSortBy>::const_iterator ConstPosition;
54 :
55 :
56 : OksIndex (OksClass *, OksAttribute *);
57 : ~OksIndex ();
58 :
59 : OksObject * FindFirst(OksData *d) const;
60 :
61 : OksObject::List * FindEqual(OksData *d) const {return find_all(d, OksQuery::equal_cmp);}
62 : OksObject::List * FindLessEqual(OksData *d) const {return find_all(d, OksQuery::less_or_equal_cmp);}
63 : OksObject::List * FindGreatEqual(OksData *d) const {return find_all(d, OksQuery::greater_or_equal_cmp);}
64 : OksObject::List * FindLess(OksData *d) const {return find_all(d, OksQuery::less_cmp);}
65 : OksObject::List * FindGreat(OksData *d) const {return find_all(d, OksQuery::greater_cmp);}
66 :
67 : OksObject::List * FindLessAndGreat(OksData *d1, OksData *d2) const {return find_all(true, d1, OksQuery::less_cmp, d2, OksQuery::greater_cmp);}
68 : OksObject::List * FindLessAndGreatEqual(OksData *d1, OksData *d2) const {return find_all(true, d1, OksQuery::less_cmp, d2, OksQuery::greater_or_equal_cmp);}
69 : OksObject::List * FindLessEqualAndGreat(OksData *d1, OksData *d2) const {return find_all(true, d1, OksQuery::less_or_equal_cmp, d2, OksQuery::greater_cmp);}
70 : OksObject::List * FindLessEqualAndGreatEqual(OksData *d1, OksData *d2) const {return find_all(true, d1, OksQuery::less_or_equal_cmp, d2, OksQuery::greater_or_equal_cmp);}
71 : OksObject::List * FindEqualAndEqual(OksData *d1, OksData *d2) const {return find_all(true, d1, OksQuery::equal_cmp, d2, OksQuery::equal_cmp);}
72 : OksObject::List * FindEqualAndLess(OksData *d1, OksData *d2) const {return find_all(true, d1, OksQuery::equal_cmp, d2, OksQuery::less_cmp);}
73 : OksObject::List * FindEqualAndLessEqual(OksData *d1, OksData *d2) const {return find_all(true, d1, OksQuery::equal_cmp, d2, OksQuery::less_or_equal_cmp);}
74 : OksObject::List * FindEqualAndGreat(OksData *d1, OksData *d2) const {return find_all(true, d1, OksQuery::equal_cmp, d2, OksQuery::greater_cmp);}
75 : OksObject::List * FindEqualAndGreatEqual(OksData *d1, OksData *d2) const {return find_all(true, d1, OksQuery::equal_cmp, d2, OksQuery::greater_or_equal_cmp);}
76 : OksObject::List * FindLessOrGreat(OksData *d1, OksData *d2) const {return find_all(false, d1, OksQuery::less_cmp, d2, OksQuery::greater_cmp);}
77 : OksObject::List * FindLessOrGreatEqual(OksData *d1, OksData *d2) const {return find_all(false, d1, OksQuery::less_cmp, d2, OksQuery::greater_or_equal_cmp);}
78 : OksObject::List * FindLessEqualOrGreat(OksData *d1, OksData *d2) const {return find_all(false, d1, OksQuery::less_or_equal_cmp, d2, OksQuery::greater_cmp);}
79 : OksObject::List * FindLessEqualOrGreatEqual(OksData *d1, OksData *d2) const {return find_all(false, d1, OksQuery::less_or_equal_cmp, d2, OksQuery::greater_or_equal_cmp);}
80 : OksObject::List * FindEqualOrEqual(OksData *d1, OksData *d2) const {return find_all(false, d1, OksQuery::equal_cmp, d2, OksQuery::equal_cmp);}
81 : OksObject::List * FindEqualOrLess(OksData *d1, OksData *d2) const {return find_all(false, d1, OksQuery::equal_cmp, d2, OksQuery::less_cmp);}
82 : OksObject::List * FindEqualOrLessEqual(OksData *d1, OksData *d2) const {return find_all(false, d1, OksQuery::equal_cmp, d2, OksQuery::less_or_equal_cmp);}
83 : OksObject::List * FindEqualOrGreat(OksData *d1, OksData *d2) const {return find_all(false, d1, OksQuery::equal_cmp, d2, OksQuery::greater_cmp);}
84 : OksObject::List * FindEqualOrGreatEqual(OksData *d1, OksData *d2) const {return find_all(false, d1, OksQuery::equal_cmp, d2, OksQuery::greater_or_equal_cmp);}
85 :
86 : private:
87 :
88 : OksClass * c;
89 : OksAttribute * a;
90 : size_t offset;
91 :
92 : OksObject * remove_obj(OksObject *);
93 :
94 : OksObject::List * find_all(OksData *, OksQuery::Comparator) const;
95 : OksObject::List * find_all(bool, OksData *, OksQuery::Comparator, OksData *, OksQuery::Comparator) const;
96 :
97 : void find_interval(OksData *, OksQuery::Comparator, ConstPosition&, ConstPosition&) const;
98 :
99 : static size_t get_offset(OksClass *, OksAttribute *);
100 :
101 : };
102 : } // namespace oks
103 : } // namespace dunedaq
104 : #endif
|