mirror of
				https://github.com/sqlmapproject/sqlmap.git
				synced 2025-10-25 05:01:32 +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
 |