
    ?eFA                     j   d dl mZ d dlmZmZmZmZ d Zd Zd Z		 ddZ
d Zd	 Zej        ej        ej        ej        ej        ej        fZej        ej        ej        ej        fZej        ej        ej        ej        ej        ej        ej        ej         ej!        ej"        ej#        ej$        fZ%ej&        ej'        fZ(ej)        ej*        fZ+ej        ej        ej        ej        ej         ej!        ej#        ej$        ej        ej        f
Z,ej-        ej"        ej        ej        fZ.ddZ/d Z0ddZ1d Z2dS )   )
ScopedName)ArgumentType
CachedName	IfaceFileIfaceFileTypec                 R    |j         | u rdS || v rdS |                     |           dS )z/ Append an IfaceFile object to a list of them. N)usedappend)iface_file_list
iface_files     8lib/python3.11/site-packages/sipbuild/generator/utils.pyappend_iface_filer      sB     /)) _$$:&&&&&    c                    | j         | j         j        r| j        t          j        u rqt          | j        j                  }|dz  }d}| j        j        j	        D ]}|r|dz  }nd}|t          |          z  }|                    d          r|dz  }|dz  }n| j        t          j        t          j        fv rt          | j                  }nQ| j        t          j        t          j        fv rd}n.| j        t          j        t          j        t          j        t          j        t          j        fv rd	}n| j        t          j        t          j        fv rd
}n| j        t          j        u rd}n| j        t          j        u rd}n| j        t          j        u rd}n| j        t          j        u rd}nk| j        t          j        t          j        fv rd}nH| j        t          j        u rd}n1| j        t          j        u rd}n| j        t          j        u rd}n| j        t          j         u rd}n| j        t          j!        t          j"        fv rd}n| j        t          j#        t          j$        fv rd}n| j        t          j%        t          j&        fv rd}n| j        t          j'        u rd}nq| j        t          j(        u rd}n[| j        t          j)        u rd}nE| j        t          j*        u rd}n/| j        t          j+        u rd}nt          | j         j,                  }|-                    d          r
|dd         }| j.        D ]}|dz  }| j/        r|dz  }|S ) z6 Convert an Argument object to a string of valid C++. N<F,T> zunsigned charcharzsigned charwchar_tzunsigned shortshortuintintzunsigned longlongzunsigned long longz	long longfloatdoubleboolvoidzvoid *
Py_ssize_tsize_t	Py_hash_tz::   *&)0original_typedefno_type_nametyper   TEMPLATEstr
definitioncpp_nametypesargsargument_as_strendswithSTRUCTDEFINEDUBYTEUSTRINGBYTESTRINGASCII_STRINGLATIN1_STRINGUTF8_STRINGSBYTESSTRINGWSTRINGUSHORTSHORTUINTINTCINTULONGLONG	ULONGLONGLONGLONGFLOATCFLOATDOUBLECDOUBLEBOOLCBOOLVOIDCAPSULESSIZESIZEHASHfq_cpp_name
startswithderefsis_reference)args
need_commasub_arg_s        r   r.   r.   *   sl    #s';'H#8|,,,CN+,,AHAJ>/4 . . &HAA!%J_W---zz# SHAAX,-|/CDDDCN##AAX,,l.BCCCAAX,+\-@,B[]i]w  zF  zR  S  S  SAAX,,l.BCCCAAX---AAX,,, AAX+++AAX***AAX,*L,=>>>AAX+++AAX***AAX///$AAX...AAX,,l.ABBBAAX,-|/CDDDAAX,+\-?@@@AAX***AAX---AAX+++AAX***AAX***A $011 	||D abbEZ  	S
 	SHr   c                     | j                             t          |          g           }|D ]}|j        |k    r|c S t	          |          }|                    |           |S )zB Add a name to the cache if necessary and return the cached name. )
name_cache
setdefaultlennamer   r
   )specr]   linends       r   cached_namera      sn    
 ?%%c$ii44D   7d??III  
