import os
from ctypes import *
from ctypes.util import find_library

isl_dyld_library_path = os.environ.get('ISL_DYLD_LIBRARY_PATH')
if isl_dyld_library_path != None:
    os.environ['DYLD_LIBRARY_PATH'] =  isl_dyld_library_path
try:
    isl = cdll.LoadLibrary(isl_dlname)
except:
    isl = cdll.LoadLibrary(find_library("isl"))
libc = cdll.LoadLibrary(find_library("c"))

class Error(Exception):
    pass

class Context:
    defaultInstance = None

    def __init__(self):
        ptr = isl.isl_ctx_alloc()
        self.ptr = ptr

    def __del__(self):
        isl.isl_ctx_free(self)

    def from_param(self):
        return c_void_p(self.ptr)

    @staticmethod
    def getDefaultInstance():
        if Context.defaultInstance == None:
            Context.defaultInstance = Context()
        return Context.defaultInstance

    @CFUNCTYPE(None, py_object)
    def free_user(user):
        pythonapi.Py_DecRef(py_object(user))

isl.isl_ctx_alloc.restype = c_void_p
isl.isl_ctx_free.argtypes = [Context]
isl.isl_id_alloc.restype = c_void_p
isl.isl_id_alloc.argtypes = [Context, c_char_p, py_object]
isl.isl_id_set_free_user.restype = c_void_p
isl.isl_id_set_free_user.argtypes = [c_void_p, c_void_p]
isl.isl_id_get_free_user.restype = c_void_p
isl.isl_id_get_free_user.argtypes = [c_void_p]
isl.isl_id_get_user.restype = py_object
isl.isl_id_get_user.argtypes = [c_void_p]
