U
    L?h                  K   @   s  d Z ddlmZ ddlmZmZ ddlmZ ddlm	Z	m
Z
 ddlmZ dd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRgJiZed dSdS dTdUdVdWdXdYdZd[d\d]g
 ed^< ed^ dSdS ed_< ed_ d7 d`dadbdcddidedfdgdhdiZdjD ]Ze ed e< qTdkD ]Ze ed^ e< qpdldm Zdndo ZG dpdq dqZG drds dsee	ZG dtdu duee
ZG dvdw dwee
ZeeedxZdSS )yz
C++ code printer
    )chain)Typenone   )requires)C89CodePrinterC99CodePrinter)cxxcodeC++98andZand_eqasmautoZbitandZbitorboolbreakcasezcatch,charclassZcomplconstZ
const_castcontinuedefaultdeletedodoubleZdynamic_castelseenumexplicitZexportZexternfalsefloatforZfriendZgotoifinlineintlongmutable	namespacenewnotZnot_eqoperatororZor_eqprivateZ	protectedpublicregisterZreinterpret_castreturnshortsignedZsizeofZstaticZstatic_caststructswitchtemplatethisthrowtruetryZtypedefZtypeidtypenameunionZunsignedusingZvirtualvoidZvolatileZwchar_twhilexorZxor_eqNZalignasZalignofZchar16_tZchar32_tZ	constexprdecltypeZnoexceptZnullptrZstatic_assertZthread_localC++11C++17fmodceil)ModZceilinggammaZtgammabetaZexpintZriemann_zeta)rC   ZEizeta)r
   r=   r>   )ZAbsexploglog10sqrtsincostanasinacosatanatan2sinhcoshtanhfloor)asinhacoshatanherferfcc                    s@   d| }t | |rtd fdd}dt |_t| || d S )Nz	_print_%sz1Edit method (or subclass) instead of overwriting.c              	      s    d | j dt| j|jS )Nz{}{}({})z, )format_nsjoinmap_printargsselfexpr	func_name D/var/www/html/venv/lib/python3.8/site-packages/sympy/printing/cxx.py_print_methodG   s    z+_attach_print_method.<locals>._print_methodzPrints code for %s)hasattr
ValueErrork__doc__setattr)cls
sympy_namerc   	meth_namerf   rd   rb   re   _attach_print_methodC   s    

ro   c                 C   s(   || j   D ]\}}t| || qd S N)standarditemsro   )rl   contrm   Zcxx_namerd   rd   re   _attach_print_methodsM   s    rt   c                       sv   e Zd ZdZdZdZd fdd	Zedhdd	d
 Zedhddd Z	dd Z
dd Zedhddd Z  ZS )_CXXCodePrinterBaseZ_cxxcodezC++zstd::Nc                    s   t  |pi  d S rp   )super__init__)r`   settings	__class__rd   re   rw   W   s    z_CXXCodePrinterBase.__init__	algorithm)headersc              	   C   sZ   ddl m} t|jdkr*| |jd S d| j| |jd | ||jdd   f S )Nr   )Maxr   z%smax(%s, %s))(sympy.functions.elementary.miscellaneousr}   lenr^   r]   rZ   )r`   ra   r}   rd   rd   re   
_print_MaxZ   s    z_CXXCodePrinterBase._print_Maxc              	   C   sZ   ddl m} t|jdkr*| |jd S d| j| |jd | ||jdd   f S )Nr   )Minr   z%smin(%s, %s))r~   r   r   r^   r]   rZ   )r`   ra   r   rd   rd   re   
_print_Minb   s    z_CXXCodePrinterBase._print_Minc                 C   s    |j tkrd|j S tdd S )Nzusing %sz#C++98 does not support type aliases)aliasr   typerh   r_   rd   rd   re   _print_usingj   s    

z _CXXCodePrinterBase._print_usingc                 C   s   |j \}d| | S )Nzthrow %s)r^   r]   )r`   rsargrd   rd   re   _print_Raisep   s    z _CXXCodePrinterBase._print_RaiseZ	stdexceptc                 C   s   |j \}d| j| |f S )Nz%sruntime_error(%s))r^   rZ   r]   )r`   remessagerd   rd   re   _print_RuntimeError_t   s    z(_CXXCodePrinterBase._print_RuntimeError_)N)__name__
__module____qualname__ZprintmethodlanguagerZ   rw   r   r   r   r   r   r   __classcell__rd   rd   ry   re   ru   R   s   




ru   c                   @   s   e Zd ZdZeed ZdS )CXX98CodePrinterr
   N)r   r   r   rq   setreservedreserved_wordsrd   rd   rd   re   r   z   s   r   c                       s   e Zd ZdZeed Zeee	j
 edddhfedddhfedddhfed	d
dhfedddhfedddhfedddhfedddhfedddhfedddhfeddi Z
 fddZ  ZS )CXX11CodePrinterr=   Zint8Zint8_tZcstdintZint16Zint16_tZint32Zint32_tZint64Zint64_tZuint8Zuint8_tZuint16Zuint16_tZuint32Zuint32_tZuint64Zuint64_tZ	complex64zstd::complex<float>complexZ
complex128zstd::complex<double>r   )r   Nc                    s,   |j tkrt |S d|j| jd S d S )Nzusing %(alias)s = %(type)s)apply)r   r   rv   r   kwargsr]   r_   ry   rd   re   r      s    
zCXX11CodePrinter._print_using)r   r   r   rq   r   r   r   dictr   r   Ztype_mappingsrr   r   r   r   rd   rd   ry   re   r      s:              r   c                   @   sF   e Zd ZdZeed Zeej	fe
d Z	dd Zdd Zdd ZdS )	CXX17CodePrinterr>   c                 C   s
   |  |S rp   Z_print_math_funcr_   rd   rd   re   _print_beta   s    zCXX17CodePrinter._print_betac                 C   s
   |  |S rp   r   r_   rd   rd   re   	_print_Ei   s    zCXX17CodePrinter._print_Eic                 C   s
   |  |S rp   r   r_   rd   rd   re   _print_zeta   s    zCXX17CodePrinter._print_zetaN)r   r   r   rq   r   r   r   r   r   Z_kf_math_functionsr   r   r   rd   rd   rd   re   r      s   r   )zc++98zc++11zc++17)rj   	itertoolsr   Zsympy.codegen.astr   r   Zcodeprinterr   cr   r   Zsympy.printing.codeprinterr	   r   remover   ri   lowerro   rt   ru   r   r   r   Zcxx_code_printersrd   rd   rd   re   <module>   s                                                                          
 
(