
    `i*              	         d Z ddlmZ ddlZddlZddlZddlmZmZm	Z	m
Z
mZmZ ddlmZmZ ddlmZ ej        dk    rdd	lmZ dd
lmZmZmZmZ ddlmZ ddlmZ ndd	lmZ dd
lmZmZmZmZ ddlmZ ddlmZ ddgZ e
d          Z e
d          Z  e
d          Z! e
d          Z" ej#                    Z$d(dZ% ed           G d dej&        ee                               Z' G d  d!ee                    Z G d" d#ee!                   Z G d$ d%ee e!f                   Z ed&           G d' dej&        ee e!f                               Z(dS ))zContainer classes.    )annotationsN)AnyCallableSupportsIndexTypeVarcastoverload   )_ffi_apicore)register_object)   	   	ItemsView)IterableIteratorMappingSequenceKeysView
ValuesViewArrayMapTKV	_DefaultTobjr   elem_getterCallable[[Any, int], T]lengthintidxSupportsIndex | slicereturnT | list[T]c                    t          |t                    r7|                    |          \  }}} fdt          |||          D             S 	 t	          j        |          }n7# t          $ r*}t          dt          |          j                   |d}~ww xY w|| k     s||k    rt          d| d|           |dk     r||z  }  |          S )a  Implement a pythonic __getitem__ helper.

    Parameters
    ----------
    obj
        The original object

    elem_getter
        A simple function that takes index and return a single element.

    length
        The size of the array

    idx
        The argument passed to getitem

    Returns
    -------
    result
        The element for integer indices or a :class:`list` for slices.

    c                (    g | ]} |          S  r+   ).0ir!   r    s     e/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/tvm_ffi/container.py
<listcomp>z"getitem_helper.<locals>.<listcomp>q   s%    FFFC##FFF    z(indices must be integers or slices, not NzIndex out of range. size: z, got index r   )

isinstancesliceindicesrangeoperatorindex	TypeErrortype__name__
IndexError)	r    r!   r#   r%   startstopstepr6   excs	   ``       r.   getitem_helperr?   S   s   8 #u GKK//tTFFFFFU5$-E-EFFFFbs## b b bW499CUWWXX^aab w%6//QfQQ%QQRRRqyy;sE"""s   A% %
B/%BBz	ffi.Arrayc                      e Zd ZdZd!dZed"d
            Zed#d            Zd$dZd%dZd&dZd'dZ	d(dZ
d)dZd*dZd*dZd S )+r   a<  Array container that represents a sequence of values in the FFI.

    :py:func:`tvm_ffi.convert` will map python list/tuple to this class.

    Parameters
    ----------
    input_list
        The list of values to be stored in the array.

    Examples
    --------
    .. code-block:: python

        import tvm_ffi

        a = tvm_ffi.Array([1, 2, 3])
        assert tuple(a) == (1, 2, 3)

    Notes
    -----
    For structural equality and hashing, use ``structural_equal`` and ``structural_hash`` APIs.

    See Also
    --------
    :py:func:`tvm_ffi.convert`

    
input_listIterable[T]r'   Nonec                6     | j         t          j        g|R   dS )z*Construct an Array from a Python sequence.N)__init_handle_by_constructor__r   r   )selfrA   s     r.   __init__zArray.__init__   s%    ++HNHZHHHHHHr0   r%   r   r   c                   d S Nr+   rF   r%   s     r.   __getitem__zArray.__getitem__   s    7:sr0   r2   list[T]c                   d S rI   r+   rJ   s     r.   rK   zArray.__getitem__   s    58Sr0   r&   r(   c               \    t          |           }t          | t          j        ||          }|S )z)Return one element or a list for a slice.)lenr?   r   ArrayGetItem)rF   r%   r#   results       r.   rK   zArray.__getitem__   s(    Th&;VSIIr0   r$   c                *    t          j        |           S )z+Return the number of elements in the array.)r   	ArraySizerF   s    r.   __len__zArray.__len__   s    !$'''r0   Iterator[T]c              #  `   K   t          |           }t          |          D ]}| |         V  dS )z'Iterate over the elements in the array.N)rO   r4   )rF   r#   r-   s      r.   __iter__zArray.__iter__   s?      Tv 	 	Aq'MMMM	 	r0   strc                    |                                  dk    rt          |           j        dz   S dd                    d | D                       z   dz   S )z,Return a string representation of the array.r   (chandle=None)[, c                6    g | ]}|                                 S r+   __repr__)r,   xs     r.   r/   z"Array.__repr__.<locals>.<listcomp>   s     ;;;

