mirror of
https://github.com/sqlmapproject/sqlmap.git
synced 2025-12-09 22:21:30 +00:00
Work for Issue #66
This commit is contained in:
83
thirdparty/oset/pyoset.py
vendored
Normal file
83
thirdparty/oset/pyoset.py
vendored
Normal file
@@ -0,0 +1,83 @@
|
||||
#!/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
|
||||
Reference in New Issue
Block a user