D		BKKOOOIr   Nc           	         | j         D ])}|j                            ||          s |j        |ur,|t          j        us|j        t          j        ur |d           |t          j        u r1|j        *|j        |ur!| j        D ]}|j	        |u r	|j
        }	 nd}	|	r|t          j        k    rj|j        |ura| j        D ]W}
|
j	        |ur|j        t          j        us-|
j        j        t          j        ust          ||
j                  r |d           X|t          j        u r|j        |ur'|c S t#          ||          }t%          |t'          | t)          |                    |          }| j                             d|           |S )zf Return an interface file for a fully qualified C/C++ name and type
    creating it if necessary.
    )scopezXa class, exception, namespace or mapped type has already been defined with the same nameNFz:the mapped type has already been defined in another module)r+   rP       )iface_filesrP   matchesr'   r   	EXCEPTIONCLASSmoduleclassesr   externalMAPPED_TYPEmapped_typesr   r(   same_base_type	NAMESPACEnormalised_scoped_namer   ra   r)   insert)r^   modrP   iface_file_typeerror_loggercpp_typerc   iffcdrk   mtds              r   find_iface_filery      s     / /&&{%&@@ 	
 8?**m&===Q^QdAdAdrt t t m111cj6LQTQ[cfQfQfl ! !=C''!{HE ( ! 
 m777CJc<Q<Q( Z Z>,,=(===HM)>>>"8SX66 ? LXZ Z Z  m555#*C:O:O


 )e<<K
O$T3{+;+;<<') ) )C
 	As###Jr   c                 B    | j         D ]}|j        j        |k    r|c S dS )z[ Return the Member object for a named member of a class or None if there
    was none.
    N)memberspy_namer]   )klassr]   members      r   find_methodr      s:    
 -  >$&&MMM ' 4r   c                 ^   t          |           }|j        rn||                                 n~|j        r |                    |j        j                   nW|d         }|j        j        }|-|j        |k    r|d= |                    |           n|j        }|-|                                 |S )z2 Convert a scoped name to a fully qualified name. Nrd   )	r   is_absolutemake_absolute	is_simpleprependr   rP   	base_namerc   )scoped_namerc   fq_scoped_namenames_scopescope_fq_cpp_names        r   rp   rp      s      ,,N! +	$$&&&&		! +u/;<<<< %Q'!,8+ *k99"1%&&'8999 1 7  + ((***r   Tc                    |j         |j         k    rdS t          |j                  t          |j                  k    rdS |r"|j        |j        k    rdS t	          ||          S |j        t          v r|j        t          v r|j        |j        u S | j        dk    r_|j        t          v r!|j        t          j
        u r|j        j        dS |j        t          j
        u r|j        j        |j        t          v rdS nT|j        t          v r|j        t          j
        u r	|j        sdS |j        t          j
        u r|j        s|j        t          v rdS |j        t          v r|j        t          v rdS |j        t          v r|j        t          v rdS |j        t          v r|j        t          v rdS |j        t           v r|j        t           v rdS |j        t"          v r|j        t"          v rdS |j        t$          v r|j        t$          v rdS t	          ||          S )z Compare two argument types and return True if they are the same.
    'strict' means as C++ would see it, rather than Python.
    F)   rd   NT)rS   r\   rR   is_constrn   r'   _PY_CONSTRAINEDabi_version_PY_INTr   ENUMr*   rP   is_constrained
_PY_STRING	_PY_FLOAT_PY_LONG	_PY_ULONG_PY_AUTO)r^   arg1arg2stricts       r   same_argument_typer   )  s#   
 D---u
