U
    ,dMK                    @   s
  d dl Z d dlZd dlZd dlmZmZ d dlmZm	Z	m
Z
mZmZmZmZmZmZm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mZ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
l)m*Z* d dl+m,Z, d dl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZN d dlOmPZP ejQdkZRdZSe	ejTG dd dejZUe
ejTdd e
ejTdd e
ejTdd e
ejTdd e
ejTdd eejVG dd deZWdd ZXd d! ZYeejZej[d"d# Z\eej[d$d% Z]eejTd&d' Z^eejTd(d) Z_d*d+ Z`ed,d- Zaed.d/ Zbed0d1 Zced2d3 Zded5d4d5Zeed6d7d8d9 Zfd:d; Zged<d= Zhed>d? Zied@dA Zjed6d7dBdC ZkedDdE ZledFdG ZmedHdI Zned6d7dJdK ZoedLdM ZpedNdO ZqeerdPdQ ZseetdRdS ZueejvdTdU ZweejxdVdW ZyeejzdXdY Z{eej|dZd[ Z}eej~d\d] Zeejd^d_ Zeejd`da Zdbdc Zddde Zdfdg Zedhdi Zedjdk ZeeeZeeeZeejTdld6dmdnZeejTdod7dpdqZeejTdrd8dsdtZeejTdud9dvdwZeejTdxdydz ZeejTd{d:d|d}ZeejTd~dd ZeejTddd Zedd ZeejTdd;ddZeejTdd<ddZeejTdd=ddZdd Zeee7Zeee8ZeejTdd>ddZeejTdd?ddZdd ZeejTded6 eejTded dd Zeee@Zeee?ZeejTdd@ddZedd ZeejTddd ZeejTddd Zedd Zedd Zdd Zdd ZeejTddAddZeejTddBddZeejTddCddZedDddZedd Zedd ZeddĄ Zed6d7ddƄ ZeddȄ Zeejddʄ Zeejeejdd̄ Zedd΄ ZeejddЄ Zeejdd҄ ZeejTdӃdEddՄZddׄ ZeejTd؃eeLeJ eddڄ ZeejTdۃee1e dd݄ Zeddڄ ZeeeDeEeZeee>e=eCZeejTd߃dd ZejQdkreejTddd ZeejTddd ZeejTddd ZeejTddd ZƐdFddZeejTdee7 eejTdeeK eejTdeeM eejTdeeN eejTdee6d6 dd Zedd Zedd Zdd Zeed6ZeedZdd Zeee.Zeee/ZeejTd dd ZeejTddd Zedd Zedd	 ZeejTd
dd Zedd Zedd ZeejTddd Zedd Zedd ZeejTddd Zedd Zedd ZeejTdd d! Zee߃d"d# Zed$d% Zd&eS Zed'd( Zeed)d* Zeerd+d, Zeerd-d. Zed/ejTd0d1 Zed2ejVeejd3d4 ZdS (G      N)IntTypeConstant)
modelsregister_modelmake_attribute_wrapperunboxboxNativeValueoverloadoverload_method	intrinsicregister_jitable)lower_constant
lower_castlower_builtiniternext_implimpl_ret_new_refRefType)register_defaultStructModel)utilstypescgutils)PY_UNICODE_1BYTE_KINDPY_UNICODE_2BYTE_KINDPY_UNICODE_4BYTE_KINDPY_UNICODE_WCHAR_KIND)	c_helpers)
_Py_hash_t)memcpy_region)TypingError)!_Py_TOUPPER_Py_TOLOWER_Py_UCS4_Py_ISALNUM_PyUnicode_ToUpperFull_PyUnicode_ToLowerFull_PyUnicode_ToFoldedFull_PyUnicode_ToTitleFull_PyUnicode_IsPrintable_PyUnicode_IsSpace_Py_ISSPACE_PyUnicode_IsXidStart_PyUnicode_IsXidContinue_PyUnicode_IsCased_PyUnicode_IsCaseIgnorable_PyUnicode_IsUppercase_PyUnicode_IsLowercase_PyUnicode_IsLineBreak_Py_ISLINEBREAK_Py_ISLINEFEED_Py_ISCARRIAGERETURN_PyUnicode_IsTitlecase_Py_ISLOWER_Py_ISUPPER_Py_TAB_Py_LINEFEED_Py_CARRIAGE_RETURN	_Py_SPACE_PyUnicode_IsAlpha_PyUnicode_IsNumeric_Py_ISALPHA_PyUnicode_IsDigit_PyUnicode_IsDecimalDigit)slicing)       c                   @   s   e Zd Zdd ZdS )UnicodeModelc              	   C   sV   dt jfdt jfdt jfdt jfdtfdt t jfdt jfg}tj	
| ||| d S )Ndatalengthkindis_asciihashmeminfoparent)r   voidptrintpint32uint32r   ZMemInfoPointerZpyobjectr   r   __init__selfZdmmZfe_typemembers rV   9/tmp/pip-unpacked-wheel-eu7e0c37/numba/cpython/unicode.pyrR   M   s    
zUnicodeModel.__init__N)__name__
__module____qualname__rR   rV   rV   rV   rW   rF   K   s   rF   rG   _datarH   _lengthrI   _kindrJ   	_is_asciirK   _hashc                       s   e Zd Z fddZ  ZS )UnicodeIteratorModelc                    s2   dt t jfd|jfg}tt| ||| d S )NindexrG   )r   ZEphemeralPointeruintprG   superr`   rR   rS   	__class__rV   rW   rR   d   s    zUnicodeIteratorModel.__init__)rX   rY   rZ   rR   __classcell__rV   rV   rd   rW   r`   b   s   r`   c                 C   s   ddl m}m}m}m}m}m}m}m}m	}	 t
d }
|||||||||||}||
}| }| }| }| }|| |	||	||	||	|}|dkrtd|j}|j}|j}|d t| }|| |}t|||||jfS )ztGet string data from a python string for use at compile-time to embed
    the string data into the LLVM module.
    r   )		CFUNCTYPEc_void_pc_intc_uint	c_ssize_tc_ubyte	py_objectPOINTERbyrefZextract_unicodeNz1cannot extract unicode data from the given string   )ctypesrg   rh   ri   rj   rk   rl   rm   rn   ro   r   
ValueErrorvalue_kind_to_byte_widthfrom_addressbytes)objrg   rh   ri   rj   rk   rl   rm   rn   ro   Zextract_unicode_fnprotofnrH   rI   rJ   hashvrG   nbytesoutrV   rV   rW   compile_time_get_string_datal   s(    ,  r}   c                 C   sz   t |\}}}}}|j}	| |	|}
t|| |}|
|_|j||_|j||_|j	||_	|j
d|_
| S )zf
    Get string data by `compile_time_get_string_data()` and return a
    unicode_type LLVM value
    )r}   moduleZinsert_const_bytesr   create_struct_proxyrG   rH   typerI   rJ   rK   	_getvalue)contextbuildertypZliteral_stringZ	databytesrH   rI   rJ   rz   modgvuni_strrV   rV   rW   make_string_from_constant   s    r   c                 C   s   t | |||jS N)r   Zliteral_value)r   r   ZfromtyZtotyvalrV   rV   rW   cast_from_literal   s       r   c                 C   s   t | |||S r   )r   )r   r   r   ZpyvalrV   rV   rW   constant_unicode   s    r   c                 C   s   |j |\}}}}}}t| |j|j}	||	_||	_||	_||	_	||	_
|j |||	_||	_t|j|j  }
t|	 |
dS )zE
    Convert a unicode str object to a native unicode structure.
    )is_error)pyapiZstring_as_string_size_and_kindr   r   r   r   rG   rH   rI   rJ   rK   Znrt_meminfo_new_from_pyobjectrL   rM   Zis_not_nullZerr_occurredr	   r   )r   rw   cokrG   rH   rI   rJ   rz   r   r   rV   rV   rW   unbox_unicode_str   s    
r   c                 C   sR   t | |j|j|d}|j|j|j|j}|j	| |jj
|j| | |S )z@
    Convert a native unicode structure to a unicode string
    rs   )r   r   r   r   r   Zstring_from_kind_and_datarI   rG   rH   Zobject_hashnrtZdecref)r   r   r   r   resrV   rV   rW   box_unicode_str   s      r   c                    s    fdd}|S )Nc                    s@   |\}}| |t  }||||g}||tdS N    )bitcastr   
as_pointerloadgepZzext)r   r   	signatureargsrG   idxptrchbitsizerV   rW   codegen   s    z#make_deref_codegen.<locals>.codegenrV   r   r   rV   r   rW   make_deref_codegen   s    r   c                 C   s   t t jt j}|tdfS NrD   r   rQ   rN   rO   r   	typingctxrG   offsetsigrV   rV   rW   deref_uint8   s    r   c                 C   s   t t jt j}|tdfS N   r   r   rV   rV   rW   deref_uint16   s    r   c                 C   s   t t jt j}|tdfS r   r   r   rV   rV   rW   deref_uint32   s    r   c                 C   s(   dd }t t jt jt jt j}||fS )zmake empty string with data buffer of size alloc_bytes.

    Must set length and kind values for string after it is returned
    c              	   S   s   |\}}}}t tj}|| |}	||||t|jd}
| j	||
|	_
||	_||	_||	_| td|	_| j||	j
|	_t |	jj|	_|	 S )Nrp   r~   )r   r   r   unicode_typemuladdr   r   r   Zmeminfo_allocrL   rI   rJ   rH   get_constantr   rK   Zmeminfo_datarG   get_null_valuerM   r   )r   r   r   r   Zkind_valZchar_bytes_valZ
length_valZis_ascii_valZuni_str_ctorr   Z
nbytes_valrV   rV   rW   details   s     

z_malloc_string.<locals>.details)r   r   rP   rO   rQ   )r   rI   Z
char_bytesrH   rJ   r   r   rV   rV   rW   _malloc_string   s    r   c                 C   s,   t | }t| |||}t||td |S Nr   )rt   r   _set_code_pointnprQ   )rI   rH   rJ   
char_widthsrV   rV   rW   _empty_string  s    r   F)Z_nrtc                 C   sJ   | j tkrt| j|S | j tkr,t| j|S | j tkrBt| j|S dS d S r   )r]   r   r   r[   r   r   r   r   )airV   rV   rW   _get_code_point  s    


r   c                    s    fdd}|S )Nc                    sT   |\}}} dk r"| |t }||t  }|||||g |  S r   )truncr   r   r   storer   Zget_dummy_value)r   r   r   r   rG   r   r   r   r   rV   rW   r   ,  s    
z!make_set_codegen.<locals>.codegenrV   r   rV   r   rW   make_set_codegen+  s    r   c                 C   s    t t jt jt j}|tdfS r   r   voidrN   Zint64rQ   r   r   rG   r   r   r   rV   rV   rW   	set_uint87  s    r   c                 C   s    t t jt jt j}|tdfS r   r   r   rV   rV   rW   
set_uint16=  s    r   c                 C   s    t t jt jt j}|tdfS r   r   r   rV   rV   rW   
set_uint32C  s    r   c                 C   sZ   | j tkrt| j|| n<| j tkr4t| j|| n"| j tkrNt| j|| ntdd S )Nz4Unexpected unicode representation in _set_code_point)	r]   r   r   r[   r   r   r   r   AssertionError)r   r   r   rV   rV   rW   r   I  s    


r   c                 C   sV   | t ks|t krtd| tkr$|S | tkr>|tkr8|S | S n| tkrJ| S tdd S )N!PY_UNICODE_WCHAR_KIND unsupportedz/Unexpected unicode representation in _pick_kind)r   r   r   r   r   )Zkind1Zkind2rV   rV   rW   
_pick_kind\  s    r   c                 C   s$   | dkr|dkrt dS t dS Nrp   r   )r   rQ   )Z	is_ascii1Z	is_ascii2rV   rV   rW   _pick_asciin  s    
r   c                 C   sB   | t krdS | tkrdS | tkr$dS | tkr6tdntdd S )Nrp         r   z'Unexpected unicode encoding encountered)r   r   r   r   r   )rI   rV   rV   rW   rt   u  s    
rt   c                 C   sz   |dkrdS || | j krdS || |j kr0dS t|D ]<}t| || }t||| }||k rf dS ||kr8 dS q8dS )Nr   r~   rp   )r\   ranger   )r   Za_offsetbZb_offsetnr   Za_chrZb_chrrV   rV   rW   _cmp_region  s    r   c                 C   s8   | dk rt S | dk rtS d}| |kr0d}t|tS dS )zK
    Compute the minimum unicode kind needed to hold a given codepoint
       i   rE   z;Invalid codepoint. Found value greater than Unicode maximumN)r   r   rr   r   )cpZMAX_UNICODEmsgrV   rV   rW   _codepoint_to_kind  s    r   c                 C   s   | dk S )z;
    Returns true if a codepoint is in the ASCII range
       rV   )r   rV   rV   rW   _codepoint_is_ascii  s    r   c                 C   s   t | tjrdd S d S )Nc                 S   s   | S r   rV   r   rV   rV   rW   <lambda>      zunicode_str.<locals>.<lambda>
isinstancer   UnicodeTyper   rV   rV   rW   unicode_str  s    r   c                 C   s   t | tjrdd }|S d S )Nc                 S   s   | j S r   )r\   r   rV   rV   rW   len_impl  s    zunicode_len.<locals>.len_implr   )r   r   rV   rV   rW   unicode_len  s    r   c                 C   s   | j r|j sd S t| tjr$| j}n| }t|tjr<|j}n|}tjtjtjf}t||}t||}|rx|rxdd }|S ||A rdd }|S d S )Nc                 S   sd   | d k}|d k}|s|r(|r$|r$dS dS t | } t |}t| t|krLdS t| d|dt| dkS )NTFr   )strlenr   )r   r   Za_noneZb_nonerV   rV   rW   eq_impl  s    zunicode_eq.<locals>.eq_implc                 S   s   dS NFrV   r   r   rV   rV   rW   r     s    )is_internalr   r   Optionalr   r   StringLiteralUnicodeCharSeq)r   r   Zcheck_aZcheck_baccept	a_unicode	b_unicoder   rV   rV   rW   
unicode_eq  s"    

r   c                 C   s`   | j r|j sd S tjtjtjf}t| |}t||}|rH|rHdd }|S ||A r\dd }|S d S )Nc                 S   s
   | |k S r   rV   r   rV   rV   rW   ne_impl  s    zunicode_ne.<locals>.ne_implc                 S   s   dS )NTrV   r   rV   rV   rW   r     s    zunicode_ne.<locals>.eq_impl)r   r   r   r   r   r   )r   r   r   r   r   r   r   rV   rV   rW   
