File: accessor.py

package info (click to toggle)
polybar 3.7.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 3,108 kB
  • sloc: cpp: 30,424; python: 3,750; sh: 284; makefile: 83
file content (126 lines) | stat: -rw-r--r-- 3,637 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
from resource_classes import _resource_classes

_templates = {}

_templates['iter_fixed'] = \
"""\
xpp::generic::iterator<Connection,
                       %s,
                       SIGNATURE(%s_%s),
                       SIGNATURE(%s_%s_length)>\
"""

_templates['iter_variable'] = \
"""\
xpp::generic::iterator<Connection,
                       %s,
                       SIGNATURE(%s_next),
                       SIGNATURE(%s_sizeof),
                       SIGNATURE(%s_%s_iterator)>\
"""

_templates['list'] = \
"""\
    xpp::generic::list<Connection,
                       %s_reply_t,
                       %s
                      >
    %s(void)
    {
      return xpp::generic::list<Connection,
                                %s_reply_t,
                                %s
                               >(%s);
    }\
"""

_templates['string_accessor'] = \
'''\
    std::string
    %s(void)
    {
      return std::string(%s_%s(this->get().get()),
                         %s_%s_length(this->get().get()));
    }
'''

def _string_accessor(member, c_name):
    return _templates['string_accessor'] % \
            (member, c_name, member, c_name, member)

class Accessor(object):
    def __init__(self, is_fixed=False, is_string=False, is_variable=False, \
                 member="", c_type="", return_type="", iter_name="", c_name=""):

        self.is_fixed = is_fixed
        self.is_string = is_string
        self.is_variable = is_variable

        self.member = member
        self.c_type = c_type
        self.return_type = return_type
        self.iter_name = iter_name
        self.c_name = c_name

        self.object_type = self.c_type.replace("xcb_", "").replace("_t", "").upper()

        if self.c_type == "void":
            self.return_type = "Type"
        elif self.object_type in _resource_classes:
            self.return_type = self.member.capitalize()
        else:
            self.return_type = self.c_type

    def __str__(self):
        if self.is_fixed:
            return self.list(self.iter_fixed())
        elif self.is_variable:
            return self.list(self.iter_variable())
        elif self.is_string:
            return self.string()
        else:
            return ""


    def iter_fixed(self):
        return_type = self.return_type

        return _templates['iter_fixed'] \
                % (return_type,
                   self.c_name, self.member,
                   self.c_name, self.member)


    def iter_variable(self):
        return _templates['iter_variable'] \
                % (self.c_type,
                   self.iter_name,
                   self.iter_name,
                   self.c_name, self.member)


    def list(self, iterator):
        template = "    template<typename Type" if self.c_type == "void" else ""

        # template<typename Children = xcb_window_t>
        if self.object_type in _resource_classes:
            template += ", " if template != "" else "    template<typename "
            template += self.member.capitalize() + " = " + self.c_type

        template += ">\n" if template != "" else ""

        c_tor_params = "this->m_c, this->get()"

        fst_iterator = "\n                       ".join(iterator.split('\n'))
        snd_iterator = "\n                                ".join(iterator.split('\n'))

        return template + _templates['list'] \
                % (self.c_name,
                   fst_iterator,
                   self.member,
                   self.c_name,
                   snd_iterator,
                   c_tor_params)

    def string(self):
        return _string_accessor(self.member, self.c_name)