def apply(self, aliases):
        """Apply the merge to the routing table it is defined against and get a
        new routing table and alias dictionary.

        Returns
        -------
        [:py:class:`~rig.routing_table.RoutingTableEntry`, ...]
            A new routing table which may be minimised further.
        {(key, mask): {(key, mask), ...}}
            A new aliases dictionary.
        """
        # Create a new routing table of the correct size
        new_size = len(self.routing_table) - len(self.entries) + 1
        new_table = [None for _ in range(new_size)]

        # Create a copy of the aliases dictionary
        aliases = dict(aliases)

        # Get the new entry
        new_entry = RoutingTableEntry(
            route=self.routing_table[next(iter(self.entries))].route,
            key=self.key, mask=self.mask, sources=self.sources
        )
        aliases[(self.key, self.mask)] = our_aliases = set([])

        # Iterate through the old table copying entries acrosss
        insert = 0
        for i, entry in enumerate(self.routing_table):
            # If this is the insertion point then insert
            if i == self.insertion_index:
                new_table[insert] = new_entry
                insert += 1

            if i not in self.entries:
                # If this entry isn't to be removed then copy it across to the
                # new table.
                new_table[insert] = entry
                insert += 1
            else:
                # If this entry is to be removed then add it to the aliases
                # dictionary.
                km = (entry.key, entry.mask)
                our_aliases.update(aliases.pop(km, {km}))

        # If inserting beyond the end of the old table then insert at the end
        # of the new table.
        if self.insertion_index == len(self.routing_table):
            new_table[insert] = new_entry

        return new_table, aliases
def apply ( self , aliases ) : new_size = len ( self . routing_table ) - len ( self . entries ) + 1 new_table = [ None for _ in range ( new_size ) ] aliases = dict ( aliases ) new_entry = RoutingTableEntry ( route = self . routing_table [ next ( iter ( self . entries ) ) ] . route , key = self . key , mask = self . mask , sources = self . sources ) aliases [ ( self . key , self . mask ) ] = our_aliases = set ( [ ] ) insert = 0 for i , entry in enumerate ( self . routing_table ) : if i == self . insertion_index : new_table [ insert ] = new_entry insert += 1 if i not in self . entries : new_table [ insert ] = entry insert += 1 else : km = ( entry . key , entry . mask ) our_aliases . update ( aliases . pop ( km , { km } ) ) if self . insertion_index == len ( self . routing_table ) : new_table [ insert ] = new_entry return new_table , aliases
Apply the merge to the routing table it is defined against and get a
        new routing table and alias dictionary.

        Returns
        -------
        [:py:class:`~rig.routing_table.RoutingTableEntry`, ...]
            A new routing table which may be minimised further.
        {(key, mask): {(key, mask), ...}}
            A new aliases dictionary.