Added functions for special floats numbers. Added functions for working on string...
authorFrederic Jolliton <frederic@jolliton.com>
Sun, 11 Sep 2005 05:49:25 +0000 (05:49 +0000)
committerFrederic Jolliton <frederic@jolliton.com>
Sun, 11 Sep 2005 05:49:25 +0000 (05:49 +0000)
 * Added functions to test special floats numbers (NaN, +inf, -inf)
   (isNotANumber, isInfinity, isPositiveInfinity, isNegativeInfinity,
   isSpecialFloat)

 * Added some functions that can work on string and also on iterator of
   strings to:

   - compute the total length,

   - test if a string starts with another string,

   - test if two strings are equals.
git-archimport-id: frederic@jolliton.com--2005-main/tx--main--0.1--patch-20

misc.py

diff --git a/misc.py b/misc.py
index 4e87094..6feb0c9 100644 (file)
--- a/misc.py
+++ b/misc.py
@@ -28,7 +28,15 @@ __all__ = [
        'plural' ,
        'bench' ,
        'typeOf' ,
-       'shortenText'
+       'shortenText' ,
+       'stringValuesStartsWith' ,
+       'stringValuesCompare' ,
+       'stringValuesLength' ,
+       'isNotANumber' ,
+       'isInfinity' ,
+       'isPositiveInfinity' ,
+       'isNegativeInfinity' ,
+       'isSpecialFloat'
        ]
 
 import time
@@ -171,6 +179,142 @@ def decodeData( data ) :
                raise Error( 'Unexpected encoding %s' % encoding )
        return data
 
+#----------------------------------------------------------------------------
+
+def isNotANumber( n ) :
+
+       '''Test if 'n' is a "not-a-number" float.'''
+
+       return isinstance( n , float ) and n != n
+
+def isInfinity( n ) :
+
+       '''Test if 'n' is either a positive or negative infinity float.'''
+
+       return isinstance( n , float ) and 2 * n == n
+
+def isPositiveInfinity( n ) :
+
+       return isInfinity( n ) and n > 0
+
+def isNegativeInfinity( n ) :
+
+       return isInfinity( n ) and n < 0
+
+def isSpecialFloat( n ) :
+
+       '''Test if 'n' is one of the special float value (nan,+inf,-inf).'''
+
+       return isinstance( n , float ) \
+               and ( n != n          # NaN
+                         or 2 * n == n ) # +inf or -inf
+
+#----------------------------------------------------------------------------
+
+def stringValuesLength( s ) :
+
+       '''Compute length of string 's'.'''
+
+       if isinstance( s , basestring ) :
+               return len( s )
+       else :
+               return sum( len( item ) for item in s )
+
+def stringValuesStartsWith( s1 , s2 ) :
+
+       '''
+       Compare strings 's1' and 's2'. This function also accept iterators
+       returning string. This is usefull to compare two nodes without
+       first converting them to strings for performance reason.
+       '''
+
+       if isinstance( s1 , basestring ) :
+               if isinstance( s2 , basestring ) :
+                       return s1.startswith( s2 )
+               else :
+                       s1 = iterSingle( s1 )
+       elif isinstance( s2 , basestring ) :
+               s2 = iterSingle( s2 )
+
+       result = 0
+       d1 = ''
+       d2 = ''
+       while 1 :
+               if not d1 :
+                       try :
+                               d1 = s1.next()
+                       except StopIteration :
+                               d1 = ''
+               if not d2 :
+                       try :
+                               d2 = s2.next()
+                       except StopIteration :
+                               d2 = ''
+               if not d1 :
+                       if not d2 :
+                               r = True
+                       else :
+                               r = False
+                       break
+               elif not d2 :
+                       r = True
+                       break
+               m = min( len( d1 ) , len( d2 ) )
+               r = cmp( d1[ : m ] , d2[ : m ] )
+               if r != 0 :
+                       r = False
+                       break
+               d1 = d1[ m : ]
+               d2 = d2[ m : ]
+       return r
+
+def stringValuesCompare( s1 , s2 ) :
+
+       '''
+       Compare strings 's1' and 's2'. This function also accept iterators
+       returning string. This is usefull to compare two nodes without
+       first converting them to strings for performance reason.
+       '''
+
+       if isinstance( s1 , basestring ) :
+               if isinstance( s2 , basestring ) :
+                       return cmp( s1 , s2 )
+               else :
+                       s1 = iterSingle( s1 )
+       elif isinstance( s2 , basestring ) :
+               s2 = iterSingle( s2 )
+
+       result = 0
+       d1 = ''
+       d2 = ''
+       while 1 :
+               if not d1 :
+                       try :
+                               d1 = s1.next()
+                       except StopIteration :
+                               d1 = ''
+               if not d2 :
+                       try :
+                               d2 = s2.next()
+                       except StopIteration :
+                               d2 = ''
+               if not d1 :
+                       if not d2 :
+                               r = 0
+                       else :
+                               r = -1
+                       break
+               elif not d2 :
+                       r = 1
+                       break
+               m = min( len( d1 ) , len( d2 ) )
+               r = cmp( d1[ : m ] , d2[ : m ] )
+               if r != 0 :
+                       break
+               d1 = d1[ m : ]
+               d2 = d2[ m : ]
+       return r
+
 def iterSingle( o ) :
 
        '''Iterate over singleton 'o'.'''