unicode_ne  s    

r   c                 C   s<   t | tjtjf}t |tjtjf}|r8|r8dd }|S d S )Nc                 S   sJ   t t| t|}t| d|d|}|dkr.dS |dkrFt| t|k S dS )Nr   r~   TFminr   r   r   r   ZminlenZeqcoderV   rV   rW   lt_impl   s    zunicode_lt.<locals>.lt_implr   r   r   r   )r   r   r   r   r   rV   rV   rW   
unicode_lt  s
    r   c                 C   s<   t | tjtjf}t |tjtjf}|r8|r8dd }|S d S )Nc                 S   sJ   t t| t|}t| d|d|}|dkr.dS |dkrFt| t|kS dS )Nr   rp   TFr   r   rV   rV   rW   gt_impl  s    zunicode_gt.<locals>.gt_implr   )r   r   r   r   r   rV   rV   rW   
unicode_gt  s
    r   c                 C   s<   t | tjtjf}t |tjtjf}|r8|r8dd }|S d S )Nc                 S   s
   | |k S r   rV   r   rV   rV   rW   le_impl   s    zunicode_le.<locals>.le_implr   )r   r   r   r   r   rV   rV   rW   
unicode_le  s
    r   c                 C   s<   t | tjtjf}t |tjtjf}|r8|r8dd }|S d S )Nc                 S   s
   | |k  S r   rV   r   rV   rV   rW   ge_impl*  s    zunicode_ge.<locals>.ge_implr   )r   r   r   r   r   rV   rV   rW   
