o
    Á¿iQ  ã                   @   sZ   U d Z ddlZdedefdd„ZeedƒrejneZejegef e	d< G d	d
„ d
ƒZ
dS )zM
NOTE: BETA - this API is currently in development and is subject to change.
é    NÚ_byteÚreturnc                 C   s   t | ƒ d¡S )NÚ1)ÚbinÚcount)r   © r   úc/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/internal/test_visibility/coverage_lines.pyÚ_bit_count_compat   s   r	   Ú	bit_countÚ
_bit_countc                   @   sÄ   e Zd Zd"defdd„Zdedefdd„Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdefdd„Zdefdd„Zdee fdd„Zd#dd„Zdefdd„Zedee dd fdd„ƒZededd fdd „ƒZd!S )$ÚCoverageLinesé    Úinitial_sizec                 C   s   t |ƒ| _d S ©N)Ú	bytearrayÚ_lines)Úselfr   r   r   r   Ú__init__   s   zCoverageLines.__init__Úotherr   c                 C   s   t |tƒstS | j|jkS r   )Ú
isinstancer   ÚNotImplementedr   )r   r   r   r   r   Ú__eq__   s   
zCoverageLines.__eq__c                 C   s   |   ¡ S r   ©Ú
_num_lines©r   r   r   r   Ú__len__   s   zCoverageLines.__len__c                 C   s   |   ¡ dkS )Nr   r   r   r   r   r   Ú__bool__   s   zCoverageLines.__bool__c                 C   s   t ƒ }| j ¡ |_|S r   )r   r   Úcopy)r   Únew_instancer   r   r   Ú__copy__   s   zCoverageLines.__copy__c                 C   s   d|   ¡ › dS )NzCoverageLines(num_lines=ú)r   r   r   r   r   Ú__repr__$   s   zCoverageLines.__repr__c                 C   s   t dd„ | jD ƒƒS )Nc                 s   s    | ]}t |ƒV  qd S r   )r   )Ú.0Úbyter   r   r   Ú	<genexpr>(   s   € z+CoverageLines._num_lines.<locals>.<genexpr>)Úsumr   r   r   r   r   r   '   s   zCoverageLines._num_linesÚline_numberc                 C   sV   |d }|| j  ¡ kr| j  t|| j  ¡  d ƒ¡ d|d ? }| j |  |O  < d S )Né   é   é€   )r   r   Úextendr   )r   r&   Ú
lines_byteÚ	lines_bitr   r   r   Úadd*   s
   zCoverageLines.addc                 C   sH   g }t | jƒD ]\}}tdƒD ]}|d|? @ r | |d | ¡ qq|S )z-Returns a sorted list of covered line numbersr'   r)   )Ú	enumerater   ÚrangeÚappend)r   ÚlinesÚidxr   Ú_bitr   r   r   Úto_sorted_list5   s   €ýzCoverageLines.to_sorted_listc                 C   s^   |j  ¡ | j  ¡ kr| j  t|j  ¡ | j  ¡  ƒ¡ t|j ƒD ]\}}| j |  |O  < qd S r   )r   r   r*   r   r.   )r   r   Ú	_byte_idxr   r   r   r   Úupdate@   s
    ÿzCoverageLines.updatec                 C   s   | j S )zdThis exists as a simple interface in case we ever decide to change the internal lines representation©r   r   r   r   r   Úto_bytesH   s   zCoverageLines.to_bytesr1   c                 C   s   | ƒ }|D ]}|  |¡ q|S r   )r-   )Úclsr1   ÚcoverageÚliner   r   r   Ú	from_listL   s   zCoverageLines.from_listc                 C   s   | ƒ }||_ |S r   r7   )r9   r1   r:   r   r   r   Úfrom_bytearrayS   s   zCoverageLines.from_bytearrayN)r   )r   r   )Ú__name__Ú
__module__Ú__qualname__Úintr   ÚobjectÚboolr   r   r   r   r!   r   r-   Úlistr4   r6   Úbytesr8   Úclassmethodr<   r   r=   r   r   r   r   r      s     
r   )Ú__doc__ÚtypingÚtrA   r	   Úhasattrr
   r   ÚCallableÚ__annotations__r   r   r   r   r   Ú<module>   s
    (