o
    0 i                     @   sZ   d dl Z d dlZd dlmZ d dlmZ G dd dZedddd	Zed
dddZdS )    N)_core)internalc                   @   sT   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	e
dd Zdd ZdS )flatitera\  Flat iterator object to iterate over arrays.

    A flatiter iterator is returned by ``x.flat`` for any array ``x``. It
    allows iterating over the array as if it were a 1-D array, either in a
    for-loop or by calling its ``next`` method.

    Iteration is done in row-major, C-style order (the last index varying the
    fastest).

    Attributes:
        base (cupy.ndarray): A reference to the array that is iterated over.

    .. note::
       Restricted support of basic slicing is currently supplied. Advanced
       indexing is not supported yet.

    .. seealso:: :func:`numpy.flatiter`

    c                 C   s   || _ d| _d S )Nr   )_base_index)selfa r	   b/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/cupy/_indexing/iterate.py__init__   s   
zflatiter.__init__c           	      C   s&  |t u r|| d d < d S t|trtdt|trtdt|rLt|}| j}|j	}g }|j
D ]}|| }|||  ||; }q2||t|< d S t|tr| j}t||j	}|j}|j}|j|j }|dkrt|d | d }n|d | d }tj||jd}t|||||d d S td)Nunsupported iterator indexr      )dtypesize)Ellipsis
isinstancetuple
IndexErrorboolnumpyisscalarintr   r   shapeappendslicer   complete_slicestartstepstopcupyZasarrayr   _flatiter_setitem_slice)	r   indvaluebaser   indicesss_starts_stepr	   r	   r
   __setitem__!   s>   





zflatiter.__setitem__c                 C   s  |t u r
| d d  S t|trtdt|trtdt|rJt|}| j}|j	}g }|j
D ]}|| }|||  ||; }q0|t|  S t|tr| j}t||j	}|j}|j}|j|j }|dkrr|d | d }n|d | d }t||||dS td)Nr   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   copyr   r   r   r   r   r   _flatiter_getitem_slice)r   r"   r$   r   r%   r&   r'   r(   r	   r	   r
   __getitem__H   s6   





zflatiter.__getitem__c                 C   s   | S Nr	   r   r	   r	   r
   __iter__k   s   zflatiter.__iter__c                 C   s.   | j }|t| krt |  j d7  _ | | S )Nr   )r   lenStopIteration)r   indexr	   r	   r
   __next__n   s
   zflatiter.__next__c                 C   s
   | j  S )z*Get a copy of the iterator as a 1-D array.)r$   flattenr.   r	   r	   r
   r*   u   s   
zflatiter.copyc                 C   s   | j S )z/A reference to the array that is iterated over.)r   r.   r	   r	   r
   r$   y   s   zflatiter.basec                 C   s   | j jS r-   )r$   r   r.   r	   r	   r
   __len__   s   zflatiter.__len__N)__name__
__module____qualname____doc__r   r)   r,   r/   r3   r*   propertyr$   r5   r	   r	   r	   r
   r      s    '#
r   z"raw T val, int64 start, int64 stepzraw T az)a[start + i * step] = val[i % val.size()]Zcupy_flatiter_setitem_slicez raw T a, int64 start, int64 stepzT ozo = a[start + i * step]Zcupy_flatiter_getitem_slice)	r   r    r   Z
cupy._corer   r   ZElementwiseKernelr!   r+   r	   r	   r	   r
   <module>   s      