unicode_ge%  s
    r   c                 C   s(   t | tjr$t |tjr$dd }|S d S )Nc                 S   s   t | |dkS )Nr~   )_findr   rV   rV   rW   contains_impl2  s    z'unicode_contains.<locals>.contains_implr   )r   r   r  rV   rV   rW   unicode_contains/  s    r  c                 C   s^   | }t | tjr| j}nt | tjr*| j}tjtjf}|dk	rZt ||sZtd	||| dS )zCheck object belongs to one of specific types
    ty: type
        Type of the object
    name: str
        Name of the object
    N"{}" must be {}, not {})
r   r   Omittedrs   r   r   IntegerNoneTyper    format)tynamethetyacceptedrV   rV   rW   unicode_idx_check_type8  s    r  c                 C   s(   t | tjs$d|tj| }t|dS )z$Check object belongs to unicode typer  N)r   r   r   r  r    )r  r	  r   rV   rV   rW   unicode_sub_check_typeL  s    r  c                    s   d fdd	}|S )z%Generate finder either left or right.Nc                    sV   t | }t |}|d krd}|d kr(|}t|||\}}|| |k rHdS  | |||S )Nr   r~   )r   _adjust_indices)rG   substrstartendrH   
sub_length	find_funcrV   rW   implU  s    zgenerate_finder.<locals>.impl)NNrV   )r  r  rV   r  rW   generate_finderS  s    r  c                 C   sZ   t |dkr|S t|tt | |t | d D ]$}t| ||dt |dkr0|  S q0dS )zLeft finder.r   rp   r~   r   r   r   r   rG   r  r  r  r   rV   rV   rW   _finderf  s    $
r  c                 C   s\   t |dkr|S ttt | |t | |d dD ]$}t| ||dt |dkr2|  S q2dS )zRight finder.r   rp   r~   r  r  rV   rV   rW   _rfinderq  s    &
r  findc                 C   s<   t |tjrddd}|S t|d t|d t|d tS )zImplements str.find()Nc                 S   s   |  t|S r   )r  r   rG   r  r  r  rV   rV   rW   	find_impl  s    zunicode_find.<locals>.find_implr  r  r  )NN)r   r   r   r  r  r   )rG   r  r  r  r  rV   rV   rW   unicode_find  s    



r  rfindc                 C   s<   t |tjrddd}|S t|d t|d t|d tS )zImplements str.rfind()Nc                 S   s   |  t|S r   )r  r   r  rV   rV   rW   
rfind_impl  s    z!unicode_rfind.<locals>.rfind_implr  r  r  )NN)r   r   r   r  r  _rfind)rG   r  r  r  r   rV   rV   rW   unicode_rfind  s    



r"  rindexc                 C   s,   t |d t |d t|d ddd}|S )zImplements str.rindex()r  r  subNc                 S   s"   |  |||}|dk rtd|S Nr   zsubstring not found)r  rr   r   r$  r  r  resultrV   rV   rW   rindex_impl  s    z#unicode_rindex.<locals>.rindex_impl)NNr  r  )r   r$  r  r  r(  rV   rV   rW   unicode_rindex  s
    



r*  ra   c                 C   s,   t |d t |d t|d ddd}|S )zImplements str.index()r  r  r$  Nc                 S   s"   |  |||}|dk rtd|S r%  )r  rr   r&  rV   rV   rW   
index_impl  s    z!unicode_index.<locals>.index_impl)NNr)  )r   r$  r  r  r+  rV   rV   rW   unicode_index  s
    



r,  	partitionc                 C   sj   |}t |tjr|j}nt |tjr*|j}tjtjf}|dk	r^t ||s^dd||}t	|dd }|S )zImplements str.partition()Nr  sepc                 S   s   t |}t| jd| j}t|}| j|jk s8t| |k rB| ||fS |dkrRtd| |}|dk rn| ||fS | d| || || t|  fS Nr   empty separator)r   r   r]   r^   r   rr   r  rG   r.  Z	empty_str
sep_lengthposrV   rV   rW   r    s    


zunicode_partition.<locals>.impl
r   r   r  rs   r   r   r   r   r  r    rG   r.  r
  r  r   r  rV   rV   rW   unicode_partition  s    r6  countc                 C   sD   t | t | t|tjr*ddd}|S d}t|t|d S )Nc                 S   s   d}t | }t |}t||d}t|||}|| dk s@||krDdS | || } t | }d| }}|dkrr|d S || |kr| |||  |kr|d7 }||7 }qr|d7 }qr|S Nr   rp   )r   _normalize_slice_idx_count)srcr$  r  r  r7  Zsrc_lenZsub_lenrV   rV   rW   
count_impl  s$    


z!unicode_count.<locals>.count_implz+The substring must be a UnicodeType, not {})NN)_count_args_types_checkr   r   r   r    r  r   )r:  r$  r  r  r;  	error_msgrV   rV   rW   unicode_count  s    
r>  
rpartitionc                 C   sj   |}t |tjr|j}nt |tjr*|j}tjtjf}|dk	r^t ||s^dd||}t	|dd }|S )zImplements str.rpartition()Nr  r.  c                 S   s   t |}t| jd| j}t|}| j|jk s8t| |k rB||| fS |dkrRtd| |}|dk rn||| fS | d| || || t|  fS r/  )r   r   r]   r^   r   rr   r  r1  rV   rV   rW   r    s    