;;;r0   ])__chandle__r8   r9   joinrT   s    r.   r`   zArray.__repr__   s[     ""::&)999TYY;;d;;;<<<sBBr0   valueobjectboolc                ,    t          j        | |          S )z$Check if the array contains a value.)r   ArrayContains)rF   re   s     r.   __contains__zArray.__contains__   s    %dE222r0   c                (    t          |           dk    S )z&Return True if the array is non-empty.r   rO   rT   s    r.   __bool__zArray.__bool__       4yy1}r0   otherArray[T]c                X     t          |           t          j        | |                    S zConcatenate two arrays.r8   	itertoolschainrF   ro   s     r.   __add__zArray.__add__   s$    tDzz)/$66777r0   c                X     t          |           t          j        ||                     S rr   rs   rv   s     r.   __radd__zArray.__radd__   s$    tDzz)/%66777r0   N)rA   rB   r'   rC   )r%   r   r'   r   )r%   r2   r'   rL   )r%   r&   r'   r(   r'   r$   )r'   rV   r'   rY   )re   rf   r'   rg   r'   rg   )ro   rB   r'   rp   )r9   
__module____qualname____doc__rG   r	   rK   rU   rX   r`   rj   rm   rw   ry   r+   r0   r.   r   r      s	        BI I I I ::: X:888 X8   ( ( ( (   C C C C3 3 3 3   8 8 8 88 8 8 8 8 8r0   c                  2    e Zd ZdZddZddZdd
ZddZdS )r   z!Helper class to return keys view.backend_map	Map[K, V]r'   rC   c                    || _         d S rI   _backend_maprF   r   s     r.   rG   zKeysView.__init__       'r0   r$   c                *    t          | j                  S rI   rO   r   rT   s    r.   rU   zKeysView.__len__       4$%%%r0   Iterator[K]c              #     K   t          | j                  }t          j        | j                  }t	          |          D ]2}t          t           |d                    }|V   |d          s d S 3d S )Nr      )rO   r   r   MapForwardIterFunctorr4   r   r   )rF   sizefunctor_keys        r.   rX   zKeysView.__iter__   s      4$%%(0(FtGX(Y(Yt 	 	Aq''!**%%CIII71:: 	 	r0   krf   rg   c                    || j         v S rI   r   rF   r   s     r.   rj   zKeysView.__contains__   s    D%%%r0   Nr   r   r'   rC   rz   r'   r   r   rf   r'   rg   r9   r}   r~   r   rG   rU   rX   rj   r+   r0   r.   r   r      sj        ++( ( ( (& & & &   & & & & & &r0   r   c                  *    e Zd ZdZddZddZdd
ZdS )r   z#Helper class to return values view.r   r   r'   rC   c                    || _         d S rI   r   r   s     r.   rG   zValuesView.__init__   r   r0   r$   c                *    t          | j                  S rI   r   rT   s    r.   rU   zValuesView.__len__   r   r0   Iterator[V]c              #     K   t          | j                  }t          j        | j                  }t	          |          D ]2}t          t           |d                    }|V   |d          s d S 3d S )Nr
   r   )rO   r   r   r   r4   r   r   )rF   r   r   r   re   s        r.   rX   zValuesView.__iter__   s      4$%%(0(FtGX(Y(Yt 	 	AGGAJJ''EKKK71:: 	 	r0   Nr   rz   )r'   r   )r9   r}   r~   r   rG   rU   rX   r+   r0   r.   r   r      sV        --( ( ( (& & & &     r0   r   c                  2    e Zd ZdZddZddZdd
ZddZdS )r   z"Helper class to return items view.r   r   r'   rC   c                    || _         d S rI   r   r   s     r.   rG   zItemsView.__init__   r   r0   r$   c                *    t          | j                  S rI   r   rT   s    r.   rU   zItemsView.__len__  r   r0   Iterator[tuple[K, V]]c              #  (  K   t          | j                  }t          j        | j                  }t	          |          D ]R}t          t           |d                    }t          t           |d                    }||fV   |d          s d S Sd S )Nr   r
   r   )rO   r   r   r   r4   r   r   r   )rF   r   r   r   r   re   s         r.   rX   zItemsView.__iter__  s      4$%%(0(FtGX(Y(Yt 	 	Aq''!**%%CGGAJJ''E,71:: 		 	r0   itemrf   rg   c                    t          |t                    rt          |          dk    rdS |\  }}| j                            |t
                    }|t
          u rdS ||k    S )Nr   F)r1   tuplerO   r   getMISSING)rF   r   r   re   actual_values        r.   rj   zItemsView.__contains__  sc    $&& 	#d))q..5
