Show More
@@ -25,7 +25,7 b'' | |||
|
25 | 25 | # along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
26 | 26 | |
|
27 | 27 | import os |
|
28 | from rhodecode import __platform__, PLATFORM_WIN | |
|
28 | from rhodecode import __platform__, PLATFORM_WIN, __py_version__ | |
|
29 | 29 | |
|
30 | 30 | #============================================================================== |
|
31 | 31 | # json |
@@ -404,3 +404,129 b' try:' | |||
|
404 | 404 | from io import BytesIO |
|
405 | 405 | except ImportError: |
|
406 | 406 | from cStringIO import StringIO as BytesIO |
|
407 | ||
|
408 | ||
|
409 | #============================================================================== | |
|
410 | # deque | |
|
411 | #============================================================================== | |
|
412 | ||
|
413 | if __py_version__ >= (2, 6): | |
|
414 | from collections import deque | |
|
415 | else: | |
|
416 | #need to implement our own deque with maxlen | |
|
417 | class deque(object): | |
|
418 | ||
|
419 | def __init__(self, iterable=(), maxlen=-1): | |
|
420 | if not hasattr(self, 'data'): | |
|
421 | self.left = self.right = 0 | |
|
422 | self.data = {} | |
|
423 | self.maxlen = maxlen | |
|
424 | self.extend(iterable) | |
|
425 | ||
|
426 | def append(self, x): | |
|
427 | self.data[self.right] = x | |
|
428 | self.right += 1 | |
|
429 | if self.maxlen != -1 and len(self) > self.maxlen: | |
|
430 | self.popleft() | |
|
431 | ||
|
432 | def appendleft(self, x): | |
|
433 | self.left -= 1 | |
|
434 | self.data[self.left] = x | |
|
435 | if self.maxlen != -1 and len(self) > self.maxlen: | |
|
436 | self.pop() | |
|
437 | ||
|
438 | def pop(self): | |
|
439 | if self.left == self.right: | |
|
440 | raise IndexError('cannot pop from empty deque') | |
|
441 | self.right -= 1 | |
|
442 | elem = self.data[self.right] | |
|
443 | del self.data[self.right] | |
|
444 | return elem | |
|
445 | ||
|
446 | def popleft(self): | |
|
447 | if self.left == self.right: | |
|
448 | raise IndexError('cannot pop from empty deque') | |
|
449 | elem = self.data[self.left] | |
|
450 | del self.data[self.left] | |
|
451 | self.left += 1 | |
|
452 | return elem | |
|
453 | ||
|
454 | def clear(self): | |
|
455 | self.data.clear() | |
|
456 | self.left = self.right = 0 | |
|
457 | ||
|
458 | def extend(self, iterable): | |
|
459 | for elem in iterable: | |
|
460 | self.append(elem) | |
|
461 | ||
|
462 | def extendleft(self, iterable): | |
|
463 | for elem in iterable: | |
|
464 | self.appendleft(elem) | |
|
465 | ||
|
466 | def rotate(self, n=1): | |
|
467 | if self: | |
|
468 | n %= len(self) | |
|
469 | for i in xrange(n): | |
|
470 | self.appendleft(self.pop()) | |
|
471 | ||
|
472 | def __getitem__(self, i): | |
|
473 | if i < 0: | |
|
474 | i += len(self) | |
|
475 | try: | |
|
476 | return self.data[i + self.left] | |
|
477 | except KeyError: | |
|
478 | raise IndexError | |
|
479 | ||
|
480 | def __setitem__(self, i, value): | |
|
481 | if i < 0: | |
|
482 | i += len(self) | |
|
483 | try: | |
|
484 | self.data[i + self.left] = value | |
|
485 | except KeyError: | |
|
486 | raise IndexError | |
|
487 | ||
|
488 | def __delitem__(self, i): | |
|
489 | size = len(self) | |
|
490 | if not (-size <= i < size): | |
|
491 | raise IndexError | |
|
492 | data = self.data | |
|
493 | if i < 0: | |
|
494 | i += size | |
|
495 | for j in xrange(self.left + i, self.right - 1): | |
|
496 | data[j] = data[j + 1] | |
|
497 | self.pop() | |
|
498 | ||
|
499 | def __len__(self): | |
|
500 | return self.right - self.left | |
|
501 | ||
|
502 | def __cmp__(self, other): | |
|
503 | if type(self) != type(other): | |
|
504 | return cmp(type(self), type(other)) | |
|
505 | return cmp(list(self), list(other)) | |
|
506 | ||
|
507 | def __repr__(self, _track=[]): | |
|
508 | if id(self) in _track: | |
|
509 | return '...' | |
|
510 | _track.append(id(self)) | |
|
511 | r = 'deque(%r, maxlen=%s)' % (list(self), self.maxlen) | |
|
512 | _track.remove(id(self)) | |
|
513 | return r | |
|
514 | ||
|
515 | def __getstate__(self): | |
|
516 | return (tuple(self),) | |
|
517 | ||
|
518 | def __setstate__(self, s): | |
|
519 | self.__init__(s[0]) | |
|
520 | ||
|
521 | def __hash__(self): | |
|
522 | raise TypeError | |
|
523 | ||
|
524 | def __copy__(self): | |
|
525 | return self.__class__(self) | |
|
526 | ||
|
527 | def __deepcopy__(self, memo={}): | |
|
528 | from copy import deepcopy | |
|
529 | result = self.__class__() | |
|
530 | memo[id(self)] = result | |
|
531 | result.__init__(deepcopy(tuple(self), memo)) | |
|
532 | return result |
General Comments 0
You need to be logged in to leave comments.
Login now