z unicode_rpartition.<locals>.implr4  r5  rV   rV   rW   unicode_rpartition  s    r@  
startswithc                 C   s4   t |tjrdd }|S t |tjr0dd }|S d S )Nc                 S   s   t | d|dt|dkS r   )r   r   r   rV   rV   rW   startswith_impl3  s    z+unicode_startswith.<locals>.startswith_implc                 S   s   |  t|S r   )rA  r   r   rV   rV   rW   rB  7  s    r   r   r   r   )r   r   rB  rV   rV   rW   unicode_startswith0  s    rD  c                 C   sL   || kr| }|dk r(|| 7 }|dk r(d}|dk rD|| 7 }|dk rDd}||fS r   rV   )rH   r  r  rV   rV   rW   r  =  s    r  endswithc                 C   s   |d ks&t |tjtjtjfs&td|d ksLt |tjtjtjfsLtdt |tjtjfrlddd}|S t |tjrddd}|S t |tj	rddd}|S d S )	Nz!The arg must be a Integer or Nonec                 S   s&   |D ]}|  |||dkr dS qdS )NTF)rE  )r   r  r  r  itemrV   rV   rW   endswith_implZ  s    z'unicode_endswith.<locals>.endswith_implc                 S   s   t | }t |}|d krd}|d kr(|}t|||\}}|| |k rHdS |dkrTdS | || } t | | }t| ||d|dkS )Nr   FT)r   r  r   )r   r  r  r  rH   r  r   rV   rV   rW   rG  c  s    c                 S   s   |  t|||S r   )rE  r   )r   r  r  r  rV   rV   rW   rG  y  s    )NN)NN)NN)
r   r   r  r  r  r    TupleZUniTupler   r   )r   r  r  r  rG  rV   rV   rW   unicode_endswithM  s&    


rI  
expandtabsrD   c                 C   sd   |}t |tjr|j}nt |tjr*|j}tjtf}|dk	rVt ||sVtd	||ddd}|S )zImplements str.expandtabs()Nz"tabsize" must be {}, not {}rD   c                 S   sf  t | }d }}d}t|D ]}t| |}|tkrrd}|dkr|||  }|tj| kr`td||7 }||7 }q|tjd krtd|d7 }|d7 }|ttfkrd}q|s| S t	| j
|| j}	d }}t|D ]}t| |}|tkr4|dkr`|||  }||7 }t||| D ]}
t|	|
t q||7 }q|d7 }t|	|| |d7 }|ttfkrd}q|	S )Nr   FTznew string is too longrp   )r   r   r   r9   sysmaxsizeOverflowErrorr:   r;   r   r]   r^   r   r<   )rG   tabsizerH   jZline_posfoundr   
code_pointincrr   r   rV   rV   rW   expandtabs_impl  sL    





z+unicode_expandtabs.<locals>.expandtabs_impl)rD   )
r   r   r  rs   r   r   r  intr    r  )rG   rN  r
  r  rS  rV   rV   rW   unicode_expandtabs  s    


.rU  splitr~   c                 C   s   |dks"t |tjtjtjfs"d S t |tjr<d	dd}|S t |tjrVd
dd}|S |d kszt |tjszt|ddd krddd}|S d S )Nr~   c                 S   s   | j t||dS )N)maxsplit)rV  r   )r   r.  rW  rV   rV   rW   
split_impl  s    z!unicode_split.<locals>.split_implc           
      S   s   t | }t |}|dkr tdg }d}d}|dkr~|dkr~t|d}t|D ],}t| ||krN|| ||  |d }qNnbd}	||k r|dks|	|k rt| ||d|dkr|| ||  ||7 }|}|	d7 }	q|d7 }q||kr|| |d   |S )Nr   r0  rp   r~   )r   rr   r   r   appendr   )
r   r.  rW  a_lensep_lenpartslastr   Zsep_code_pointsplit_countrV   rV   rW   rX    s4    


rs   Fc                 S   s   t | }g }d}d}d}d}t|D ]b}t| |}	t|	}
|rN|
rDq|}d}q$|
sTq$|| ||  d}|d7 }|dkr$||kr$ qq$||kr|s|| |d   |S )Nr   TFrp   r~   )r   r   r   r*   rY  )r   r.  rW  rZ  r\  r]  r   r^  Zin_whitespace_blockrQ  Zis_whitespacerV   rV   rW   split_whitespace_impl  s0    
z,unicode_split.<locals>.split_whitespace_impl)Nr~   )Nr~   )Nr~   )	r   r   r  r  ZIntegerLiteralr   r   r  getattr)r   r.  rW  rX  r_  rV   rV   rW   unicode_split  s"    

"
 ra  c                    s   d fdd	}|S )z@Generate whitespace rsplit func based on either ascii or unicodeNr~   c                    s  |dk rt j}g }t| d }|dkr|dkrLt| |} |sBqL|d8 }q&|dk rVq|}|d8 }|dkrt| |} |r~q|d8 }qb|| |d |d   |d8 }q|dkr|dkrt| |} |sq|d8 }q|dkr|| d|d   |d d d S Nr   rp   r~   )rK  rL  r   r   rY  )rG   r.  rW  r'  r   rQ  rO  isspace_funcrV   rW   rsplit_whitespace_impl  s<    






z?generate_rsplit_whitespace_impl.<locals>.rsplit_whitespace_impl)Nr~   rV   )rd  re  rV   rc  rW   generate_rsplit_whitespace_impl  s    &rf  rsplitc                 C   sh   dd }||dt jt jt jf ||dt jtf |dksLt|t jt jfrZddd}|S dd	d
}|S )zImplements str.unicode_rsplit()c                 S   sR   | }t | tjr| j}nt | tjr*| j}|dk	rNt ||sNtd||| dS )z.Check object belongs to one of specified typesNr  )r   r   r  rs   r   r   r    r  )r  r	  r  r
  rV   rV   rW   _unicode_rsplit_check_typeL  s    z2unicode_rsplit.<locals>._unicode_rsplit_check_typer.  rW  Nr~   c                 S   s   | j rt| ||S t| ||S r   )r^   ascii_rsplit_whitespace_implunicode_rsplit_whitespace_impl)rG   r.  rW  rV   rV   rW   re  a  s    z.unicode_rsplit.<locals>.rsplit_whitespace_implc                 S   s   t |}| j|jk s$t| t|k r*| gS dd }|dk r@tj}t|}|dkrXtd|dkrl|| ||S g }t| }|dkr| j|d|d}|dk rq|| || |  |}|d8 }qx|| d|  |d d d S )Nc                 S   s   g }t |d}t| d  }}|dkrx|dkrxt | |}||krn|| |d |d   |d  }}|d8 }|d8 }q|dkr|| d|d   |d d d S rb  )r   r   rY  )rG   r   rW  r'  Zch_code_pointr   rO  Zdata_code_pointrV   rV   rW   _rsplit_charn  s    


z9unicode_rsplit.<locals>.rsplit_impl.<locals>._rsplit_charr   r0  rp   )r  r  r~   )r   r]   r   rK  rL  rr   r  rY  )rG   r.  rW  rk  r2  r'  rO  r3  rV   rV   rW   rsplit_implh  s,    
z#unicode_rsplit.<locals>.rsplit_impl)Nr~   )Nr~   )r   r   r   r  r  rT  r   r  )rG   r.  rW  rh  re  rl  rV   rV   rW   unicode_rsplitH  s    


/rm  center c                 C   s^   t |tjstdt |tjr.ddd}|S |dksPt |tjtjfsPtdddd}|S )	NThe width must be an Integerro  c                 S   s   |  |t|S r   )rn  r   stringwidthfillcharrV   rV   rW   center_impl  s    z#unicode_center.<locals>.center_impl"The fillchar must be a UnicodeTypec           	      S   s   t | }t |}|dkr td||kr,| S || }|d ||@ d@  }|| }|| }||krl||  | S ||  ||  S d S )Nrp   5The fill character must be exactly one character longr   r   rr   )	rr  rs  rt  str_lenfillchar_lenZ	allmarginZlmarginZrmarginZl_stringrV   rV   rW   ru    s    )ro  )ro  r   r   r  r    r   r  r   )rr  rs  rt  ru  rV   rV   rW   unicode_center  s    

