home *** CD-ROM | disk | FTP | other *** search
- """ A simple hack to start thinking about a better way to handle
- specification of typecodes.
-
- TODO:
- The code_table should proably be cached somehow
- Float/Complex needs to have precision and range specifiers
- """
-
- from multiarray import zeros
- import string
-
- typecodes = {'Character':'c', 'Integer':'1sil', 'UnsignedInteger':'b', 'Float':'fd', 'Complex':'FD'}
-
- def _get_precisions(typecodes):
- lst = []
- for t in typecodes:
- lst.append( (zeros( (1,), t ).itemsize()*8, t) )
- return lst
-
- def _fill_table(typecodes, table={}):
- for key, value in typecodes.items():
- table[key] = _get_precisions(value)
- return table
-
- _code_table = _fill_table(typecodes)
-
- PrecisionError = "PrecisionError"
-
- def _lookup(table, key, required_bits):
- lst = table[key]
- for bits, typecode in lst:
- if bits >= required_bits:
- return typecode
- raise PrecisionError, key+" of "+str(required_bits)+" bits not available on this system"
-
- UnsignedInt8 = 'b'
-
- try: Int0 = _lookup(_code_table, 'Integer', 0)
- except(PrecisionError): pass
- try: Int8 = _lookup(_code_table, 'Integer', 8)
- except(PrecisionError): pass
- try: Int16 = _lookup(_code_table, 'Integer', 16)
- except(PrecisionError): pass
- try: Int32 = _lookup(_code_table, 'Integer', 32)
- except(PrecisionError): pass
- try: Int64 = _lookup(_code_table, 'Integer', 64)
- except(PrecisionError): pass
- try: Int128 = _lookup(_code_table, 'Integer', 128)
- except(PrecisionError): pass
- Int = 'l'
-
- try: Float0 = _lookup(_code_table, 'Float', 0)
- except(PrecisionError): pass
- try: Float8 = _lookup(_code_table, 'Float', 8)
- except(PrecisionError): pass
- try: Float16 = _lookup(_code_table, 'Float', 16)
- except(PrecisionError): pass
- try: Float32 = _lookup(_code_table, 'Float', 32)
- except(PrecisionError): pass
- try: Float64 = _lookup(_code_table, 'Float', 64)
- except(PrecisionError): pass
- try: Float128 = _lookup(_code_table, 'Float', 128)
- except(PrecisionError): pass
- Float = 'd'
-
- try: Complex0 = _lookup(_code_table, 'Complex', 0)
- except(PrecisionError): pass
- try: Complex8 = _lookup(_code_table, 'Complex', 16)
- except(PrecisionError): pass
- try: Complex16 = _lookup(_code_table, 'Complex', 32)
- except(PrecisionError): pass
- try: Complex32 = _lookup(_code_table, 'Complex', 64)
- except(PrecisionError): pass
- try: Complex64 = _lookup(_code_table, 'Complex', 128)
- except(PrecisionError): pass
- try: Complex128 = _lookup(_code_table, 'Complex', 256)
- except(PrecisionError): pass
- Complex = 'D'
-
- PyObject = 'O'
-