4;3t{++++u *=DM))5dD))) yO##	_(D(DyDI%%7""9DI1B$B$BtGbGj49)))do.I.QVZV_cjVjVj4 9DI1B$B$B4K^$B49)))$2E)$)W^J^J^4 yJ49
#:#:t yI$)y"8"8t yG	W 4 4t yHh!6!6t yI$)y"8"8t yHh!6!6t $%%%r   c                    | j         |j         ur| j         t          j        u r<|j         t          j        u r)| j        j        j                            |j                  S | j         t          j        u r<|j         t          j        u r)|j        j        j                            | j                  S | j         t          j        u r<|j         t          j        u r)| j        j        j                            |j                  S | j         t          j        u r<|j         t          j        u r)|j        j        j                            | j                  S | j         t          j	        u r7|j         t          j        u r$| j        j                            |j                  S | j         t          j        u r7|j         t          j	        u r$|j        j                            | j                  S dS | j         t          j        u r| j        |j        u S | j         t          j	        u r| j        |j        u S | j         t          j
        u r| j        }|j        }|j        j        |j        j        k    rdS t          |j        j                  t          |j        j                  k    rdS t!          |j        j        |j        j                  D ]E\  }}t          |j                  t          |j                  k    r dS t%          ||          s dS FdS | j         t          j        t          j        fv r| j        |j        k    S | j         t          j        u r| j        |j        k    S | j         t          j        u r| j        |j        u S dS )z~ Return True if two Argument objects refer to the same base type, ie.
    without taking into account const and pointers.
    FT)r'   r   rh   r1   r*   r   rP   rf   MAPPEDr   r(   r+   absoluter\   r,   r-   ziprR   rn   r0   UNION)type1type2td1td2ad1ad2s         r   rn   rn   j  s    z##
 :+++
l>R0R0R#.:BB5CSTTT:---%*@R2R2R#.:BB5CSTTT:,,,|?S1S1S#.:BB5CSTTT:---%*@S2S2S#.:BB5CSTTT:***uz\=Q/Q/Q#/778HIII:---%*@Q2Q2Q#/778HIIIuz\'''5#333z\&&&5#333z\***< CL$9995sy~#cin"5"5555CINCIN;; 	 	HC3:#cj//11uu!#s++ uu tzl)<+=>>>5#333z\)))5#333z\(((5#333 4r   c                    |r)t          |j                  }t          |j                  }n4d}|j        D ]}|j         n|dz  }d}|j        D ]}|j         n|dz  }||k    rdS t          t          |j                            D ]D}|s|j        |         j         n-t	          | |j        |         |j        |         |          s dS EdS )z> Compare two signatures and return True if they are the same. rd   Nr   F)r   T)r\   r-   default_valueranger   )r^   sig1sig2r   na1na2rT   as           r   same_signaturer     s     $)nn$)nn 9 	 	C ,1HCC9 	 	C ,1HCC czzu 3ty>>""   	$)A,4@E!$	!dil6RRR 	55	 4r   c                    t          |          }|                                 | j        D ]}|j        |k    r ndS |j        j        |_        |j        p|j        j        |_        |j        j        |_        |j                            |j        j                   |j	        p|j        j	        |_	        |j
        p|j        j
        |_
        |j        p|j        j        |_        |j        p|j        j        |_        |j        	||_        dS dS )zD Search the typedefs and update the given type from any definition. N)r   r   typedefsrP   r'   
allow_noner*   rR   extenddisallow_noner   rS   
type_hintsr%   )r^   r+   r'   rP   typedefs        r   search_typedefsr     s    X&&K=  +--E . 	 !DIo@)@DOl-DOKw|*++++Iw|/IDM:W\%:DM)FW\-FDo@)@DO $ ' %$r   )NN)T)3r   r   specificationr   r   r   r   r   r.   ra   ry   r   rp   r3   r:   r5   r6   r7   r8   r   rF   rE   rH   rG   r   rI   rO   rM   rN   r4   r9   r2   r=   r<   r@   r?   r>   r   rB   rD   r   rA   rC   r   r   rJ   r   r   rn   r   r    r   r   <module>r      s  0 $ # # # # # M M M M M M M M M M M M' ' 'e e eP  ( "B B B BJ	 	 	  B "L$8,:M!<#= "
  ,"4l6J	l/1C<,l.@L.0C<+\->@ |45!78	|0,2DL.0C,+\-?  %|'8,:M>& >& >& >&BC C CL& & & &R( ( ( ( (r   