Line data Source code
1 : #ifndef __OKS_INDEX
2 : #define __OKS_INDEX
3 :
4 : #include "oks/query.hpp"
5 : #include "oks/attribute.hpp"
6 : #include "oks/object.hpp"
7 :
8 : #include <set>
9 :
10 : namespace dunedaq {
11 : namespace oks {
12 : class OksObjectSortBy {
13 :
14 : public:
15 :
16 0 : OksObjectSortBy (size_t i = 0) : offset(i) {;}
17 :
18 0 : bool operator() (const OksObject * o1, const OksObject * o2) const {
19 0 : return o1->data[offset] < o2->data[offset];
20 : }
21 :
22 :
23 : private:
24 :
25 : size_t offset;
26 :
27 : };
28 :
29 :
30 : class OksIndex : public std::multiset<OksObject *, OksObjectSortBy> {
31 : friend class OksClass;
32 : friend class OksObject;
33 :
34 :
35 : public:
36 :
37 : // Declare map of poiters to OksIndex sorted by attribute name
38 :
39 : struct SortByName {
40 0 : bool operator() (const OksAttribute * a1, const OksAttribute * a2) const {
41 0 : return a1->get_name() < a2->get_name();
42 : }
43 : };
44 :
45 : typedef std::map<const OksAttribute *, OksIndex *, SortByName> Map;
46 :
47 : typedef std::multiset<OksObject *, OksObjectSortBy>::iterator Position;
48 : typedef std::multiset<OksObject *, OksObjectSortBy>::const_iterator ConstPosition;
49 :
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 {return find_all(true, d1, OksQuery::less_cmp, d2, OksQuery::greater_cmp);}
63 : OksObject::List * FindLessAndGreatEqual(OksData *d1, OksData *d2) const {return find_all(true, d1, OksQuery::less_cmp, d2, OksQuery::greater_or_equal_cmp);}
64 : OksObject::List * FindLessEqualAndGreat(OksData *d1, OksData *d2) const {return find_all(true, d1, OksQuery::less_or_equal_cmp, d2, OksQuery::greater_cmp);}
65 : OksObject::List * FindLessEqualAndGreatEqual(OksData *d1, OksData *d2) const {return find_all(true, d1, OksQuery::less_or_equal_cmp, d2, OksQuery::greater_or_equal_cmp);}
66 : OksObject::List * FindEqualAndEqual(OksData *d1, OksData *d2) const {return find_all(true, d1, OksQuery::equal_cmp, d2, OksQuery::equal_cmp);}
67 : OksObject::List * FindEqualAndLess(OksData *d1, OksData *d2) const {return find_all(true, d1, OksQuery::equal_cmp, d2, OksQuery::less_cmp);}
68 : OksObject::List * FindEqualAndLessEqual(OksData *d1, OksData *d2) const {return find_all(true, d1, OksQuery::equal_cmp, d2, OksQuery::less_or_equal_cmp);}
69 : OksObject::List * FindEqualAndGreat(OksData *d1, OksData *d2) const {return find_all(true, d1, OksQuery::equal_cmp, d2, OksQuery::greater_cmp);}
70 : OksObject::List * FindEqualAndGreatEqual(OksData *d1, OksData *d2) const {return find_all(true, d1, OksQuery::equal_cmp, d2, OksQuery::greater_or_equal_cmp);}
71 : OksObject::List * FindLessOrGreat(OksData *d1, OksData *d2) const {return find_all(false, d1, OksQuery::less_cmp, d2, OksQuery::greater_cmp);}
72 : OksObject::List * FindLessOrGreatEqual(OksData *d1, OksData *d2) const {return find_all(false, d1, OksQuery::less_cmp, d2, OksQuery::greater_or_equal_cmp);}
73 : OksObject::List * FindLessEqualOrGreat(OksData *d1, OksData *d2) const {return find_all(false, d1, OksQuery::less_or_equal_cmp, d2, OksQuery::greater_cmp);}
74 : OksObject::List * FindLessEqualOrGreatEqual(OksData *d1, OksData *d2) const {return find_all(false, d1, OksQuery::less_or_equal_cmp, d2, OksQuery::greater_or_equal_cmp);}
75 : OksObject::List * FindEqualOrEqual(OksData *d1, OksData *d2) const {return find_all(false, d1, OksQuery::equal_cmp, d2, OksQuery::equal_cmp);}
76 : OksObject::List * FindEqualOrLess(OksData *d1, OksData *d2) const {return find_all(false, d1, OksQuery::equal_cmp, d2, OksQuery::less_cmp);}
77 : OksObject::List * FindEqualOrLessEqual(OksData *d1, OksData *d2) const {return find_all(false, d1, OksQuery::equal_cmp, d2, OksQuery::less_or_equal_cmp);}
78 : OksObject::List * FindEqualOrGreat(OksData *d1, OksData *d2) const {return find_all(false, d1, OksQuery::equal_cmp, d2, OksQuery::greater_cmp);}
79 : OksObject::List * FindEqualOrGreatEqual(OksData *d1, OksData *d2) const {return find_all(false, d1, OksQuery::equal_cmp, d2, OksQuery::greater_or_equal_cmp);}
80 :
81 : private:
82 :
83 : OksClass * c;
84 : OksAttribute * a;
85 : size_t offset;
86 :
87 : OksObject * remove_obj(OksObject *);
88 :
89 : OksObject::List * find_all(OksData *, OksQuery::Comparator) const;
90 : OksObject::List * find_all(bool, OksData *, OksQuery::Comparator, OksData *, OksQuery::Comparator) const;
91 :
92 : void find_interval(OksData *, OksQuery::Comparator, ConstPosition&, ConstPosition&) const;
93 :
94 : static size_t get_offset(OksClass *, OksAttribute *);
95 :
96 : };
97 : } // namespace oks
98 : } // namespace dunedaq
99 : #endif
|