| 
				
				
				
				 | 
			
			 | 
			@@ -0,0 +1,99 @@ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			""" | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			A more or less complete user-defined wrapper around tuple objects. | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			Adapted version of the standard library's UserList. | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			Taken from Stefan Schwarzer's ftputil library, available at | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			<http://www.ndh.net/home/sschwarzer/python/python_software.html>, and used under this license: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			Copyright (C) 1999, Stefan Schwarzer  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			All rights reserved. | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			Redistribution and use in source and binary forms, with or without | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			modification, are permitted provided that the following conditions are | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			met: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			- Redistributions of source code must retain the above copyright | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  notice, this list of conditions and the following disclaimer. | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			- Redistributions in binary form must reproduce the above copyright | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  notice, this list of conditions and the following disclaimer in the | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  documentation and/or other materials provided with the distribution. | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			- Neither the name of the above author nor the names of the | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  contributors to the software may be used to endorse or promote | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  products derived from this software without specific prior written | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			  permission. | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			""" | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			# $Id$ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			#XXX tuple instances (in Python 2.2) contain also: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			#   __class__, __delattr__, __getattribute__, __hash__, __new__, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			#   __reduce__, __setattr__, __str__ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			# What about these? | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			class UserTuple: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    def __init__(self, inittuple=None): | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        self.data = () | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if inittuple is not None: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            # XXX should this accept an arbitrary sequence? | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            if type(inittuple) == type(self.data): | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                self.data = inittuple | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            elif isinstance(inittuple, UserTuple): | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                # this results in | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                #   self.data is inittuple.data | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                # but that's ok for tuples because they are | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                # immutable. (Builtin tuples behave the same.) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                self.data = inittuple.data[:] | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            else: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                # the same applies here; (t is tuple(t)) == 1 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                self.data = tuple(inittuple) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    def __repr__(self): return repr(self.data) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    def __lt__(self, other): return self.data <  self.__cast(other) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    def __le__(self, other): return self.data <= self.__cast(other) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    def __eq__(self, other): return self.data == self.__cast(other) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    def __ne__(self, other): return self.data != self.__cast(other) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    def __gt__(self, other): return self.data >  self.__cast(other) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    def __ge__(self, other): return self.data >= self.__cast(other) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    def __cast(self, other): | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if isinstance(other, UserTuple): return other.data | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        else: return other | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    def __cmp__(self, other): | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        return cmp(self.data, self.__cast(other)) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    def __contains__(self, item): return item in self.data | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    def __len__(self): return len(self.data) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    def __getitem__(self, i): return self.data[i] | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    def __getslice__(self, i, j): | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        i = max(i, 0); j = max(j, 0) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        return self.__class__(self.data[i:j]) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    def __add__(self, other): | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if isinstance(other, UserTuple): | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            return self.__class__(self.data + other.data) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        elif isinstance(other, type(self.data)): | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            return self.__class__(self.data + other) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        else: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            return self.__class__(self.data + tuple(other)) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    # dir( () ) contains no __radd__ (at least in Python 2.2) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    def __mul__(self, n): | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        return self.__class__(self.data*n) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    __rmul__ = __mul__ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  |