r|  c                    s   d fdd	}|S )Nro  c                    st   t |tjstdt |tjr@ r2d
dd}|S ddd}|S |dksbt |tjtjfsbtdd fdd		}|S )Nrp  ro  c                 S   s   |  |t|S r   )ljustr   rq  rV   rV   rW   
ljust_impl  s    z<gen_unicode_Xjust.<locals>.unicode_Xjust.<locals>.ljust_implc                 S   s   |  |t|S r   )rjustr   rq  rV   rV   rW   
rjust_impl  s    z<gen_unicode_Xjust.<locals>.unicode_Xjust.<locals>.rjust_implrv  c                    sP   t | }t |}|dkr td||kr,| S |||  } rD| | S ||  S d S )Nrp   rw  rx  )rr  rs  rt  ry  rz  newstrSTRING_FIRSTrV   rW   r    s    z6gen_unicode_Xjust.<locals>.unicode_Xjust.<locals>.impl)ro  )ro  )ro  r{  )rr  rs  rt  r~  r  r  r  rV   rW   unicode_Xjust  s    

z(gen_unicode_Xjust.<locals>.unicode_Xjust)ro  rV   )r  r  rV   r  rW   gen_unicode_Xjust  s    %r  r  r}  Tc                    s    fdd}|S )zDGenerate splitlines performer based on ascii or unicode line breaks.c           
         s   t | }g }d }}||k r||k rBt| |} |r8qB|d7 }q|}||k r|d |k rt| |}t| |d }	t|rt|	r|d7 }|d7 }|r|}|| ||  |}q|S r8  )r   r   r5   r4   rY  )
rG   keependsrH   r'  r   rO  rQ  eolZcur_cpZnext_cpis_line_break_funcrV   rW   r    s,    


z&generate_splitlines_func.<locals>.implrV   )r  r  rV   r  rW   generate_splitlines_func  s    r  
splitlinesc                 C   sl   |}t |tjr|j}nt |tjr*|j}tjttjt	f}|dk	r^t ||s^t
dd||ddd}|S )zImplements str.splitlines()Nr  r  Fc                 S   s   | j rt| |S t| |S r   )r^   _ascii_splitlines_unicode_splitlines)rG   r  rV   rV   rW   splitlines_impl&  s    
z+unicode_splitlines.<locals>.splitlines_impl)F)r   r   r  rs   r   r   r  rT  Booleanboolr    r  )rG   r  r
  r  r  rV   rV   rW   unicode_splitlines  s    
r  c                 C   s   t |}|dkrdS t | }|d | }| j}| j}|D ](}|t |7 }t||j}t||j}q8t|||}|d }	t|d|	dt |	 t |	}
td|D ]D}t||
| d| |
|7 }
|| }	t||
|	dt |	 |
t |	7 }
q|S )Nr    rp   )r   r]   r^   r   r   r   _strncpyr   )r.  r\  Z	parts_lenr[  rH   rI   rJ   pr'  part
dst_offsetr   rV   rV   rW   	join_list/  s,    r  joinc                 C   sv   t |tjrBt |jtjr&dd }|S t |jtjrrdd }|S n0t |tjrZdd }|S t |tjrrdd }|S d S )Nc                 S   s
   t | |S r   r  )r.  r\  rV   rV   rW   join_list_implT  s    z$unicode_join.<locals>.join_list_implc                 S   s   dd |D }t | |S )Nc                 S   s   g | ]}t |qS rV   r   .0r  rV   rV   rW   
