"""

Lifted from Precision.py.  This is for compatibility only.

The character strings are still for "new" NumPy
which is the only Incompatibility with Numeric

"""


__all__ = ['Character', 'Complex', 'Float',
           'PrecisionError', 'PyObject', 'Int', 'UInt',
           'UnsignedInt', 'UnsignedInteger', 'string', 'typecodes', 'zeros']

from .functions import zeros
import string   # for backwards compatibility

typecodes = {'Character':'c', 'Integer':'bhil', 'UnsignedInteger':'BHIL', '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 list(typecodes.items()):
        table[key] = _get_precisions(value)
    return table

_code_table = _fill_table(typecodes)

class PrecisionError(Exception):
    pass

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")

Character = 'c'

try:
    UnsignedInt8 = _lookup(_code_table, "UnsignedInteger", 8)
    UInt8 = UnsignedInt8
    __all__.extend(['UnsignedInt8', 'UInt8'])
except(PrecisionError):
    pass
try:
    UnsignedInt16 = _lookup(_code_table, "UnsignedInteger", 16)
    UInt16 = UnsignedInt16
    __all__.extend(['UnsignedInt16', 'UInt16'])
except(PrecisionError):
    pass
try:
    UnsignedInt32 = _lookup(_code_table, "UnsignedInteger", 32)
    UInt32 = UnsignedInt32
    __all__.extend(['UnsignedInt32', 'UInt32'])
except(PrecisionError):
    pass
try:
    UnsignedInt64 = _lookup(_code_table, "UnsignedInteger", 64)
    UInt64 = UnsignedInt64
    __all__.extend(['UnsignedInt64', 'UInt64'])
except(PrecisionError):
    pass
try:
    UnsignedInt128 = _lookup(_code_table, "UnsignedInteger", 128)
    UInt128 = UnsignedInt128
    __all__.extend(['UnsignedInt128', 'UInt128'])
except(PrecisionError):
    pass
UInt = UnsignedInt = UnsignedInteger = 'u'

try:
    Int0 = _lookup(_code_table, 'Integer', 0)
    __all__.append('Int0')
except(PrecisionError):
    pass
try:
    Int8 = _lookup(_code_table, 'Integer', 8)
    __all__.append('Int8')
except(PrecisionError):
    pass
try:
    Int16 = _lookup(_code_table, 'Integer', 16)
    __all__.append('Int16')
except(PrecisionError):
    pass
try:
    Int32 = _lookup(_code_table, 'Integer', 32)
    __all__.append('Int32')
except(PrecisionError):
    pass
try:
    Int64 = _lookup(_code_table, 'Integer', 64)
    __all__.append('Int64')
except(PrecisionError):
    pass
try:
    Int128 = _lookup(_code_table, 'Integer', 128)
    __all__.append('Int128')
except(PrecisionError):
    pass
Int = 'l'

try:
    Float0 = _lookup(_code_table, 'Float', 0)
    __all__.append('Float0')
except(PrecisionError):
    pass
try:
    Float8 = _lookup(_code_table, 'Float', 8)
    __all__.append('Float8')
except(PrecisionError):
    pass
try:
    Float16 = _lookup(_code_table, 'Float', 16)
    __all__.append('Float16')
except(PrecisionError):
    pass
try:
    Float32 = _lookup(_code_table, 'Float', 32)
    __all__.append('Float32')
except(PrecisionError):
    pass
try:
    Float64 = _lookup(_code_table, 'Float', 64)
    __all__.append('Float64')
except(PrecisionError):
    pass
try:
    Float128 = _lookup(_code_table, 'Float', 128)
    __all__.append('Float128')
except(PrecisionError):
    pass
Float = 'd'

try:
    Complex0 = _lookup(_code_table, 'Complex', 0)
    __all__.append('Complex0')
except(PrecisionError):
    pass
try:
    Complex8 = _lookup(_code_table, 'Complex', 16)
    __all__.append('Complex8')
except(PrecisionError):
    pass
try:
    Complex16 = _lookup(_code_table, 'Complex', 32)
    __all__.append('Complex16')
except(PrecisionError):
    pass
try:
    Complex32 = _lookup(_code_table, 'Complex', 64)
    __all__.append('Complex32')
except(PrecisionError):
    pass
try:
    Complex64 = _lookup(_code_table, 'Complex', 128)
    __all__.append('Complex64')
except(PrecisionError):
    pass
try:
    Complex128 = _lookup(_code_table, 'Complex', 256)
    __all__.append('Complex128')
except(PrecisionError):
    pass
Complex = 'D'

PyObject = 'O'
