mirror of
				https://github.com/sqlmapproject/sqlmap.git
				synced 2025-11-04 09:57:38 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			84 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#!/usr/bin/env python
 | 
						|
# -*- mode:python; tab-width: 2; coding: utf-8 -*-
 | 
						|
 | 
						|
"""Partially backported python ABC classes"""
 | 
						|
 | 
						|
from __future__ import absolute_import
 | 
						|
 | 
						|
try:
 | 
						|
    from collections import MutableSet
 | 
						|
except ImportError:
 | 
						|
    # Running in Python <= 2.5
 | 
						|
    from ._abc import MutableSet
 | 
						|
 | 
						|
 | 
						|
KEY, PREV, NEXT = range(3)
 | 
						|
 | 
						|
 | 
						|
class OrderedSet(MutableSet):
 | 
						|
 | 
						|
    def __init__(self, iterable=None):
 | 
						|
        self.end = end = []
 | 
						|
        end += [None, end, end]         # sentinel node for doubly linked list
 | 
						|
        self.map = {}                   # key --> [key, prev, next]
 | 
						|
        if iterable is not None:
 | 
						|
            self |= iterable
 | 
						|
 | 
						|
    def __len__(self):
 | 
						|
        return len(self.map)
 | 
						|
 | 
						|
    def __contains__(self, key):
 | 
						|
        return key in self.map
 | 
						|
 | 
						|
    def __getitem__(self, key):
 | 
						|
        return list(self)[key]
 | 
						|
 | 
						|
    def add(self, key):
 | 
						|
        if key not in self.map:
 | 
						|
            end = self.end
 | 
						|
            curr = end[PREV]
 | 
						|
            curr[NEXT] = end[PREV] = self.map[key] = [key, curr, end]
 | 
						|
 | 
						|
    def discard(self, key):
 | 
						|
        if key in self.map:
 | 
						|
            key, prev, next = self.map.pop(key)
 | 
						|
            prev[NEXT] = next
 | 
						|
            next[PREV] = prev
 | 
						|
 | 
						|
    def __iter__(self):
 | 
						|
        end = self.end
 | 
						|
        curr = end[NEXT]
 | 
						|
        while curr is not end:
 | 
						|
            yield curr[KEY]
 | 
						|
            curr = curr[NEXT]
 | 
						|
 | 
						|
    def __reversed__(self):
 | 
						|
        end = self.end
 | 
						|
        curr = end[PREV]
 | 
						|
        while curr is not end:
 | 
						|
            yield curr[KEY]
 | 
						|
            curr = curr[PREV]
 | 
						|
 | 
						|
    def pop(self, last=True):
 | 
						|
        if not self:
 | 
						|
            raise KeyError('set is empty')
 | 
						|
        key = reversed(self).next() if last else iter(self).next()
 | 
						|
        self.discard(key)
 | 
						|
        return key
 | 
						|
 | 
						|
    def __repr__(self):
 | 
						|
        if not self:
 | 
						|
            return '%s()' % (self.__class__.__name__,)
 | 
						|
        return '%s(%r)' % (self.__class__.__name__, list(self))
 | 
						|
 | 
						|
    def __eq__(self, other):
 | 
						|
        if isinstance(other, OrderedSet):
 | 
						|
            return len(self) == len(other) and list(self) == list(other)
 | 
						|
        return set(self) == set(other)
 | 
						|
 | 
						|
    def __del__(self):
 | 
						|
        if all([KEY, PREV, NEXT]):
 | 
						|
            self.clear()                    # remove circular references
 | 
						|
 | 
						|
oset = OrderedSet
 |