<listcomp>Y  s     z8unicode_join.<locals>.join_list_impl.<locals>.<listcomp>r  )r.  r\  _partsrV   rV   rW   r  X  s    c                 S   s   dd |D }|  |S )Nc                 S   s   g | ]}|qS rV   rV   r  rV   rV   rW   r  `  s     z8unicode_join.<locals>.join_iter_impl.<locals>.<listcomp>)r  r.  r\  Z
parts_listrV   rV   rW   join_iter_impl_  s    z$unicode_join.<locals>.join_iter_implc                    s$    fddt t D }t| |S )Nc                    s   g | ]} | qS rV   rV   )r  r   r\  rV   rW   r  f  s     z7unicode_join.<locals>.join_str_impl.<locals>.<listcomp>)r   r   r  r  rV   r  rW   join_str_imple  s    z#unicode_join.<locals>.join_str_impl)r   r   Listdtyper   r   ZIterableType)r.  r\  r  r  r  rV   rV   rW   unicode_joinO  s    r  zfillc                 C   s    t |tjstddd }|S )Nz<width> must be an Integerc                 S   sZ   t | }||kr| S |r | d nd}d||  }|dkrN|| | dd   }n||  }|S )Nr   r  0)+-rp   r   )rr  rs  ry  
first_charpaddingr  rV   rV   rW   
zfill_implp  s    z!unicode_zfill.<locals>.zfill_impl)r   r   r  r    )rr  rs  r  rV   rV   rW   unicode_zfillk  s    r  c                 C   s^   t | }d}|d k	r8t|D ]}| | |kr|  S qn"t|D ]}t| | s@|  S q@|S r   r   r   r*   rr  charsry  r   rV   rV   rW   unicode_strip_left_bound  s    
r  c                 C   sv   t | }d}|d k	rDt|d ddD ]}| | |kr$|d7 } qrq$n.t|d ddD ]}t| | sT|d7 } qrqT|S rb  r  r  rV   rV   rW   unicode_strip_right_bound  s    r  c                 C   s<   t | tjr| j} | d ks8t | tjtjtjfs8tdd S )Nz%The arg must be a UnicodeType or None)r   r   r   r   r  r   r  r    )r  rV   rV   rW   unicode_strip_types_check  s    r  c                 C   s<   t | tjr| j} | d ks8t | tjtjtjfs8tdd S )Nz,The slice indices must be an Integer or None)r   r   r   r   r  r  r  r    )argrV   rV   rW   r<    s    r<  lstripc                 C   s0   t |tjrddd}|S t| ddd}|S )Nc                 S   s   |  t|S r   )r  r   rr  r  rV   rV   rW   lstrip_impl  s    z#unicode_lstrip.<locals>.lstrip_implc                 S   s   | t | |d  S r   )r  r  rV   rV   rW   r    s    )N)Nr   r   r   r  )rr  r  r  rV   rV   rW   unicode_lstrip  s    

r  rstripc                 C   s0   t |tjrddd}|S t| ddd}|S )Nc                 S   s   |  t|S r   )r  r   r  rV   rV   rW   rstrip_impl  s    z#unicode_rstrip.<locals>.rstrip_implc                 S   s   | d t | | S r   )r  r  rV   rV   rW   r    s    )N)Nr  )rr  r  r  rV   rV   rW   unicode_rstrip  s    

r  stripc                 C   s0   t |tjrddd}|S t| ddd}|S )Nc                 S   s   |  t|S r   )r  r   r  rV   rV   rW   
strip_impl  s    z!unicode_strip.<locals>.strip_implc                 S   s    t | |}t| |}| || S r   )r  r  )rr  r  ZlbrbrV   rV   rW   r    s    

)N)Nr  )rr  r  r  rV   rV   rW   unicode_strip  s    

r  c                 C   sB   | dkr|rdS |S n| dk r&| |7 } | dk s6| |kr>t d| S )a%  
    Parameters
    ----------
    idx : int or None
        the index
    length : int
        the string length
    is_start : bool; optional with defaults to True
        Is it the *start* or the *stop* of the slice?

    Returns
    -------
    norm_idx : int
        normalized index
    Nr   zstring index out of range)
IndexError)r   rH   Zis_startrV   rV   rW   normalize_str_idx  s    r  c                 C   s>   | dkr|S | |   kr"|k r.n n| | S | dk r:dS | S )a%  
    Used for unicode_count

    If arg < -slice_len, returns 0 (prevents circle)

    If arg is within slice, e.g -slice_len <= arg < slice_len
    returns its real index via arg % slice_len

    If arg > slice_len, returns arg (in this case count must
    return 0 if it is start index)
    Nr   rV   )r  Z	slice_lendefaultrV   rV   rW   r9    s
    r9  c                 C   s   |||}dd }||fS )zFix slice object.
    c           	      S   sF   |j \}}|\}}| |||}t| ||| t||| | S r   )r   make_helperrB   Zguard_invalid_sliceZ	fix_slicer   )	r   r   r   r   	slicetypeZ
lengthtypesliceobjrH   slicerV   rV   rW   r   )  s    
z!_normalize_slice.<locals>.codegenrV   )r   r  rH   r   r   rV   rV   rW   _normalize_slice#  s    
r  c                 C   s   t |}dd }||fS )z2Compute the span from the given slice object.
    c                 S   s,   |j \}|\}| |||}t||}|S r   )r   r  rB   Zget_slice_length)r   r   r   r   r  r  r  Zresult_sizerV   rV   rW   r   :  s
    z_slice_span.<locals>.codegen)r   rO   )r   r  r   r   rV   rV   rW   _slice_span4  s    
r  c           
      C   st   |j | j krHt|j }|| }|| }|| }t| j||j||dd n(t|D ]}	t| ||	 t|||	  qPd S )Nrp   )Zalign)r]   rt   r   r[   r   r   r   )
dstr  r:  Z
src_offsetr   
byte_widthZsrc_byte_offsetZdst_byte_offsetr{   r   rV   rV   rW   r  D  s    
  
r  c                 C   s2   |t jkstdd }t t jt jt j}||fS )z_Create a slice of a unicode string using a view of its data to avoid
    extra allocation.
    c                 S   s   |\}}}t tj| ||d}t tj| |}|j|_|j|_|j|_||_| t	d|_
| jt}	|	| jtjfi }
| |	|
}|||jf}|||}||j|g|_t |jj|_| jr| j||jd | | S )Nr   r~   r   )r   r   r   r   rL   rI   rJ   rH   r   r   rK   typing_contextresolve_value_typert   get_call_typerP   get_functionr   r   rG   r   rM   r   
enable_nrtr   increfr   r   )r   r   r   r   r:  r  rH   in_strZview_strZbw_typZbw_sigZbw_implr  r   rV   rV   rW   r   Z  sB    
     z$_get_str_slice_view.<locals>.codegen)r   r   r   rO   )r   Zsrc_tZstart_tZlength_tr   r   rV   rV   rW   _get_str_slice_viewS  s    r  c                 C   s@   t | tjr<t |tjr$dd }|S t |tjr<dd }|S d S )Nc                 S   sD   t |t| }t| |}t|}t|}t|d|}t|d| |S r   )r  r   r   r   r   r   r   )r   r   r   rI   rJ   retrV   rV   rW   getitem_char}  s    
z%unicode_getitem.<locals>.getitem_charc                 S   s   t |t| }t|}t| |j}t|}t|}t|j|j |j	|jD ]4}t| |}|t|M }t|}||krJt
||}qJ|jdkr|| jkrt| |j|S t|||}	|j}
t|D ] }t|	|t| |
 |
|j7 }
q|	S d S )Nrp   )r  r   r  r   r  r   r   r   stepstopr   r]   r  r   r   )r   r   Z	slice_idxspanr   rI   rJ   r   new_kindr  currV   rV   rW   getitem_slice  s,     
z&unicode_getitem.<locals>.getitem_slice)r   r   r   r  Z	SliceType)r   r   r  r  rV   rV   rW   unicode_getitemy  s    $r  c                 C   sL   t | tjr$t |tjr$dd }|S t | tjrHt |tjrHdd }|S d S )Nc                 S   s   | j |j  }t| j|j}t| j|j}t|||}tt| D ]}t||t	| | q@tt|D ]}t|t| | t	|| qd|S r   )
r\   r   r]   r   r^   r   r   r   r   r   )r   r   
new_lengthr  Z	new_asciir'  r   rO  rV   rV   rW   concat_impl  s    z#unicode_concat.<locals>.concat_implc                 S   s   | t | S r   r  r   rV   rV   rW   r    s    rC  )r   r   r  rV   rV   rW   unicode_concat  s    
r  c                 C   s   | dks|dk rdS |dkr | S | j | }| j}t||| j}t| }t|d| d| |}d| |krt|||d| |d9 }qZd| |ks|| }t||||| | |S d S )Nr  rp   r   r   )r\   r]   r   r^   r   r  )Zstr_argZmult_argr  r  r'  Zlen_aZ	copy_sizerestrV   rV   rW   _repeat_impl  s"    

r  c                 C   sL   t | tjr$t |tjr$dd }|S t | tjrHt |tjrHdd }|S d S )Nc                 S   s
   t | |S r   r  r   rV   rV   rW   wrap  s    zunicode_repeat.<locals>.wrapc                 S   s
   t || S r   r  r   rV   rV   rW   r    s    )r   r   r   r  )r   r   r  rV   rV   rW   unicode_repeat  s    r  c                 C   s   t | tjrdd }|S d S )Nc                 S   s   t | dkS r   r  r   rV   rV   rW   r    s    zunicode_not.<locals>.implr   r   r  rV   rV   rW   unicode_not  s    r  replacec                 C   s   |}t |tjr|j}nt |tjr*|j}t |ttjfsHtd	|t |tj
tjfshtd	|t |tj
std	|ddd}|S )NzGUnsupported parameters. The parameters must be Integer. Given count: {}z+The object must be a UnicodeType. Given: {}r~   c           	      S   s   |dkr| S |dkrt | }|dkr6||| | S |g}tt||}t|D ]F}|||  |d |kr||| qR|d||d d   qR|t|kr|| d|S | ||}||}|S )Nr   r  r~   rp   )listr  r   r   r   rY  rV  )	r   old_strnew_strr7  ZscharsZsplit_resultZ	min_countr   r'  rV   rV   rW   r    s&    


zunicode_replace.<locals>.impl)r~   )r   r   r  rs   r   r   rT  r  r    r  r   r  )r   r  r  r7  r
  r  rV   rV   rW   unicode_replace  s&    
r  c                    s    fdd}|S )Nc                    s    fdd}|S )Nc                    s   t | }|dkrdS |dkr<t| d}| jr4 |S |S | jrht|D ]}t| |} |sJ dS qJt|D ]}t| |}|sp dS qpdS )Nr   Frp   T)r   r   r^   r   )rG   rH   rQ  r   
ascii_funcunicode_funcrV   rW   r  -  s$    


z.gen_isAlX.<locals>.unicode_isAlX.<locals>.implrV   rG   r  r  rV   rW   unicode_isAlX+  s    z gen_isAlX.<locals>.unicode_isAlXrV   )r  r  r  rV   r  rW   	gen_isAlX*  s    r  isalphac                 C   s   t | pt| S r   )r>   r=   xrV   rV   rW   r   N  s    r   isalnumc                    s    fdd}|S )Nc                    sp   t | }|dkrt| dS |dkr*dS d}t|D ]4}t| |} |sT|rZ dS |s6|r6d}q6|S Nrp   r   FTr   r   r   )r   lcasedr   rQ  is_loweris_titleis_upperrV   rW   r  \  s    
z_is_upper.<locals>.implrV   )r  r   r  r  rV   r  rW   	_is_upperW  s    r  c                 C   s   dS r   rV   r  rV   rV   rW   r   m  r   isupperc                 C   s   dd }|S )z
    Implements .isupper()
    c                 S   s   | j rt| S t| S d S r   )r^   _ascii_is_upper_unicode_is_upperr  rV   rV   rW   r  z  s    zunicode_isupper.<locals>.implrV   r  rV   rV   rW   unicode_isupperu  s    r  )rC      isasciic                 C   s   dd }|S )z Implements UnicodeType.isascii()c                 S   s   | j S r   )r^   rG   rV   rV   rW   r    s    zunicode_isascii.<locals>.implrV   r  rV   rV   rW   unicode_isascii  s    r	  istitlec                 C   s   dd }|S )z
    Implements UnicodeType.istitle()
    The algorithm is an approximate translation from CPython:
    https://github.com/python/cpython/blob/1d4b6ba19466aba0eb91c4ba01ba509acf18c723/Objects/unicodeobject.c#L11829-L11885 # noqa: E501
    c                 S   s   t | }|dkr*t| d}t|p(t|S |dkr6dS d}d}t|D ]R}t| |}t|sdt|rx|rn dS d}d}qFt|r|s dS d}d}qFd}qF|S r  )r   r   r0   r6   r   r1   )rG   rH   charr  previous_is_casedr   rV   rV   rW   r    s,    

zunicode_istitle.<locals>.implrV   r  rV   rV   rW   unicode_istitle  s    r  islowerc                 C   s   dd }|S )aP  
    impl is an approximate translation of:
    https://github.com/python/cpython/blob/201c8f79450628241574fba940e08107178dc3a5/Objects/unicodeobject.c#L11900-L11933    # noqa: E501
    mixed with:
    https://github.com/python/cpython/blob/201c8f79450628241574fba940e08107178dc3a5/Objects/bytes_methods.c#L131-L156    # noqa: E501
    c                 S   sp   t | }|dkrtt| dS |dkr*dS d}t|D ]4}t| |}t|sTt|rZ dS |s6t|r6d}q6|S r  )r   r1   r   r   r0   r6   )rG   rH   r  r   r   rV   rV   rW   r    s    
zunicode_islower.<locals>.implrV   r  rV   rV   rW   unicode_islower  s    	r  isidentifierc                 C   s   dd }|S )z%Implements UnicodeType.isidentifier()c                 S   s^   t | }|dkrdS t| d}t|s2|dkr2dS td|D ]}t| |}t|s< dS q<dS )Nr   F_   rp   T)r   r   r,   r   r-   )rG   rH   Zfirst_cpr   rQ  rV   rV   rW   r    s    

z"unicode_isidentifier.<locals>.implrV   r  rV   rV   rW   unicode_isidentifier  s    r  c                    s    fdd}|S )Nc                    s    fdd}|S )Nc                    sX   t | }|dkr t| dS r.|dkr.dS t|D ]}t| |} |s6 dS q6dS r  r  )rG   rH   r   rQ  _PyUnicode_IS_funcempty_is_falserV   rW   r    s    
z*gen_isX.<locals>.unicode_isX.<locals>.implrV   r  r  rV   rW   unicode_isX  s    zgen_isX.<locals>.unicode_isXrV   )r  r  r  rV   r  rW   gen_isX  s    r  isspace	isnumericisdigit	isdecimalisprintablec                    s    fdd}|S )z)Generate common case operation performer.c           	         s   t | }|dkr t| j|| jS | jrBt| j|d} | | |S ttd| | j}dg}| |||}|d }t|}t||t|}t|D ]}t||t	|| q|S )Nr   rp   rC   )
r   r   r]   r^   r   r   r   r   r   r   )	rG   rH   r   tmpmaxcharsZ	newlengthmaxcharZnewkindr   r  rV   rW   r    s     
zcase_operation.<locals>.implrV   )r  r  r  rV   r  rW   case_operation  s    r   c                 C   s   d}|d }|dkr2t | |}t|s(q2|d8 }q|dko@t|}|r|d }||k rtt | |}t|sjqt|d7 }qN||kpt| }|rdS dS )zEThis is a translation of the function that handles the capital sigma.r   rp   i  i  )r   r/   r.   )rG   rH   r   r   rO  Zfinal_sigmarV   rV   rW   _handle_capital_sigma/  s"    



r!  c                 C   s&   | dkrt ||||d< dS t| |S )z>This is a translation of the function that lowers a character.i  r   rp   )r!  r&   )rQ  rG   rH   r   mappedrV   rV   rW   _lower_ucs4G  s    r#  c                    s    fdd}|S )Nc           
         s   d}t |D ]t}tjdtd}t| |} r>t|| |||}n
t||}|d | D ]*}	t|d |	|d< t|||	 |d7 }qTq|S Nr   rC   r  rp   )	r   r   zerosr#   r   r#  r%   maxr   )
rG   rH   r   r  kr   r"  rQ  n_resmlowerrV   rW   _do_upper_or_lowerR  s    

z7_gen_unicode_upper_or_lower.<locals>._do_upper_or_lowerrV   )r,  r-  rV   r+  rW   _gen_unicode_upper_or_lowerQ  s    r.  c                    s    fdd}|S )Nc                    s0   t t| D ]}t| |}t|| | qd S r   )r   r   r   r   rG   r   r   rQ  funcrV   rW   _ascii_upper_or_loweri  s    
z8_gen_ascii_upper_or_lower.<locals>._ascii_upper_or_lowerrV   )r1  r2  rV   r0  rW   _gen_ascii_upper_or_lowerh  s    r3  r,  c                 C   s
   t ttS )zImplements .lower())r   _ascii_lower_unicode_lowerr  rV   rV   rW   unicode_lowert  s    r6  upperc                 C   s
   t ttS )zImplements .upper())r   _ascii_upper_unicode_upperr  rV   rV   rW   unicode_upperz  s    r:  c                 C   s~   d}t jdtd}t|D ]^}|d t| |}t||}|d | D ].}	|d }
t|
|	|d< t|||	 |d7 }qHq|S r$  )	r   r&  r#   r   fillr   r'   r'  r   )rG   rH   r   r  r(  r"  r   rQ  r)  r*  r  rV   rV   rW   _unicode_casefold  s    


r<  c                 C   s0   t t| D ]}t| |}t||t| qd S r   )r   r   r   r   r"   r/  rV   rV   rW   _ascii_casefold  s    
r=  casefoldc                 C   s
   t ttS )zImplements str.casefold())r   r=  r<  r  rV   rV   rW   unicode_casefold  s    r?  c                 C   s   d}d}t jdtd}t| d}tr0t||}n
t||}|d | D ]"}	t||	}t|||	 |d7 }qFt	d|D ]X}
|
d t| |
}t|| ||
|}|d | D ]"}	t||	}t|||	 |d7 }qqt||d< |S r$  )r   r&  r#   r   _py38_or_laterr(   r%   r'  r   r   r;  r#  )rG   rH   r   r  r(  r  r"  rQ  r)  r*  r   rV   rV   rW   _unicode_capitalize  s*    






rA  c                 C   sL   t | d}t|dt| tdt| D ]}t | |}t||t| q(d S r8  )r   r   r!   r   r   r"   )rG   r   rQ  r   rV   rV   rW   _ascii_capitalize  s
    

rB  
capitalizec                 C   s
   t ttS r   )r   rB  rA  r  rV   rV   rW   unicode_capitalize  s    rD  c                 C   s   d}d}t jdtd}t|D ]}|d t| |}|rLt|| |||}	ntt||}	|d|	 D ],}
|\}t||
|d< t	|||
 |d7 }qft
t|}q|S )zCThis is a translation of the function that titles a unicode string.r   FrC   r%  Nrp   )r   emptyr#   r   r;  r   r#  r(   r'  r   r.   )rG   rH   r   r  r(  Zprevious_casedr"  r   rQ  r)  r*  r  rV   rV   rW   _unicode_title  s     


rF  c                 C   sh   d}t t| D ]R}t| |}t|r8|s2t|}d}nt|rR|rLt|}d}nd}t||| qdS )z" Does .title() on an ASCII string FTN)r   r   r   r7   r!   r8   r"   r   )rG   r   r  r   rQ  rV   rV   rW   _ascii_title  s    
rG  titlec                 C   s
   t ttS )zImplements str.title())r   rG  rF  r  rV   rV   rW   unicode_title  s    rI  c                 C   sN   t t| D ]<}t| |}t|r,t|}nt|r<t|}t||| qd S r   )r   r   r   r8   r"   r7   r!   r   r/  rV   rV   rW   _ascii_swapcase	  s    

rJ  c                 C   s   d}d}t jdtd}t|D ]}|d t| |}t|rPt|| |||}	n t|rdt	||}	nd}	||d< |d |	 D ]"}
t
||
}t|||
 |d7 }q|q||d< |S r$  )r   rE  r#   r   r;  r   r0   r#  r1   r%   r'  r   )rG   rH   r   r  r(  r  r"  r   rQ  r)  r*  rV   rV   rW   _unicode_swapcase	  s$    


rK  swapcasec                 C   s
   t ttS r   )r   rJ  rK  r  rV   rV   rW   unicode_swapcase$	  s    rM  c                 C   s   t | tjrdd }|S d S )Nc                 S   s"   t | }|dkrtdt| dS )Nrp   zord() expected a characterr   )r   	TypeErrorr   )r   lcrV   rV   rW   r  -	  s    zol_ord.<locals>.implr   )r   r  rV   rV   rW   ol_ord*	  s    rP  c                 C   s4   | t kstt| }t|d|tk}t|d|  |S r   )_MAX_UNICODEr   r   r   r   r   )r   rI   r  rV   rV   rW   _unicode_char<	  s
    rR  zchr() arg not in range(0x%hx)c                 C   s$   | dk s| t krtttt| S r   )rQ  rr   _out_of_range_msgrR  r#   )ZordinalrV   rV   rW   _PyUnicode_FromOrdinalI	  s    rT  c                 C   s   t | tjrdd }|S d S )Nc                 S   s   t | S r   )rT  )r   rV   rV   rW   r  U	  s    zol_chr.<locals>.implr   r   r  )r   r  rV   rV   rW   ol_chrR	  s    rV  c                    s(   t | tjr$| d  fdd}|S d S )N
   c           	         s   d}| dk r|  } d}| dkr"dS |d t tt|  }t}t|}t|||d}|rlt|dtd |d }| dkrt	|  \} }td| }t||| |d8 }qt|S )NFr   Tr  rp   r  )
rT  r   floorlog10r   rt   r   r   orddivmod)	r   flagrH   rI   r   r   r   digitr   ZtenrV   rW   r  `	  s&    
zinteger_str.<locals>.implrU  )r   r  rV   r^  rW   integer_strZ	  s    r_  c                 C   s   t | tjrdd S d S )Nc                 S   s   | rdS dS )NTrueFalserV   r   rV   rV   rW   r   z	  r   zboolean_str.<locals>.<lambda>)r   r   r  rb  rV   rV   rW   boolean_strw	  s    rc  Zgetiterc           
      C   sp   |j \}|\}| ||j}| tjd}t||}||_||_	| j
