summaryrefslogtreecommitdiff
path: root/obnamlib/fmt_ga/leaf_list.py
blob: a905f2b3de9eb8431604bf1daaa744a651612795 (plain)
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
# Copyright 2016-2017  Lars Wirzenius
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# =*= License: GPL-3+ =*=


class LeafList(object):

    def __init__(self):
        self._leaves = []

    def serialise(self):
        return self._leaves

    @classmethod
    def unserialise(cls, serialised):
        ll = LeafList()
        for leaf_info in serialised:
            ll.add(
                leaf_info['id'],
                leaf_info['first_key'],
                leaf_info['last_key']
            )
        return ll

    def __len__(self):
        return len(self._leaves)

    def leaves(self):
        return [leaf_info['id'] for leaf_info in self._leaves]

    def add(self, leaf_id, first_key, last_key):
        if any(self.find_leaf(k) for k in [first_key, last_key]):
            raise Exception(
                'Overlapping key range {}..{}'.format(first_key, last_key))

        self._leaves.append({
            'first_key': first_key,
            'last_key': last_key,
            'id': leaf_id,
        })
        self._leaves.sort(key=lambda x: (x['first_key'], x['last_key']))

    def find_leaf(self, key):
        for leaf_info in self._leaves:
            if leaf_info['first_key'] <= key <= leaf_info['last_key']:
                return leaf_info['id']
        return None