Line data Source code
1 : /**
2 : * @file
3 : *
4 : * @brief
5 : *
6 : * @copyright BSD License (see LICENSE.md or https://www.libelektra.org)
7 : */
8 :
9 : #ifndef ELEKTRA_KEYSETGET_HPP
10 : #define ELEKTRA_KEYSETGET_HPP
11 :
12 : #include <map>
13 :
14 : #include <keyset.hpp>
15 :
16 : namespace kdb
17 : {
18 :
19 : template <typename T>
20 : struct KeySetTypeWrapper<std::map<std::string, T>>
21 : {
22 10744 : std::map<std::string, T> operator() (KeySet const & ks, std::string const & name, option_t const options) const
23 : {
24 10744 : std::map<std::string, T> ret;
25 64456 : for (int i = 0; i < 5; ++i)
26 : {
27 53718 : std::string n;
28 53712 : if (name[0] != '/')
29 : {
30 : n = name;
31 : i = 10; // break next time
32 : }
33 : else
34 53710 : switch (i)
35 : {
36 : case 0:
37 21484 : n = "proc" + name;
38 10742 : break;
39 : case 1:
40 21484 : n = "dir" + name;
41 10742 : break;
42 : case 2:
43 21484 : n = "user" + name;
44 10742 : break;
45 : case 3:
46 21484 : n = "system" + name;
47 10742 : break;
48 : }
49 53718 : Key b = ks.lookup (n, options);
50 107418 : if (!b) continue;
51 6 : Key k;
52 112 : while ((k = ks.next ()))
53 : {
54 24 : if (!k.isBelow (b)) break; // other keys are not relevant anymore
55 22 : if (k.isDirectBelow (b))
56 : {
57 132 : ret.insert (std::make_pair<std::string, T> (k.getBaseName (), k.get<T> ()));
58 : }
59 : }
60 : }
61 10744 : return ret;
62 : }
63 : };
64 :
65 : } // end of namespace kdb
66 :
67 : #endif
|