rX| j||| | }	t| ||j|	S r   )r   r  return_typer   r   rb   r   Zalloca_once_valuera   rG   r  r   r  r   r   )
r   r   r   r   r  rG   iterobjZzeroZindexptrr   rV   rV   rW   getiter_unicode	  s    rf  Ziternextc              	   C   s   |j \}|\}| j}|tj}||tjtjfi }	| 	||	}
|t
}||tjfi }| 	||}| j|||d}|||jf}||j}|d||}|| ||: |
||j|f}|| t||}|||j W 5 Q R X d S )Nr   <)r   r  r  operatorgetitemr  r   r   rb   r  r   r  rG   r   ra   Zicmp_unsignedZ	set_validZif_thenZyield_r   Zincrement_indexr   )r   r   r   r   r'  ZitertyiterZtyctxZfntyZgetitem_sigZgetitem_implZlen_sigr   re  Zstrlenra   Zis_validZgotitemZnindexrV   rV   rW   iternext_unicode	  s*    


rk  )r   )NN)NN)NN)NN)NN)NN)rD   )Nr~   )Nr~   )ro  )F)N)N)N)T)r~   )T)rK  rh  Znumpyr   Zllvmlite.irr   r   Znumba.core.extendingr   r   r   r   r   r	   r
   r   r   r   Znumba.core.imputilsr   r   r   r   r   r   Znumba.core.datamodelr   r   Z