U(,,S'::7""5u$$r0   Nr   rz   )r'   r   )r   rf   r'   rg   r   r+   r0   r.   r   r      sj        ,,( ( ( (& & & &   % % % % % %r0   r   zffi.Mapc                      e Zd ZdZd$dZd%d
Zd&dZd'dZd(dZd)dZ	d*dZ
d+dZd,dZed-d            Zed.d            Zd/d0d!Zd1d#ZdS )2r   aE  Map container.

    :py:func:`tvm_ffi.convert` will map python dict to this class.

    Parameters
    ----------
    input_dict
        The dictionary of values to be stored in the map.

    Examples
    --------
    .. code-block:: python

        import tvm_ffi

        amap = tvm_ffi.Map({"a": 1, "b": 2})
        assert len(amap) == 2
        assert amap["a"] == 1
        assert amap["b"] == 2

    Notes
    -----
    For structural equality and hashing, use ``structural_equal`` and ``structural_hash`` APIs.

    See Also
    --------
    :py:func:`tvm_ffi.convert`

    
input_dictMapping[K, V]r'   rC   c                    g }|                                 D ]/\  }}|                    |           |                    |           0 | j        t          j        g|R   dS )z&Construct a Map from a Python mapping.N)itemsappendrE   r   r   )rF   r   list_kvsr   vs        r.   rG   zMap.__init__@  sp     $$&& 	 	DAqOOAOOA++HLD8DDDDDDr0   r   r   r   c                R    t          t          t          j        | |                    S )z/Return the value for key `k` or raise KeyError.)r   r   r   
MapGetItemr   s     r.   rK   zMap.__getitem__H  s    Ax*433444r0   rf   rg   c                4    t          j        | |          dk    S )z(Return True if the map contains key `k`.r   )r   MapCountr   s     r.   rj   zMap.__contains__L  s     q))Q..r0   KeysView[K]c                     t          |           S )z(Return a dynamic view of the map's keys.r   rT   s    r.   keyszMap.keysP  s    ~~r0   ValuesView[V]c                     t          |           S )z*Return a dynamic view of the map's values.r   rT   s    r.   valuesz
Map.valuesT  s    $r0   ItemsView[K, V]c                     t          |           S )zGet the items from the map.r   rT   s    r.   r   z	Map.itemsX  s    r0   r$   c                *    t          j        |           S )z&Return the number of items in the map.)r   MapSizerT   s    r.   rU   zMap.__len__\  s    %%%r0   c                (    t          |           dk    S )z$Return True if the map is non-empty.r   rl   rT   s    r.   rm   zMap.__bool__`  rn   r0   r   c                D    t          |                                           S )zIterate over the map's keys.)iterr   rT   s    r.   rX   zMap.__iter__d  s    DIIKK   r0   r   V | Nonec                    d S rI   r+   )rF   r   s     r.   r   zMap.geth  s    '*sr0   defaultV | _DefaultTc                    d S rI   r+   )rF   r   r   s      r.   r   zMap.getk  s    DGCr0   NV | _DefaultT | Nonec                h    t          j        | |          }t                              |          r|S |S )zGet an element with a default value.

        Parameters
        ----------
        key
            The attribute key.

        default
            The default object.

        Returns
        -------
        value
            The result value.

        )r   MapGetItemOrMissingr   same_as)rF   r   r   rets       r.   r   zMap.getn  s4    " *455??3 	N
r0   rY   c                    |                                  dk    rt          |           j        dz   S dd                    d |                                 D                       z   dz   S )z*Return a string representation of the map.r   r[   {r]   c                j    g | ]0\  }}|                                  d |                                  1S )z: r_   )r,   r   r   s      r.   r/   z Map.__repr__.<locals>.<listcomp>  s:    [[[da1::<< A A1::<< A A[[[r0   })rc   r8   r9   rd   r   rT   s    r.   r`   zMap.__repr__  sd     ""::&)999TYY[[djjll[[[\\\_bbbr0   )r   r   r'   rC   )r   r   r'   r   r   )r'   r   )r'   r   )r'   r   rz   r|   r   )r   r   r'   r   )r   r   r   r   r'   r   rI   )r   r   r   r   r'   r   r{   )r9   r}   r~   r   rG   rK   rj   r   r   r   rU   rm   rX   r	   r   r`   r+   r0   r.   r   r     s8        FE E E E5 5 5 5/ / / /             & & & &   ! ! ! ! *** X*GGG XG    ,c c c c c cr0   )
r    r   r!   r"   r#   r$   r%   r&   r'   r(   ))r   
__future__r   rt   r5   systypingr   r   r   r   r   r	    r   r   registryr   version_infocollections.abcr   ItemsViewBaser   r   r   r   r   KeysViewBaser   ValuesViewBase__all__r   r   r   r   MapGetMissingObjectr   r?   Objectr   r   r+   r0   r.   <module>r      s  "   " " " " " "      



                        % % % % % %v                                                      E
 GCLLGCLLGCLLGK  	
&(
&
(
()# )# )# )#X Q8 Q8 Q8 Q8 Q8DK! Q8 Q8 Q8h& & & & &|A & & &,    "   &% % % % %ad# % % %< mc mc mc mc mc$+wq!t} mc mc mc mc mcr0   