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/attribute.hpp"
10 : #include "oks/object.hpp"
11 : #include "oks/query.hpp"
12 :
13 : #include <set>
14 :
15 : namespace dunedaq {
16 : namespace oks {
17 : class OksObjectSortBy
18 : {
19 :
20 : public:
21 0 : OksObjectSortBy(size_t i = 0)
22 0 : : offset(i)
23 : {
24 0 : ;
25 0 : }
26 :
27 0 : bool operator()(const OksObject* o1, const OksObject* o2) const { return o1->data[offset] < o2->data[offset]; }
28 :
29 : private:
30 : size_t offset;
31 : };
32 :
33 : class OksIndex : public std::multiset<OksObject*, OksObjectSortBy>
34 : {
35 : friend class OksClass;
36 : friend class OksObject;
37 :
38 : public:
39 : // Declare map of poiters to OksIndex sorted by attribute name
40 :
41 : struct SortByName
42 : {
43 0 : bool operator()(const OksAttribute* a1, const OksAttribute* a2) const { return a1->get_name() < a2->get_name(); }
44 : };
45 :
46 : typedef std::map<const OksAttribute*, OksIndex*, SortByName> Map;
47 :
48 : typedef std::multiset<OksObject*, OksObjectSortBy>::iterator Position;
49 : typedef std::multiset<OksObject*, OksObjectSortBy>::const_iterator ConstPosition;
50 :
51 : OksIndex(OksClass*, OksAttribute*);
52 : ~OksIndex();
53 :
54 : OksObject* FindFirst(OksData* d) const;
55 :
56 : OksObject::List* FindEqual(OksData* d) const { return find_all(d, OksQuery::equal_cmp); }
57 : OksObject::List* FindLessEqual(OksData* d) const { return find_all(d, OksQuery::less_or_equal_cmp); }
58 : OksObject::List* FindGreatEqual(OksData* d) const { return find_all(d, OksQuery::greater_or_equal_cmp); }
59 : OksObject::List* FindLess(OksData* d) const { return find_all(d, OksQuery::less_cmp); }
60 : OksObject::List* FindGreat(OksData* d) const { return find_all(d, OksQuery::greater_cmp); }
61 :
62 : OksObject::List* FindLessAndGreat(OksData* d1, OksData* d2) const
63 : {
64 : return find_all(true, d1, OksQuery::less_cmp, d2, OksQuery::greater_cmp);
65 : }
66 : OksObject::List* FindLessAndGreatEqual(OksData* d1, OksData* d2) const
67 : {
68 : return find_all(true, d1, OksQuery::less_cmp, d2, OksQuery::greater_or_equal_cmp);
69 : }
70 : OksObject::List* FindLessEqualAndGreat(OksData* d1, OksData* d2) const
71 : {
72 : return find_all(true, d1, OksQuery::less_or_equal_cmp, d2, OksQuery::greater_cmp);
73 : }
74 : OksObject::List* FindLessEqualAndGreatEqual(OksData* d1, OksData* d2) const
75 : {
76 : return find_all(true, d1, OksQuery::less_or_equal_cmp, d2, OksQuery::greater_or_equal_cmp);
77 : }
78 : OksObject::List* FindEqualAndEqual(OksData* d1, OksData* d2) const
79 : {
80 : return find_all(true, d1, OksQuery::equal_cmp, d2, OksQuery::equal_cmp);
81 : }
82 : OksObject::List* FindEqualAndLess(OksData* d1, OksData* d2) const
83 : {
84 : return find_all(true, d1, OksQuery::equal_cmp, d2, OksQuery::less_cmp);
85 : }
86 : OksObject::List* FindEqualAndLessEqual(OksData* d1, OksData* d2) const
87 : {
88 : return find_all(true, d1, OksQuery::equal_cmp, d2, OksQuery::less_or_equal_cmp);
89 : }
90 : OksObject::List* FindEqualAndGreat(OksData* d1, OksData* d2) const
91 : {
92 : return find_all(true, d1, OksQuery::equal_cmp, d2, OksQuery::greater_cmp);
93 : }
94 : OksObject::List* FindEqualAndGreatEqual(OksData* d1, OksData* d2) const
95 : {
96 : return find_all(true, d1, OksQuery::equal_cmp, d2, OksQuery::greater_or_equal_cmp);
97 : }
98 : OksObject::List* FindLessOrGreat(OksData* d1, OksData* d2) const
99 : {
100 : return find_all(false, d1, OksQuery::less_cmp, d2, OksQuery::greater_cmp);
101 : }
102 : OksObject::List* FindLessOrGreatEqual(OksData* d1, OksData* d2) const
103 : {
104 : return find_all(false, d1, OksQuery::less_cmp, d2, OksQuery::greater_or_equal_cmp);
105 : }
106 : OksObject::List* FindLessEqualOrGreat(OksData* d1, OksData* d2) const
107 : {
108 : return find_all(false, d1, OksQuery::less_or_equal_cmp, d2, OksQuery::greater_cmp);
109 : }
110 : OksObject::List* FindLessEqualOrGreatEqual(OksData* d1, OksData* d2) const
111 : {
112 : return find_all(false, d1, OksQuery::less_or_equal_cmp, d2, OksQuery::greater_or_equal_cmp);
113 : }
114 : OksObject::List* FindEqualOrEqual(OksData* d1, OksData* d2) const
115 : {
116 : return find_all(false, d1, OksQuery::equal_cmp, d2, OksQuery::equal_cmp);
117 : }
118 : OksObject::List* FindEqualOrLess(OksData* d1, OksData* d2) const
119 : {
120 : return find_all(false, d1, OksQuery::equal_cmp, d2, OksQuery::less_cmp);
121 : }
122 : OksObject::List* FindEqualOrLessEqual(OksData* d1, OksData* d2) const
123 : {
124 : return find_all(false, d1, OksQuery::equal_cmp, d2, OksQuery::less_or_equal_cmp);
125 : }
126 : OksObject::List* FindEqualOrGreat(OksData* d1, OksData* d2) const
127 : {
128 : return find_all(false, d1, OksQuery::equal_cmp, d2, OksQuery::greater_cmp);
129 : }
130 : OksObject::List* FindEqualOrGreatEqual(OksData* d1, OksData* d2) const
131 : {
132 : return find_all(false, d1, OksQuery::equal_cmp, d2, OksQuery::greater_or_equal_cmp);
133 : }
134 :
135 : private:
136 : OksClass* c;
137 : OksAttribute* a;
138 : size_t offset;
139 :
140 : OksObject* remove_obj(OksObject*);
141 :
142 : OksObject::List* find_all(OksData*, OksQuery::Comparator) const;
143 : OksObject::List* find_all(bool, OksData*, OksQuery::Comparator, OksData*, OksQuery::Comparator) const;
144 :
145 : void find_interval(OksData*, OksQuery::Comparator, ConstPosition&, ConstPosition&) const;
146 :
147 : static size_t get_offset(OksClass*, OksAttribute*);
148 : };
149 : } // namespace oks
150 : } // namespace dunedaq
151 : #endif
|