# cython: auto_pickle=False

cimport cython
from gevent._greenlet cimport Greenlet

cdef bint _PYPY
cdef ref
cdef copy

cdef object _marker
cdef str key_prefix
cdef bint _greenlet_imported


cdef extern from "greenlet/greenlet.h":

    ctypedef class greenlet.greenlet [object PyGreenlet]:
        pass

    # These are actually macros and so much be included
    # (defined) in each .pxd, as are the two functions
    # that call them.
    greenlet PyGreenlet_GetCurrent()
    void PyGreenlet_Import()

cdef inline greenlet getcurrent():
    return PyGreenlet_GetCurrent()

cdef inline void greenlet_init():
    global _greenlet_imported
    if not _greenlet_imported:
        PyGreenlet_Import()
        _greenlet_imported = True


cdef void _init()

@cython.final
@cython.internal
cdef class _wrefdict(dict):
   cdef object __weakref__

@cython.final
@cython.internal
cdef class _greenlet_deleted:
    cdef object idt
    cdef object wrdicts


@cython.final
@cython.internal
cdef class _local_deleted:
    cdef str key
    cdef object wrthread
    cdef _greenlet_deleted greenlet_deleted

@cython.final
@cython.internal
cdef class _localimpl:
    cdef str key
    cdef dict dicts
    cdef tuple localargs
    cdef dict localkwargs
    cdef tuple localtypeid
    cdef object __weakref__


@cython.final
@cython.internal
cdef class _localimpl_dict_entry:
    cdef object wrgreenlet
    cdef dict localdict

@cython.locals(localdict=dict, key=str,
               greenlet_deleted=_greenlet_deleted,
               local_deleted=_local_deleted)
cdef dict _localimpl_create_dict(_localimpl self,
                                 greenlet greenlet,
                                 object idt)

cdef set _local_attrs

cdef class local:
    cdef _localimpl _local__impl
    cdef set _local_type_get_descriptors
    cdef set _local_type_set_or_del_descriptors
    cdef set _local_type_del_descriptors
    cdef set _local_type_set_descriptors
    cdef set _local_type_vars
    cdef type _local_type

    @cython.locals(entry=_localimpl_dict_entry,
                   dct=dict, duplicate=dict,
                   instance=local)
    cpdef local __copy__(local self)


@cython.locals(impl=_localimpl,dct=dict,
               dct=dict, entry=_localimpl_dict_entry)
cdef inline dict _local_get_dict(local self)

@cython.locals(entry=_localimpl_dict_entry)
cdef _local__copy_dict_from(local self, _localimpl impl, dict duplicate)

@cython.locals(mro=list, gets=set, dels=set, set_or_del=set,
               type_self=type, type_attr=type,
               sets=set)
cdef tuple _local_find_descriptors(local self)

@cython.locals(result=list, local_impl=_localimpl,
               entry=_localimpl_dict_entry, k=str,
               greenlet_dict=dict)
cpdef all_local_dicts_for_greenlet(greenlet greenlet)