numba.corer   r   r   Znumba.core.pythonapir   r   r   r   Znumba._helperlibr   Znumba.cpython.hashingr   Znumba.core.unsafe.bytesr   Znumba.core.errorsr    Znumba.cpython.unicode_supportr!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   Znumba.cpythonrB   Z	PYVERSIONr@  rQ  r   rF   ZUnicodeIteratorTyper`   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rt   r   r   r   r   r   r   r   eqr   ner   ltr   gtr   ler   ger   containsr  r  r  r  r  r  r   r!  r  r"  r*  r,  r6  r>  r@  rD  r  rI  rU  ra  rf  rj  ri  rm  r|  r  r  r  r  r  r  r  r  r  r  r  r<  r  r  r  r  r9  r  r  r  r  ri  r  r   iaddr  r  r   r  not_r  r  r  Z_unicode_is_alnumr  Z_always_falser  r  r  r	  r  r  r  r  r   r!  r#  r.  r9  r5  r3  r8  r4  r6  r:  r<  r=  r?  rA  rB  rD  rF  rG  rI  rJ  rK  rM  rZ  rP  rR  rS  rT  chrrV  r_  rc  rf  ZNEWrk  rV   rV   rV   rW   <module>   s.  0 
	























&



	
	










#
$

#



1
@
T,
Q
%)#







		







%
9



1!





%





	

		

