a
    hqi                    @   s  d dl Z d dlZd dlZd dlZd dlZd dlZejd  dkrXeZe	Z
eZeZejjZn6G dd dZd dlm
Z
mZ G dd dejZe Zdazd dlZ W n ey   d	aY n0 d	azd dlZ ee jd
rdaW n ey   Y n0 ee dre jZneZdd Zdadd Zdd Z dd Z!dd Z"dd Z#dd Z$dd Z%dd Z&G dd  d eZ'G d!d" d"eZ(d#d$ Z)d%d& Z*d'd( Z+G d)d* d*eZ,d+d, Z-d-d. Z.G d/d0 d0eZ/G d1d2 d2eZ0G d3d4 d4e0Z1G d5d6 d6e0Z2G d7d8 d8eZ3G d9d: d:eZ4G d;d< d<eZ5G d=d> d>eZ6G d?d@ d@eZ7G dAdB dBeZ8G dCdD dDeZ9G dEdF dFeZ:G dGdH dHeZ;dIdJ Z<G dKdL dLeZ=G dMdN dNeZ>dOdP Z?G dQdR dReZ@G dSdT dTeZAG dUdV dVeZBG dWdX dXeZCG dYdZ dZeZDG d[d\ d\eZEd]d^ ZFG d_d` d`eZGG dadb dbeZHG dcdd ddeZIG dedf dfeZJG dgdh dheZKG didj djeZLG dkdl dleZMG dmdn dneZNdodp ZOG dqdr dreNZPG dsdt dteNZQG dudv dveNZRG dwdx dxeNZSG dydz dzeZTG d{d| d|eZUG d}d~ d~eZVG dd deZWG dd deZXG dd deZYG dd deZZG dd deZ[G dd deZ\G dd deZ]G dd deZ^G dd deZ_G dd deZ`G dd deZag dZbg dZcG dd deZdG dd deZeG dd deZfG dd deZgG dd deZhG dd deZiG dd deZjG dd deZkG dd deZlG dd deZmdanG dd deZodd ZpG dd deZqdddZrdd Zsdd Ztdd Zueu  dS )    N   c                   @   s   e Zd ZdZdd ZdS )Iteratora:  Compatibility mixin for iterators

        Instead of writing next() methods for iterators, write
        __next__() methods and use this mixin to make them work in
        Python 2 as well as Python 3.

        Idea stolen from the "six" documentation:
        <http://pythonhosted.org/six/#six.Iterator>
        c                 C   s   |   S N)__next__self r   1/usr/share/gcc-11/python/libstdcxx/v6/printers.pynext?   s    zIterator.nextN)__name__
__module____qualname____doc__r
   r   r   r   r	   r   4   s   
r   )imapizipc                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	UTCz5Concrete tzinfo class representing the UTC time zone.c                 C   s
   t dS Nr   datetimeZ	timedeltar   dtr   r   r	   	utcoffsetI   s    zUTC.utcoffsetc                 C   s   dS )Nr   r   r   r   r   r	   tznameL   s    z
UTC.tznamec                 C   s
   t dS r   r   r   r   r   r	   dstO   s    zUTC.dstN)r   r   r   r   r   r   r   r   r   r   r	   r   F   s   r   TFZTypePrinterValuePrinterc                 C   sv   |   }d|j|f }zt|W S  ty4   Y n0 | }t|r\|d jr\|d j}qt	dt
| |f qd S )Nz%s::%sr   zCannot find type %s::%s)strip_typedefstaggdblookup_typeRuntimeErrorfieldslenis_base_classtype
ValueErrorstr)Zorignametypsearchr    r   r   r	   	find_typen   s    r)   z__8::c                 G   s   d | ddd |D }zt|W S  tjy } zXt| vr|ddt d}zt|W W  Y d}~S  tjy   Y n0 |W Y d}~n
d}~0 0 dS )z8
    Lookup template specialization templ<args...>.
    z{}<{}>, c                 S   s   g | ]}t |qS r   )r%   ).0ar   r   r	   
<listcomp>       z%lookup_templ_spec.<locals>.<listcomp>::   N)formatjoinr   r   error_versioned_namespacereplace)Ztemplargster   r   r	   lookup_templ_spec   s    r9   c                 C   s   d| vrd|  } zt |d}W n   |d}Y n0 | }zt| |W S  tjy   t| drt|dddr| dd	d
} zt| |W  Y S  tjy   Y n0 Y dS 0 dS )a  
    Lookup specialization of template nodename corresponding to containertype.

    nodename - The name of a class template, as a String
    containertype - The container, as a gdb.Type

    Return a gdb.Type for the corresponding specialization of nodename,
    or None if the type cannot be found.

    e.g. lookup_node_type('_List_node', gdb.lookup_type('std::list<int>'))
    will return a gdb.Type for the type std::_List_node<int>.
    r/   std::
value_typer   Zstdzstd::__cxx1998zstd::__debugZ__gnu_debugz::__cxx1998::r0   N)r)   template_argumentr   r9   r   r3   is_member_of_namespacer5   )nodenameZcontainertypevaltyper   r   r	   lookup_node_type   s(    
r@   c                 G   s>   t | tjrt| } t| } |D ]}| |d r  dS q dS )z
    Test whether a type is a member of one of the specified namespaces.
    The type can be specified as a string or a gdb.Type object.
    r/   TF)
isinstancer   Typer%   strip_versioned_namespace
startswith)r'   Z
namespaces	namespacer   r   r	   r=      s    r=   c                 C   s2   t | tjr| j} dt|f }td| | duS )z
    Test whether a type is a specialization of the named class template.
    The type can be specified as a string or a gdb.Type object.
    The template should be the name of a class template as a string,
    without any 'std' qualification.
    z(%s)?%sz^std::%s<.*>$N)rA   r   rB   r   r4   rematch)xtemplate_namer   r   r	   is_specialization_of   s    rJ   c                 C   s   |  tdS )N )r5   r4   )typenamer   r   r	   rC      s    rC   c                 C   s<   d}d}t jd dkr&t||| dS tj||| ddS dS )zCRemove "fundamentals_vN" inline namespace from qualified type name.z&^std::experimental::fundamentals_v\d::std::experimental::r   r   r0   )countN)sysversion_inforF   sub)r'   patternreplr   r   r	   strip_fundts_namespace   s
    rT   c                 C   sR   t | } | dd} d}dD ]}| || d |} q|d }| |d |} | S )zARemove known inline namespaces from the canonical name of a type.std::__cxx11::r:   rM   )Zfundamentals_v1Zfundamentals_v2r/   zfilesystem::zv1::)rC   r5   )type_strZexpt_nsZlfts_nsZfs_nsr   r   r	   strip_inline_namespaces   s    rW   c                 C   s<   d}g }z| | | W n   | Y S 0 |d7 }qdS )z-Return a type's template arguments as a list.r   r0   N)appendr<   )type_objntemplate_argsr   r   r	   get_template_arg_list   s    
r\   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	SmartPtrIteratorz@An iterator for smart pointer types with a single 'child' value.c                 C   s
   || _ d S r   _valr   valr   r   r	   __init__  s    zSmartPtrIterator.__init__c                 C   s   | S r   r   r   r   r   r	   __iter__  s    zSmartPtrIterator.__iter__c                 C   s$   | j d u rtd | j  | _ }d|fS )Nzget()r_   StopIterationr`   r   r   r	   r   
  s    
zSmartPtrIterator.__next__Nr   r   r   r   rb   rc   r   r   r   r   r	   r]     s   r]   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )SharedPointerPrinterzP
    Print a shared_ptr, weak_ptr, atomic<shared_ptr>, or atomic<weak_ptr>.
    c                 C   s   t || _|| _|d | _d S N_M_ptr)rC   	_typenamer_   _pointerr   rL   ra   r   r   r	   rb     s    
zSharedPointerPrinter.__init__c                 C   s
   t | jS r   )r]   rk   r   r   r   r	   children  s    zSharedPointerPrinter.childrenc                 C   sR   | j dkrD| jd d d }||d  }t| jd jd}||S | jd d S )Nzstd::atomicZ_M_refcountZ_M_val_M_ir   pointerZ_M_pi)rj   r_   r)   r#   cast)r   Zptr_valZptr_typer   r   r	   _get_refcounts  s    

z#SharedPointerPrinter._get_refcountsc                 C   sp   d}|   }| jjd}tt|}|dkr`|d }|d }|dkrPd| }nd||d f }d| j||f S )	Nemptyr   Z_M_use_countZ_M_weak_countzexpired, weak count %dzuse count %d, weak count %dr0   z%s<%s> (%s))rq   r_   r#   r<   rC   r%   rj   )r   stateZ	refcountstargZusecountZ	weakcountr   r   r	   	to_string(  s    
zSharedPointerPrinter.to_stringN)r   r   r   r   rb   rm   rq   ru   r   r   r   r	   rg     s
   	rg   c                 C   s   | j  }|d js&tdt| j  | |d j }|j  }t|dkr^tdt| j  |d jdkrt|d S |d jr||d j S tdt| j  dS )zBReturn the tuple element stored in a _Tuple_impl<N, T> base class.z-Unsupported implementation for std::tuple: %sr   _M_head_implN)r#   r    r"   r$   r%   rp   r!   r&   )ra   basesZ	head_baser    r   r   r	   _tuple_impl_get9  s$    



ry   c                 C   sd   t t|j}| |krtd||j d j}| dkr\||j d j}| d8 } q4t|S )z6Return the result of std::get<n>(val) on a std::tuple.z0Out of range index for std::get<N> on std::tupler   r0   )r!   r\   r#   r$   rp   r    ry   )rZ   ra   Z
tuple_sizenoder   r   r	   	tuple_getQ  s    
r{   c                 C   sd   | j  d j  }t|ds(t|dr6| d d }n$t|drJ| d }ntdt| td|S )z4Return the result of val.get() on a std::unique_ptr.r   Z__uniq_ptr_dataZ__uniq_ptr_impl_M_ttuplez-Unsupported implementation for unique_ptr: %s)r#   r    r   rJ   r$   r%   r{   )ra   Z	impl_typeZtuple_memberr   r   r	   unique_ptr_get_  s    



r~   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	UniquePointerPrinterzPrint a unique_ptr.c                 C   s
   || _ d S r   r^   rl   r   r   r	   rb   t  s    zUniquePointerPrinter.__init__c                 C   s   t t| jS r   )r]   r~   r_   r   r   r   r	   rm   w  s    zUniquePointerPrinter.childrenc                 C   s   | j jd}dt|S )Nr   zstd::unique_ptr<{}>)r_   r#   r<   r1   r%   r   r7   r   r   r	   ru   z  s    zUniquePointerPrinter.to_stringN)r   r   r   r   rb   rm   ru   r   r   r   r	   r   q  s   r   c                 C   s   | d j |  S )z7Return the value held in a __gnu_cxx::__aligned_membuf.
_M_storage)addressrp   ro   dereference)Zbufr?   r   r   r	   get_value_from_aligned_membuf  s    r   c                 C   sn   zJ| j  d j}|dkr$| d W S |dkrH| j d}t| d |W S W n   Y n0 tdt| j  dS )z-Return the value held in an _List_node<_Val>.r0   _M_datar   r   !Unsupported implementation for %sNr#   r    r&   r<   r   r$   r%   rz   memberr?   r   r   r	   get_value_from_list_node  s    
r   c                   @   s8   e Zd ZdZG dd deZdd Zdd Zdd	 Zd
S )StdListPrinterzPrint a std::list.c                   @   s$   e Zd Zdd Zdd Zdd ZdS )zStdListPrinter._iteratorc                 C   s"   || _ |d | _|j| _d| _d S N_M_nextr   )	_nodetype_baser   _head_countr   nodetypeheadr   r   r	   rb     s    
z!StdListPrinter._iterator.__init__c                 C   s   | S r   r   r   r   r   r	   rc     s    z!StdListPrinter._iterator.__iter__c                 C   sR   | j | jkrt| j | j }|d | _ | j}| jd | _t|}d| |fS )Nr   r0   [%d])r   r   re   rp   r   r   r   r   )r   eltrN   ra   r   r   r	   r     s    
z!StdListPrinter._iterator.__next__Nr   r   r   rb   rc   r   r   r   r   r	   	_iterator  s   r   c                 C   s   t || _|| _d S r   rC   rj   r_   rl   r   r   r	   rb     s    
zStdListPrinter.__init__c                 C   s(   t d| jj }| || jd d S )N
_List_node_M_impl_M_noder@   r_   r#   ro   r   r   r   r   r   r	   rm     s    zStdListPrinter.childrenc                 C   s0   | j d d }|d |jkr&d| j S d| j S )Nr   r   r   empty %s%s)r_   r   rj   )r   Zheadnoder   r   r	   ru     s    
zStdListPrinter.to_stringN	r   r   r   r   r   r   rb   rm   ru   r   r   r   r	   r     s
   r   c                   @   s   e Zd Zdd Zdd ZdS )NodeIteratorPrinterc                 C   s$   || _ || _|| _t||j| _d S r   )r_   rj   	_contnamer@   r#   r   )r   rL   ra   Zcontnamer>   r   r   r	   rb     s    zNodeIteratorPrinter.__init__c                 C   s:   | j d sd| j S | j d | j  }tt|S )Nr   z(non-dereferenceable iterator for std::%s)r_   r   rp   r   ro   r   r%   r   r   rz   r   r   r	   ru     s    


zNodeIteratorPrinter.to_stringN)r   r   r   rb   ru   r   r   r   r	   r     s   r   c                   @   s   e Zd ZdZdd ZdS )StdListIteratorPrinterzPrint std::list::iterator.c                 C   s   t | ||dd d S )Nlistr   r   rb   rl   r   r   r	   rb     s    zStdListIteratorPrinter.__init__Nr   r   r   r   rb   r   r   r   r	   r     s   r   c                   @   s   e Zd ZdZdd ZdS )StdFwdListIteratorPrinterz"Print std::forward_list::iterator.c                 C   s   t | ||dd d S )Nforward_list_Fwd_list_noder   rl   r   r   r	   rb     s    z"StdFwdListIteratorPrinter.__init__Nr   r   r   r   r	   r     s   r   c                   @   s8   e Zd ZdZG dd deZdd Zdd Zdd	 Zd
S )StdSlistPrinterzPrint a __gnu_cxx::slist.c                   @   s$   e Zd Zdd Zdd Zdd ZdS )zStdSlistPrinter._iteratorc                 C   s   || _ |d d | _d| _d S )N_M_headr   r   r   r   r   r   r   r   r	   rb     s    z"StdSlistPrinter._iterator.__init__c                 C   s   | S r   r   r   r   r   r	   rc     s    z"StdSlistPrinter._iterator.__iter__c                 C   sL   | j dkrt| j | j }|d | _ | j}| jd | _d| |d fS )Nr   r   r0   r   r   )r   re   rp   r   r   r   )r   r   rN   r   r   r	   r     s    

z"StdSlistPrinter._iterator.__next__Nr   r   r   r   r	   r     s   r   c                 C   s
   || _ d S r   r^   rl   r   r   r	   rb     s    zStdSlistPrinter.__init__c                 C   s    t d| jj}| | | jS )N__gnu_cxx::_Slist_node)r@   r_   r#   r   ro   r   r   r   r	   rm     s    zStdSlistPrinter.childrenc                 C   s   | j d d dkrdS dS )Nr   r   r   zempty __gnu_cxx::slistz__gnu_cxx::slistr^   r   r   r   r	   ru     s    zStdSlistPrinter.to_stringNr   r   r   r   r	   r     s
   r   c                   @   s    e Zd ZdZdd Zdd ZdS )StdSlistIteratorPrinterz!Print __gnu_cxx::slist::iterator.c                 C   s
   || _ d S r   r^   rl   r   r   r	   rb     s    z StdSlistIteratorPrinter.__init__c                 C   s<   | j d sdS td| j j }t| j d | d S )Nr   z1non-dereferenceable iterator for __gnu_cxx::slistr   r   )r_   r@   r#   ro   r%   rp   r   r   r   r   r	   ru      s    
z!StdSlistIteratorPrinter.to_stringNr   r   r   r   rb   ru   r   r   r   r	   r     s   r   c                   @   s@   e Zd ZdZG dd deZdd Zdd Zdd	 Zd
d Z	dS )StdVectorPrinterzPrint a std::vector.c                   @   s$   e Zd Zdd Zdd Zdd ZdS )zStdVectorPrinter._iteratorc                 C   s^   || _ |rH|d | _d| _|d | _|d | _| j j}d|j | _n|| _|| _d| _	d S )N_M_pr   	_M_offset   )
_bitvec_item_so_finish_for   r#   sizeof_isizer   )r   startfinishZbitvecityper   r   r	   rb     s    


z#StdVectorPrinter._iterator.__init__c                 C   s   | S r   r   r   r   r   r	   rc     s    z#StdVectorPrinter._iterator.__iter__c                 C   s   | j }| j d | _ | jr| j| jkr4| j| jkr4tt| j d| j> @ }| jd | _| j| j	krv| jd | _d| _d| |fS | j| jkrt| j }| jd | _d| |fS d S )Nr0   r   r   )
r   r   r   r   r   r   re   boolr   r   )r   rN   r   r   r   r	   r     s     
z#StdVectorPrinter._iterator.__next__Nr   r   r   r   r	   r     s   r   c                 C   s*   t || _|| _|jdjtjk| _d S r   )	rC   rj   r_   r#   r<   coder   TYPE_CODE_BOOL_is_boolrl   r   r   r	   rb   0  s    
zStdVectorPrinter.__init__c                 C   s$   |  | jd d | jd d | jS )Nr   _M_start	_M_finish)r   r_   r   r   r   r   r	   rm   6  s    zStdVectorPrinter.childrenc           	      C   s   | j d d }| j d d }| j d d }| jr| j d d d }| j d d d }| j d d d }| j}d|j }|||  | }|||  }d| jt|t|f S d	| jt|| t|| f S d S )
Nr   r   r   Z_M_end_of_storager   r   r   z"%s<bool> of length %d, capacity %dz%s of length %d, capacity %d)r_   r   r   r#   r   rj   int)	r   r   r   endZfor   ZbllengthZcapacityr   r   r	   ru   ;  s"    

zStdVectorPrinter.to_stringc                 C   s   dS Narrayr   r   r   r   r	   display_hintM  s    zStdVectorPrinter.display_hintN)
r   r   r   r   r   r   rb   rm   ru   r   r   r   r   r	   r     s   %r   c                   @   s    e Zd ZdZdd Zdd ZdS )StdVectorIteratorPrinterzPrint std::vector::iterator.c                 C   s
   || _ d S r   r^   rl   r   r   r	   rb   T  s    z!StdVectorIteratorPrinter.__init__c                 C   s    | j d sdS t| j d  S )NZ
_M_currentz,non-dereferenceable iterator for std::vectorr_   r%   r   r   r   r   r	   ru   W  s    
z"StdVectorIteratorPrinter.to_stringNr   r   r   r   r	   r   Q  s   r   c                   @   s    e Zd ZdZdd Zdd ZdS )StdBitIteratorPrinterz@Print std::vector<bool>'s _Bit_iterator and _Bit_const_iterator.c                 C   s
   || _ d S r   r^   rl   r   r   r	   rb   `  s    zStdBitIteratorPrinter.__init__c                 C   s.   | j d sdS t| j d  d| j d > @ S )Nr   z2non-dereferenceable iterator for std::vector<bool>r0   r   r_   r   r   r   r   r   r	   ru   c  s
    
zStdBitIteratorPrinter.to_stringNr   r   r   r   r	   r   ]  s   r   c                   @   s    e Zd ZdZdd Zdd ZdS )StdBitReferencePrinterz#Print std::vector<bool>::reference.c                 C   s
   || _ d S r   r^   rl   r   r   r	   rb   m  s    zStdBitReferencePrinter.__init__c                 C   s*   | j d sdS t| j d  | j d @ S )Nr   z$invalid std::vector<bool>::referenceZ_M_maskr   r   r   r   r	   ru   p  s    
z StdBitReferencePrinter.to_stringNr   r   r   r   r	   r   j  s   r   c                   @   s8   e Zd ZdZG dd deZdd Zdd Zdd	 Zd
S )StdTuplePrinterzPrint a std::tuple.c                   @   s0   e Zd Zedd Zdd Zdd Zdd Zd	S )
zStdTuplePrinter._iteratorc                 C   sN   t | dkr"t| d jdrBdS n t | dkr2dS t | dkrBdS tdd S )Nr   r0   Z__tuple_baseTr   Fz4Top of tuple tree does not consist of a single node.)r!   rJ   r#   r$   )nodesr   r   r	   _is_nonempty_tuple}  s    z,StdTuplePrinter._iterator._is_nonempty_tuplec                 C   s:   || _ | j j }| |r0| j |d j| _ d| _d S r   )r   r#   r    r   rp   r   )r   r   r   r   r   r	   rb     s
    
z"StdTuplePrinter._iterator.__init__c                 C   s   | S r   r   r   r   r   r	   rc     s    z"StdTuplePrinter._iterator.__iter__c                 C   s   | j s
t| j j }t|dkr&tt|dkr:tdt|dkr`| j |d j}d | _ n&| j |d j}| j |d j| _ | jd | _|j }t|dk s|d jdkrd| jd  |fS d| jd  |d fS d S )Nr   r   z/Cannot parse more than 2 nodes in a tuple tree.r0   rw   r   )	r   re   r#   r    r!   r$   rp   r   r&   )r   r   implr    r   r   r	   r     s&    	
z"StdTuplePrinter._iterator.__next__N)r   r   r   staticmethodr   rb   rc   r   r   r   r   r	   r   |  s
   
r   c                 C   s   t || _|| _d S r   r   rl   r   r   r	   rb     s    
zStdTuplePrinter.__init__c                 C   s   |  | jS r   )r   r_   r   r   r   r	   rm     s    zStdTuplePrinter.childrenc                 C   s(   t | jj dkrd| j S d| j S )Nr   r   z%s containing)r!   r_   r#   r    rj   r   r   r   r	   ru     s    
zStdTuplePrinter.to_stringNr   r   r   r   r	   r   y  s
   Er   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )StdStackOrQueuePrinterz!Print a std::stack or std::queue.c                 C   s   t || _t|d | _d S )Nc)rC   rj   r   default_visualizer_visualizerrl   r   r   r	   rb     s    
zStdStackOrQueuePrinter.__init__c                 C   s
   | j  S r   )r   rm   r   r   r   r	   rm     s    zStdStackOrQueuePrinter.childrenc                 C   s   d| j | j f S )Nz%s wrapping: %s)rj   r   ru   r   r   r   r	   ru     s    z StdStackOrQueuePrinter.to_stringc                 C   s   t | jdr| j S d S )Nr   )hasattrr   r   r   r   r   r	   r     s    
z#StdStackOrQueuePrinter.display_hintN)r   r   r   r   rb   rm   ru   r   r   r   r   r	   r     s
   r   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )RbtreeIteratorzf
    Turn an RB-tree-based container (std::map, std::set etc.) into
    a Python iterable object.
    c                 C   s2   |d d d | _ |d d d d | _d| _d S )Nr|   r   Z_M_node_countZ	_M_header_M_leftr   )_size_noder   )r   Zrbtreer   r   r	   rb     s    zRbtreeIterator.__init__c                 C   s   | S r   r   r   r   r   r	   rc     s    zRbtreeIterator.__iter__c                 C   s
   t | jS r   )r   r   r   r   r   r	   __len__  s    zRbtreeIterator.__len__c                 C   s   | j | jkrt| j}| j d | _ | j | jk r| j}| d rh| d }| d r| d }qLnB| d }|| d kr|}| d }qt| d |kr|}|| _|S )Nr0   Z_M_rightr   Z	_M_parent)r   r   re   r   r   )r   resultrz   parentr   r   r	   r     s$    zRbtreeIterator.__next__N)r   r   r   r   rb   rc   r   r   r   r   r   r	   r     s
   r   c                 C   sn   zJ| j  d j}|dkr$| d W S |dkrH| j d}t| d |W S W n   Y n0 tdt| j  dS )z0Return the value held in an _Rb_tree_node<_Val>.r0   Z_M_value_fieldr   r   r   Nr   r   r   r   r	   get_value_from_Rb_tree_node
  s    
r   c                   @   s    e Zd ZdZdd Zdd ZdS )StdRbtreeIteratorPrinterz2Print std::map::iterator, std::set::iterator, etc.c                 C   s"   || _ td| j j}| | _d S N_Rb_tree_node)r_   r@   r#   ro   
_link_type)r   rL   ra   r   r   r   r	   rb   !  s    z!StdRbtreeIteratorPrinter.__init__c                 C   s0   | j d sdS | j d | j }tt|S )Nr   z6non-dereferenceable iterator for associative container)r_   rp   r   r   r%   r   r   r   r   r	   ru   &  s    
z"StdRbtreeIteratorPrinter.to_stringNr   r   r   r   r	   r     s   r   c                   @   s    e Zd ZdZdd Zdd ZdS )StdDebugIteratorPrinterz-Print a debug enabled version of an iterator.c                 C   s
   || _ d S r   r^   rl   r   r   r	   rb   0  s    z StdDebugIteratorPrinter.__init__c                 C   sb   t d}| jjd}| j|d }|s<t| j|S | jd |d krRdS t| j|S )Nz __gnu_debug::_Safe_iterator_baser   Z_M_sequenceZ
_M_versionzinvalid iterator)r   r   r_   r#   r<   rp   r%   )r   Z	base_typer   Zsafe_seqr   r   r	   ru   5  s    
z!StdDebugIteratorPrinter.to_stringNr   r   r   r   r	   r   -  s   r   c                 C   s   | dkrdS d|  S )zDReturn either "1 element" or "N elements" depending on the argument.r0   z	1 elementz%d elementsr   )numr   r   r	   num_elements@  s    r   c                   @   s@   e Zd ZdZG dd deZdd Zdd Zdd	 Zd
d Z	dS )StdMapPrinterz"Print a std::map or std::multimap.c                   @   s$   e Zd Zdd Zdd Zdd ZdS )zStdMapPrinter._iterc                 C   s   || _ d| _|| _d S r   _rbiterr   _typer   Zrbiterr#   r   r   r	   rb   J  s    zStdMapPrinter._iter.__init__c                 C   s   | S r   r   r   r   r   r	   rc   O  s    zStdMapPrinter._iter.__iter__c                 C   sh   | j d dkr@t| j}|| j }t|}|| _|d }n
| jd }d| j  |f}| j d | _ |S )Nr   r   firstsecondr   r0   )r   r
   r   rp   r   r   r   Z_pair)r   rZ   itemr   r   r   r	   r   R  s    


zStdMapPrinter._iter.__next__Nr   r   r   r   r	   _iterI  s   r   c                 C   s   t || _|| _d S r   r   rl   r   r   r	   rb   _  s    
zStdMapPrinter.__init__c                 C   s   d| j ttt| jf S N
%s with %srj   r   r!   r   r_   r   r   r   r	   ru   c  s    zStdMapPrinter.to_stringc                 C   s$   t d| jj }| t| j|S r   r@   r_   r#   ro   r   r   r   r   r   r	   rm   g  s    zStdMapPrinter.childrenc                 C   s   dS Nmapr   r   r   r   r	   r   k  s    zStdMapPrinter.display_hintN
r   r   r   r   r   r   rb   ru   rm   r   r   r   r   r	   r   E  s   r   c                   @   s8   e Zd ZdZG dd deZdd Zdd Zdd	 Zd
S )StdSetPrinterz"Print a std::set or std::multiset.c                   @   s$   e Zd Zdd Zdd Zdd ZdS )zStdSetPrinter._iterc                 C   s   || _ d| _|| _d S r   r   r   r   r   r	   rb   t  s    zStdSetPrinter._iter.__init__c                 C   s   | S r   r   r   r   r   r	   rc   y  s    zStdSetPrinter._iter.__iter__c                 C   s@   t | j}|| j }t|}d| j |f}| jd | _|S )Nr   r0   )r
   r   rp   r   r   r   r   )r   r   r   r   r   r	   r   |  s    
zStdSetPrinter._iter.__next__Nr   r   r   r   r	   r   s  s   r   c                 C   s   t || _|| _d S r   r   rl   r   r   r	   rb     s    
zStdSetPrinter.__init__c                 C   s   d| j ttt| jf S r   r   r   r   r   r	   ru     s    zStdSetPrinter.to_stringc                 C   s$   t d| jj }| t| j|S r   r   r   r   r   r	   rm     s    zStdSetPrinter.childrenN)	r   r   r   r   r   r   rb   ru   rm   r   r   r   r	   r   o  s
   r   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	StdBitsetPrinterzPrint a std::bitset.c                 C   s   t || _|| _d S r   r   rl   r   r   r	   rb     s    
zStdBitsetPrinter.__init__c                 C   s
   d| j  S )Nr   )rj   r   r   r   r	   ru     s    zStdBitsetPrinter.to_stringc           	      C   s   z| j d }W n   g  Y S 0 |j}|jtjkr>| j}n|g}|j}|j| }g }d}||k r|| }d}|dkr|d@ dkr|d|| d |  df |d }|d? }qp|d }q\|S )NZ_M_wr   r0   r   r   )r_   r#   r   r   TYPE_CODE_ARRAYtargetr   rX   )	r   ZwordsZwtypeZtsizeZnwordsr   Zbytewbitr   r   r	   rm     s,    



zStdBitsetPrinter.childrenN)r   r   r   r   rb   ru   rm   r   r   r   r	   r     s   r   c                   @   s@   e Zd ZdZG dd deZdd Zdd Zdd	 Zd
d Z	dS )StdDequePrinterzPrint a std::deque.c                   @   s$   e Zd Zdd Zdd Zdd ZdS )zStdDequePrinter._iterc                 C   s(   || _ || _|| _|| _|| _d| _d S r   )r   _p_end_last_buffer_sizer   )r   rz   r   r   lastZbuffer_sizer   r   r	   rb     s    zStdDequePrinter._iter.__init__c                 C   s   | S r   r   r   r   r   r	   rc     s    zStdDequePrinter._iter.__iter__c                 C   sr   | j | jkrtd| j | j  f}| jd | _| j d | _ | j | jkrn| jd | _| jd | _ | j | j | _|S )Nr   r0   r   )r  r  re   r   r   r  r   r  )r   r   r   r   r	   r     s    zStdDequePrinter._iter.__next__Nr   r   r   r   r	   r     s   r   c                 C   sH   t || _|| _|jd| _| jj}|dk r>td| | _nd| _d S )Nr   i   r0   )	rC   rj   r_   r#   r<   Z_elttyper   r   r  )r   rL   ra   sizer   r   r	   rb     s    
zStdDequePrinter.__init__c                 C   sx   | j d d }| j d d }|d |d  d }|d |d  }|d |d  }| j| | | }d	| jtt|f S )
Nr   r   r   r   r0   _M_last_M_cur_M_firstr   )r_   r  rj   r   long)r   r   r   Zdelta_nZdelta_sZdelta_er  r   r   r	   ru     s    zStdDequePrinter.to_stringc                 C   s@   | j d d }| j d d }| |d |d |d |d | jS )Nr   r   r   r   r  r  )r_   r   r  )r   r   r   r   r   r	   rm     s
    
zStdDequePrinter.childrenc                 C   s   dS r   r   r   r   r   r	   r     s    zStdDequePrinter.display_hintNr   r   r   r   r	   r     s   
r   c                   @   s    e Zd ZdZdd Zdd ZdS )StdDequeIteratorPrinterzPrint std::deque::iterator.c                 C   s
   || _ d S r   r^   rl   r   r   r	   rb     s    z StdDequeIteratorPrinter.__init__c                 C   s    | j d sdS t| j d  S )Nr  z+non-dereferenceable iterator for std::dequer   r   r   r   r	   ru   	  s    
z!StdDequeIteratorPrinter.to_stringNr   r   r   r   r	   r    s   r  c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	StdStringPrinterz'Print a std::basic_string of some kind.c                 C   s   || _ |ddk| _d S )Nz::__cxx11::basic_stringrv   )r_   find_new_stringrl   r   r   r	   rb     s    zStdStringPrinter.__init__c                 C   s   | j j}|jtjkr| }| j d d }| jrL| j d }||j }n<|	  }t
t|d  }||d }| d }t|dr|j|dS |j|dS )	NZ_M_dataplusr   Z_M_string_lengthz::_Repr0   Z	_M_lengthlazy_stringr   )r_   r#   r   r   TYPE_CODE_REFr   r  rp   r   unqualifiedr   r%   ro   r   r   r  string)r   r#   ptrr   ZrealtypeZreptypeheaderr   r   r	   ru     s    

zStdStringPrinter.to_stringc                 C   s   dS Nr  r   r   r   r   r	   r   -  s    zStdStringPrinter.display_hintNr   r   r   r   rb   ru   r   r   r   r   r	   r    s   r  c                 C   s"   | d }| d }| d }|||fS )z'Access the streambuf put area pointers.Z
_M_out_begZ
_M_out_curZ	_M_in_endr   )	streambufpbasepptregptrr   r   r	   access_streambuf_ptrs1  s    r  c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	StdStringBufPrinterzPrint a std::basic_stringbuf.c                 C   s
   || _ d S r   r^   )r   _ra   r   r   r	   rb   <  s    zStdStringBufPrinter.__init__c                 C   sJ   t | j\}}}|r@|r ||kr0|j|| dS |j|| dS | jd S )Nr  Z	_M_string)r  r_   r  )r   r  r  r  r   r   r	   ru   ?  s    zStdStringBufPrinter.to_stringc                 C   s   dS r  r   r   r   r   r	   r   I  s    z StdStringBufPrinter.display_hintNr  r   r   r   r	   r  9  s   
r  c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	StdStringStreamPrinterz Print a std::basic_stringstream.c                 C   sZ   || _ || _dd |j D d }td||j td| _	| j	|d jk| _
d S )Nc                 S   s   g | ]}|j r|jqS r   )r"   r#   )r+   fr   r   r	   r-   X  r.   z3StdStringStreamPrinter.__init__.<locals>.<listcomp>r   Z__streamz$__stream->rdbuf()_M_stringbuf)r_   rj   r#   r    r   Zset_convenience_variablerp   r   parse_and_eval
_streambuf_was_redirected)r   rL   ra   Zbasetyper   r   r	   rb   P  s    zStdStringStreamPrinter.__init__c                 C   s$   | j rd| j| j f S | jd S )Nz%s redirected to %sr!  )r$  rj   r#  r   r_   r   r   r   r	   ru   ]  s
    z StdStringStreamPrinter.to_stringc                 C   s   | j r
d S dS r  )r$  r   r   r   r	   r   c  s    z#StdStringStreamPrinter.display_hintNr  r   r   r   r	   r  M  s   r  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )Tr1HashtableIteratorc                 C   sf   |d | _ d| _|d | _t|jd | _d| _| j| jkrb| j | j | _| jrTqb| jd | _q2d S )NZ
_M_bucketsr   Z_M_bucket_countZ_Noder0   )_buckets_bucket_bucket_countr)   r#   ro   
_node_typer   )r   	hashtabler   r   r	   rb   j  s    

zTr1HashtableIterator.__init__c                 C   s   | S r   r   r   r   r   r	   rc   v  s    zTr1HashtableIterator.__iter__c                 C   s   | j dkrt| j | j}| d }| d | _ | j dkr|| jd | _| j| jkr|| j| j | _ | j rnq|| jd | _qL|S )Nr   Z_M_vr   r0   )r   re   rp   r)  r   r'  r(  r&  )r   rz   r   r   r   r	   r   y  s    

zTr1HashtableIterator.__next__Nr   r   r   r   r	   r%  i  s   r%  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )StdHashtableIteratorc                 C   sR   |d d | _ |jd}|jdd}tdt||r>dnd}| | _d S )	NZ_M_before_begin_M_nxtr0   	   r   zstd::__detail::_Hash_nodetrueZfalse)r   r#   r<   r9   r%   ro   r)  )r   r*  r?   cachedZ	node_typer   r   r	   rb     s    

zStdHashtableIterator.__init__c                 C   s   | S r   r   r   r   r   r	   rc     s    zStdHashtableIterator.__iter__c                 C   sR   | j dkrt| j | j }|d | _ |d j}||jd }| S )Nr   r,  r   )	r   re   rp   r)  r   r   r#   r<   ro   )r   r   valptrr   r   r	   r     s    


zStdHashtableIterator.__next__Nr   r   r   r   r	   r+    s   r+  c                   @   s<   e Zd ZdZdd Zdd Zdd Zedd	 Zd
d Z	dS )Tr1UnorderedSetPrinterz1Print a std::unordered_set or tr1::unordered_set.c                 C   s   t || _|| _d S r   r   rl   r   r   r	   rb     s    
zTr1UnorderedSetPrinter.__init__c                 C   s   | j dr| jS | jd S Nstd::tr1_M_hrj   rD   r_   r   r   r   r	   
_hashtable  s    z!Tr1UnorderedSetPrinter._hashtablec                 C   s   |   d }d| jt|f S NZ_M_element_countr   r6  rj   r   r   rN   r   r   r	   ru     s    z Tr1UnorderedSetPrinter.to_stringc                 C   s   d|  S Nr   r   ir   r   r	   _format_count  s    z$Tr1UnorderedSetPrinter._format_countc                 C   s@   t | jt }| jdr.t|t|  S t|t	|  S Nr3  )
r   r=  	itertoolsrN   rj   rD   r   r%  r6  r+  )r   counterr   r   r	   rm     s    zTr1UnorderedSetPrinter.childrenN)
r   r   r   r   rb   r6  ru   r   r=  rm   r   r   r   r	   r1    s   
r1  c                   @   s\   e Zd ZdZdd Zdd Zdd Zedd	 Zed
d Z	edd Z
dd Zdd ZdS )Tr1UnorderedMapPrinterz1Print a std::unordered_map or tr1::unordered_map.c                 C   s   t || _|| _d S r   r   rl   r   r   r	   rb     s    
zTr1UnorderedMapPrinter.__init__c                 C   s   | j dr| jS | jd S r2  r5  r   r   r   r	   r6    s    z!Tr1UnorderedMapPrinter._hashtablec                 C   s   |   d }d| jt|f S r7  r8  r9  r   r   r	   ru     s    z Tr1UnorderedMapPrinter.to_stringc                 c   s   | D ]}|D ]
}|V  qqd S r   r   )r   r   r<  r   r   r	   _flatten  s    zTr1UnorderedMapPrinter._flattenc                 C   s   | d | d fS Nr   r   r   )r   r   r   r	   _format_one  s    z"Tr1UnorderedMapPrinter._format_onec                 C   s   d|  S r:  r   r;  r   r   r	   r=    s    z$Tr1UnorderedMapPrinter._format_countc                 C   sd   t | jt }| jdr@| t | jt| 	 }t
||S | t | jt| 	 }t
||S r>  )r   r=  r?  rN   rj   rD   rB  rD  r%  r6  r   r+  )r   r@  datar   r   r	   rm     s    
zTr1UnorderedMapPrinter.childrenc                 C   s   dS r   r   r   r   r   r	   r     s    z#Tr1UnorderedMapPrinter.display_hintN)r   r   r   r   rb   r6  ru   r   rB  rD  r=  rm   r   r   r   r   r	   rA    s   


rA  c                   @   s8   e Zd ZdZG dd deZdd Zdd Zdd	 Zd
S )StdForwardListPrinterzPrint a std::forward_list.c                   @   s$   e Zd Zdd Zdd Zdd ZdS )zStdForwardListPrinter._iteratorc                 C   s   || _ |d | _d| _d S r   r   r   r   r   r	   rb     s    
z(StdForwardListPrinter._iterator.__init__c                 C   s   | S r   r   r   r   r   r	   rc     s    z(StdForwardListPrinter._iterator.__iter__c                 C   sl   | j dkrt| j | j }|d | _ | j}| jd | _|d j}||jd	 }d| | fS )Nr   r   r0   r   r   )
r   re   rp   r   r   r   r   r#   r<   ro   )r   r   rN   r0  r   r   r	   r     s    


z(StdForwardListPrinter._iterator.__next__Nr   r   r   r   r	   r     s   r   c                 C   s   || _ t|| _d S r   )r_   rC   rj   rl   r   r   r	   rb      s    zStdForwardListPrinter.__init__c                 C   s(   t d| jj }| || jd d S )Nr   r   r   r   r   r   r   r	   rm     s    zStdForwardListPrinter.childrenc                 C   s*   | j d d d dkr d| j S d| j S )Nr   r   r   r   r   r   r_   rj   r   r   r   r	   ru     s    
zStdForwardListPrinter.to_stringNr   r   r   r   r	   rF    s
   rF  c                   @   sB   e Zd ZdZdddZdd ZG dd deZd	d
 Zdd Z	dS )SingleObjContainerPrinterz8Base class for printers of containers of single objects.Nc                 C   s   || _ || _|| _d S r   )_contained_valuer   _hint)r   ra   Zvizhintr   r   r	   rb     s    z"SingleObjContainerPrinter.__init__c                 C   s(   t st|S tjtj |p&t|S )z5Return type as a string after applying type printers.)_use_type_printingr%   r   typesapply_type_recognizersget_type_recognizers)r   r#   r   r   r	   
_recognize  s    z$SingleObjContainerPrinter._recognizec                   @   s$   e Zd Zdd Zdd Zdd ZdS )z$SingleObjContainerPrinter._containedc                 C   s
   || _ d S r   r^   r`   r   r   r	   rb     s    z-SingleObjContainerPrinter._contained.__init__c                 C   s   | S r   r   r   r   r   r	   rc   "  s    z-SingleObjContainerPrinter._contained.__iter__c                 C   s"   | j d u rt| j }d | _ d|fS )Nz[contained value]rd   )r   Zretvalr   r   r	   r   %  s
    
z-SingleObjContainerPrinter._contained.__next__Nr   r   r   r   r	   
_contained  s   rQ  c                 C   s6   | j d u r| d S t| jdr*| j S | | j S )Nrm   )rI  rQ  r   r   rm   r   r   r   r	   rm   ,  s
    


z"SingleObjContainerPrinter.childrenc                 C   s(   t | jdr"t | jdr"| j S | jS )Nrm   r   )r   r   r   rJ  r   r   r   r	   r   3  s
    

z&SingleObjContainerPrinter.display_hint)N)
r   r   r   r   rb   rP  r   rQ  rm   r   r   r   r   r	   rH    s   
rH  c                 C   sN   |   j} tjd dkr"t| } nt| } zt| jj	W S    Y dS 0 dS )z{Find the name of the function referred to by the gdb.Value f,
    which should contain a function pointer from the program.r   r   N)
r   r   rO   rP   r
  r   r   Zblock_for_pcfunctionr&   )r   r   r   r	   function_pointer_to_name;  s    

rS  c                       s4   e Zd ZdZ fddZdd Zedd Z  ZS )StdExpAnyPrinterz+Print a std::any or std::experimental::any.c              	      s  t || _t| j| _|| _d | _d }d }| jd }|dkr~t|}|sXtd| j d|}t	||}|std| j |
d}	d|	v rg }
t D ]B}z(td||
d}|
t| W q tjy   Y q0 qt|
dkrtd	|
d }n
t|	}|d| _d }d
|	v r8| jd d j}n(d|	v rR| jd d }ntd| j || j  }t|}tt| || d S )NZ
_M_managerr   zInvalid function pointer in %szi({0}::_Manager_\w+<.*>)::_S_manage\((enum )?{0}::_Op, (const {0}|{0} const) ?\*, (union )?{0}::_Arg ?\*\)zUnknown manager function in %sr0   std::stringzstd::string(?!\w)z;Cannot uniquely determine std::string type used in std::anyz::_Manager_internalr   Z	_M_bufferz::_Manager_externalri   )rC   rj   rT   r_   _contained_typerS  r$   r1   rF   rG   grouprT  _string_typesrQ   rX   r   r   r3   r!   r<   r   rp   ro   r   r   superrb   )r   rL   ra   contained_value
visualizerZmgrfuncZrxmZmgrnameZmgrtypessrH   Zmgrtyper0  	__class__r   r	   rb   V  sf    









zStdExpAnyPrinter.__init__c                 C   sT   | j d u rd| j S d| j }t| jdr8|| j  S | | j }|tt| S )N%s [no contained value]z%s containing rm   )rV  rj   r   r   ru   rP  rC   r%   )r   descr?   r   r   r	   ru     s    


zStdExpAnyPrinter.to_stringc                     s@   t td h} d dddt g}|  fdd|D O } | S )NrU  zAbasic_string<char, std::char_traits<char>, std::allocator<char> >r:   rU   c                    s   h | ]}|  qS r   r   )r+   qr^  r   r	   	<setcomp>  r.   z1StdExpAnyPrinter._string_types.<locals>.<setcomp>)r%   r   r   r   r4   )ZstringsZqualsr   rd  r	   rX    s    zStdExpAnyPrinter._string_types)	r   r   r   r   rb   ru   r   rX  __classcell__r   r   r_  r	   rT  S  s
   D	rT  c                       s(   e Zd ZdZ fddZdd Z  ZS )StdExpOptionalPrinterz5Print a std::optional or std::experimental::optional.c                    s   t || _t| j| _|d }| jdr8|d }|}n*|d }|d }z|d }W n   Y n0 t|}|std }tt| || d S )N
_M_payloadzstd::experimental
_M_engaged_M_value)	rC   rj   rT   rD   r   r   rY  rg  rb   )r   rL   ra   ZpayloadZengagedrZ  r[  r_  r   r	   rb     s$    


zStdExpOptionalPrinter.__init__c                 C   s:   | j d u rd| j S t| jdr4d| j| j f S | jS )Nra  rm   z%s containing %s)rI  rj   r   r   ru   r   r   r   r	   ru     s    

zStdExpOptionalPrinter.to_stringr   r   r   r   rb   ru   rf  r   r   r_  r	   rg    s   rg  c                       s(   e Zd ZdZ fddZdd Z  ZS )StdVariantPrinterzPrint a std::variant.c                    s   t |j}t|| _|d | _| jt|kr<d | _d }d }n@|t| j | _|d d d j}|	| j
  }t|}tt| ||d d S )N_M_indexZ_M_ur	  r   r   )r\   r#   rC   rj   _indexr!   rV  r   r   rp   ro   r   r   r   rY  rl  rb   )r   rL   ra   ZalternativesrZ  r[  Zaddrr_  r   r	   rb     s     




zStdVariantPrinter.__init__c                 C   sH   | j d u rd| j S t| jdr8d| j| j| j f S d| j| jf S )Nra  rm   z%s [index %d] containing %sz%s [index %d])rI  rj   r   r   rn  ru   r   r   r   r	   ru     s    


zStdVariantPrinter.to_stringrk  r   r   r_  r	   rl    s   rl  c                       s(   e Zd ZdZ fddZdd Z  ZS )StdNodeHandlePrinterzPrint a container node handle.c                    s   |j d| _|j dd}t|jd| _|j d| jk| _|d }|r~| jrbt| }nt	|d | j}t
|}nd }d }|d }|d r|d	 nd | _tt| ||d
 d S )Nr0   r   r   r   ri   r   Z_M_allocri  rh  r   )r#   r<   _value_typerJ   r&   _is_rb_tree_node_is_map_noder   r   r   r   r   Z_allocrY  ro  rb   )r   rL   ra   r   ZnodeptrrZ  r[  Zoptallocr_  r   r	   rb     s.    zStdNodeHandlePrinter.__init__c                 C   sf   d}| j s|d7 }| jr"|d7 }n|d7 }| jrZ|d7 }t| jdrVd|| j f S |S d| S d S )	Nznode handle for z
unordered r   setz with elementrm   %s = %sr   )rq  rr  rI  r   r   ru   )r   rb  r   r   r	   ru   	  s    
zStdNodeHandlePrinter.to_stringrk  r   r   r_  r	   ro    s   ro  c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	StdExpStringViewPrinterzP
    Print a std::basic_string_view or std::experimental::basic_string_view
    c                 C   s
   || _ d S r   r^   rl   r   r   r	   rb      s    z StdExpStringViewPrinter.__init__c                 C   s6   | j d }| j d }t|dr*|j|dS |j|dS )NZ_M_str_M_lenr  r  )r_   r   r  r  )r   r  r!   r   r   r	   ru   #  s
    


z!StdExpStringViewPrinter.to_stringc                 C   s   dS r  r   r   r   r   r	   r   *  s    z$StdExpStringViewPrinter.display_hintNr  r   r   r   r	   ru    s   ru  c                   @   s@   e Zd ZdZdd Zdd Zdd ZG dd	 d	eZd
d Z	dS )StdExpPathPrinterz,Print a std::experimental::filesystem::path.c                 C   sB   || _ || _| j d d d }| j d d d }t|| | _d S )N_M_cmptsr   r   r   )r_   rj   r   
_num_cmpts)r   rL   ra   r   r   r   r   r	   rb   1  s
    zStdExpPathPrinter.__init__c                 C   s:   t | jd }|dd  dkr"dS |dd  dkr6dS d S )NZ_M_type	_Root_dirroot-directory
_Root_name	root-name)r%   r_   r   r   r   r	   
_path_type8  s    zStdExpPathPrinter._path_typec                 C   s8   d| j d  }| jdkr0|  }|r0d||f }d| S )Nr   _M_pathnamer   %s [%s]z!experimental::filesystem::path %s)r_   ry  r  r   pathr7   r   r   r	   ru   @  s    
zStdExpPathPrinter.to_stringc                   @   s$   e Zd Zdd Zdd Zdd ZdS )zStdExpPathPrinter._iteratorc                 C   s,   || _ |d d | _|d d | _d| _d S )Nr   r   r   r   )	_pathtyper   r   r   )r   Zcmptspathtyper   r   r	   rb   I  s    z$StdExpPathPrinter._iterator.__init__c                 C   s   | S r   r   r   r   r   r	   rc   O  s    z$StdExpPathPrinter._iterator.__iter__c                 C   sd   | j | jkrt| j  }| j}| jd | _| j d | _ |d }t| j| }|sX|}d| |fS Nr0   r  z[%s])r   r   re   r   r   rw  r  r  r   r   rN   r  r7   r   r   r	   r   R  s    
z$StdExpPathPrinter._iterator.__next__Nr   r   r   r   r	   r   H  s   r   c                 C   s   |  | jd | jS )Nrx  )r   r_   rj   r   r   r   r	   rm   _  s    zStdExpPathPrinter.childrenN
r   r   r   r   rb   r  ru   r   r   rm   r   r   r   r	   rw  .  s   rw  c                   @   s@   e Zd ZdZdd Zdd Zdd ZG dd	 d	eZd
d Z	dS )StdPathPrinterzPrint a std::filesystem::path.c                 C   sP   || _ || _t| j d d }|tdd@ | _| jdkrF|| _nd | _d S )Nrx  r   Z	uintptr_t   r   )r_   rj   r~   rp   r   r   r   _impl)r   rL   ra   r   r   r   r	   rb   f  s    
zStdPathPrinter.__init__c                 C   sH   t | jt| jd }|dd  dkr0dS |dd  dkrDdS d S )Nz::_Typerz  r{  r|  r}  r~  r  )r%   r   rp   r   r   rj   r   r   r   r	   r  p  s    zStdPathPrinter._path_typec                 C   s8   d| j d  }| jdkr0|  }|r0d||f }d| S )Nr   r  r   r  zfilesystem::path %s)r_   r   r  r  r   r   r	   ru   x  s    
zStdPathPrinter.to_stringc                   @   s$   e Zd Zdd Zdd Zdd ZdS )zStdPathPrinter._iteratorc           	      C   s   || _ |rtd}t|d }td}|| }| }ttjdrbtd|j	 |j
}n
d|j	 }|| | }|| | _| j| | _d| _nd | _d | _d S )Nr   z::_Cmptcharalignofr   r   )r  r   r   rp   ro   r   r   rB   maxr   r  r   r   r   )	r   r   r  Zint_typeZ	cmpt_type	char_typer  Zsizeof_Implbeginr   r   r	   rb     s     


z!StdPathPrinter._iterator.__init__c                 C   s   | S r   r   r   r   r   r	   rc     s    z!StdPathPrinter._iterator.__iter__c                 C   sd   | j | jkrt| j  }| j}| jd | _| j d | _ |d }t| j| }|sX|}d| |fS r  )r   r   re   r   r   r  r  r  r  r   r   r	   r     s    
z!StdPathPrinter._iterator.__next__Nr   r   r   r   r	   r     s   r   c                 C   s   |  | j| jS r   )r   r  rj   r   r   r   r	   rm     s    zStdPathPrinter.childrenNr  r   r   r   r	   r  c  s   
(r  c                   @   s8   e Zd ZdZdd ZG dd deZdd Zdd	 Zd
S )StdPairPrinterz@Print a std::pair object, with 'first' and 'second' as children.c                 C   s
   || _ d S r   r^   rl   r   r   r	   rb     s    zStdPairPrinter.__init__c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	zStdPairPrinter._iterz?An iterator for std::pair types. Returns 'first' then 'second'.c                 C   s   || _ d| _d S )Nr   )r_   _whichr`   r   r   r	   rb     s    zStdPairPrinter._iter.__init__c                 C   s   | S r   r   r   r   r   r	   rc     s    zStdPairPrinter._iter.__iter__c                 C   s8   | j d u rt| j }|dkr$d| _ nd | _ || j| fS rC  )r  re   r_   )r   Zwhichr   r   r	   r     s    
zStdPairPrinter._iter.__next__Nrf   r   r   r   r	   r     s   r   c                 C   s   |  | jS r   )r   r_   r   r   r   r	   rm     s    zStdPairPrinter.childrenc                 C   s   d S r   r   r   r   r   r	   ru     s    zStdPairPrinter.to_stringN)	r   r   r   r   rb   r   r   rm   ru   r   r   r   r	   r    s
   r  c                   @   s    e Zd ZdZdd Zdd ZdS )StdCmpCatPrinterz#Print a comparison category object.c                 C   s&   || dd d  | _|d | _d S )N:r0   rj  )rfindrj   r_   rl   r   r   r	   rb     s    zStdCmpCatPrinter.__init__c                 C   sD   | j dkr| jdkrd}nddddd}|t| j }d	| j |S )
Nstrong_orderingr   ZequalZ	unorderedZlessZ
equivalentZgreater)r   rv   r   r0   zstd::{}::{})rj   r_   r   r1   )r   r&   namesr   r   r	   ru     s
    zStdCmpCatPrinter.to_stringNr   r   r   r   r	   r    s   r  c                   @   s`   e Zd ZdZdZdd Zedd Zedd Z	ed	d
 Z
edd Zedd Zdd ZdS )StdErrorCodePrinterz0Print a std::error_code or std::error_condition.Nc                 C   sJ   || _ t|| _tjd u rFzdd l}dt_W n tyD   dt_Y n0 d S )Nr   TF)r_   rC   rj   r  _system_is_posixposixImportError)r   rL   ra   r  r   r   r	   rb     s    


zStdErrorCodePrinter.__init__c                 C   s&   t | }|d ur"|jt jkr"|S d S r   )r   r   r   ZTYPE_CODE_ENUM)r&   r'   r   r   r	   _find_errc_enum  s    
z#StdErrorCodePrinter._find_errc_enumc              	   C   sB   dt fD ]4}zd||}| |W   S  ty:   Y q0 qd S )NrK   z	std::{}{})r4   r1   r  r   )clsr&   nsZqnamer   r   r	   _find_standard_errc_enum  s    z,StdErrorCodePrinter._find_standard_errc_enumc           	      C   s   g d}|D ]z}|d }dt fD ]d}d|}td||d }|d ur || jkr d| }| d||}||f    S q qd	S )
N)streamZsocketzip::resolverz_category()rK   zstd::{}experimental::net::v1z{}::{}::__cr   znet::z{}::{}_errc)NN)r4   r1   r   Zlookup_symbolvaluer   r  )	r  catZnet_catsr   r\  r  Zsymr&   enumr   r   r	   _match_net_ts_category  s    
z*StdErrorCodePrinter._match_net_ts_categoryc                 C   s   d}d}d}|  |\}}|dur.d|||fS |j }|jdrLd}d}|jdrbd}| j}|jdr|d	}| d
}|jdrd}| d}|du rzW n   Y n0 ||j||fS )z(Return details of a std::error_category.NFz::generic_error_categorygenericTz::system_error_categorysystemz::future_error_categoryZfutureZfuture_errcz::io_error_categoryioZio_errc)r  dynamic_typer   r   endswithr  r  )r  r  r&   r  is_errnor\  r'   r   r   r	   _category_info  s2    


z"StdErrorCodePrinter._category_infoc                 C   s   |  dd S )zX
        Strip any nested-name-specifier from name to give an unqualified name.
        r/   rv   )split)r&   r   r   r	   _unqualified_name7  s    z%StdErrorCodePrinter._unqualified_namec           	      C   s   | j d }| j d }| |\}}}}|dkrVddd}||| | j krV| jd S t|}|r|dkrztjt| }W q   Y q0 n|d ur| t||}|d urd| }n|}d	| j||f S )
Nrj  Z_M_catr   r  r  )
error_codeerror_conditionz = { }z"%s"z%s = {%s: %s})	r_   r  r  rj   r%   errnoZ	errorcoder   rp   )	r   r  r  r&   Zalt_namer  r  Zdefault_catsZstrvalr   r   r	   ru   >  s*    



zStdErrorCodePrinter.to_string)r   r   r   r   r  rb   r   r  classmethodr  r  r  r  ru   r   r   r   r	   r    s   



*
r  c                   @   s    e Zd ZdZdd Zdd ZdS )StdRegexStatePrinterz/Print a state node in the NFA for a std::regex.c                 C   s   || _ || _d S r   rG  rl   r   r   r	   rb   [  s    zStdRegexStatePrinter.__init__c                 C   s   t | jd }|r|dd  }| jd }ddddd d dddd d d d d}|| }d	||}|d ur| jd
|  d urd||| jd
|  }d| S )NZ	_M_opcode   r   ZaltZsubexprnegZbackref_index)repeatalternativeZsubexpr_beginZsubexpr_endZline_begin_assertionZline_end_assertionZword_boundaryZsubexpr_lookaheadZbackrefrG   ZacceptZdummyunknownzopcode={}, next={}Z_M_z	{}, {}={}z{%s})r%   r_   r1   )r   ZopcodeZnext_idZvariantsvr^  r   r   r	   ru   _  s"    
zStdRegexStatePrinter.to_stringNr   r   r   r   r	   r  X  s   r  c                   @   s@   e Zd ZdZG dd deZdd Zdd Zdd	 Zd
d Z	dS )StdSpanPrinterzPrint a std::span.c                   @   s$   e Zd Zdd Zdd Zdd ZdS )zStdSpanPrinter._iteratorc                 C   s   d| _ || _|| _d S r   )r   _beginr   )r   r  r  r   r   r	   rb   y  s    z!StdSpanPrinter._iterator.__init__c                 C   s   | S r   r   r   r   r   r	   rc   ~  s    z!StdSpanPrinter._iterator.__iter__c                 C   s8   | j | jkrt| j }| j d | _ d| | j|  fS )Nr0   r   )r   r   re   r  r   r9  r   r   r	   r     s
    z!StdSpanPrinter._iterator.__next__Nr   r   r   r   r	   r   x  s   r   c                 C   sL   t || _|| _td}|jd|kr:|d d | _n|jd| _d S )Nzstatic_cast<std::size_t>(-1)r0   Z	_M_extentZ_M_extent_value)rC   rj   r_   r   r"  r#   r<   r   )r   rL   ra   Zsize_maxr   r   r	   rb     s    

zStdSpanPrinter.__init__c                 C   s   d| j | jf S Nz%s of length %drj   r   r   r   r   r	   ru     s    zStdSpanPrinter.to_stringc                 C   s   |  | jd | jS rh   )r   r_   r   r   r   r   r	   rm     s    zStdSpanPrinter.childrenc                 C   s   dS r   r   r   r   r   r	   r     s    zStdSpanPrinter.display_hintN)
r   r   r   r   r   r   rb   ru   rm   r   r   r   r   r	   r  u  s   	r  c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )StdInitializerListPrinterzPrint a std::initializer_list.c                 C   s   || _ || _|d | _d S )Nrv  )rj   r_   r   rl   r   r   r	   rb     s    z"StdInitializerListPrinter.__init__c                 C   s   d| j | jf S r  r  r   r   r   r	   ru     s    z#StdInitializerListPrinter.to_stringc                 C   s   t | jd | jS )NZ_M_array)r  r   r_   r   r   r   r   r	   rm     s    z"StdInitializerListPrinter.childrenc                 C   s   dS r   r   r   r   r   r	   r     s    z&StdInitializerListPrinter.display_hintN)r   r   r   r   rb   ru   rm   r   r   r   r   r	   r    s
   r  c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	StdAtomicPrinterzPrint a std:atomic.c                 C   sr   t || _|| _d | _| jjd| _| jjd urnt | jj}|dsR|drn|d }t	||| _| j
| _d S )Nr   zstd::shared_ptr<zstd::weak_ptr<r   )rC   rj   r_   _shptr_printerr#   r<   rp  r   rD   rg   _shptr_childrenrm   )r   rL   ra   r'   r   r   r   r	   rb     s    

zStdAtomicPrinter.__init__c                 C   s   t | jjS r   )r]   r  rk   r   r   r   r	   r    s    z StdAtomicPrinter._shptr_childrenc                 C   s   | j d ur| j  S | jjtjkr.| jd }n`| jjtjkrH| jd }nF| jjtjkrf| jd d }n(| jjtj	kr| jd d }n
| jd }d| j
t| j|f S )Nrn   Z_M_fpZ_M_br   Z_M_basez%s<%s> = { %s })r  ru   rp  r   r   ZTYPE_CODE_INTr_   TYPE_CODE_FLTTYPE_CODE_PTRr   rj   r%   r`   r   r   r	   ru     s    


zStdAtomicPrinter.to_stringN)r   r   r   r   rb   r  ru   r   r   r   r	   r    s   r  c                   @   s    e Zd ZdZdd Zdd ZdS )StdFormatArgsPrinterzPrint a std::basic_format_args.c                 C   s   t || _|| _d S r   r   rl   r   r   r	   rb     s    
zStdFormatArgsPrinter.__init__c                 C   s   t | jj}t |d d }|tdkr0d}n|tdkrDd}nd}| jd }|dkrbd	| S |dkrt| jd
 }d||f S )Nr   r0   r  zstd::format_argswchar_tzstd::wformat_argszstd::basic_format_argsZ_M_packed_sizez%s with 1 argumentZ_M_unpacked_sizez%s with %d arguments)r\   r_   r#   r   r   )r   Ztargsr  r'   r  r   r   r	   ru     s    

zStdFormatArgsPrinter.to_stringNr   r   r   r   r	   r    s   r  c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )StdChronoDurationPrinterzPrint a std::chrono::duration.c                 C   s   t || _|| _d S r   r   rl   r   r   r	   rb     s    
z!StdChronoDurationPrinter.__init__c                 C   s*   | j jd}|d}|d}||fS )Nr0   r   )r_   r#   r<   )r   Zperiodr   denr   r   r	   _ratio  s    

zStdChronoDurationPrinter._ratioc                 C   s   |   \}}|dkrF|dkr dS |dkr,dS |dkr8dS |dkr|dS n6|dkr||d	krZd
S |dkrfdS |dkrrdS d|S d||S )Nr0   r^  i  Zmsi@B usi ʚ;r  <   mini  hiQ dz[{}]sz[{}/{}]s)r  r1   )r   r   r  r   r   r	   _suffix  s&    
z StdChronoDurationPrinter._suffixc                 C   s4   | j d }|j jtjkr$d| }d||  S )N__rz%gz"std::chrono::duration = {{ {}{} }})r_   r#   r   r   r   r  r1   r  )r   rr   r   r	   ru     s    
z"StdChronoDurationPrinter.to_stringN)r   r   r   r   rb   r  r  ru   r   r   r   r	   r    s
   r  c                   @   s*   e Zd ZdZdd Zdd Zd
ddZd	S )StdChronoTimePointPrinterz Print a std::chrono::time_point.c                 C   s   t || _|| _d S r   r   rl   r   r   r	   rb     s    
z"StdChronoTimePointPrinter.__init__c                 C   sv   | j jd}t|j}|dks(|dkr,dS |dkr8dS |dkrDdS |d	krPd
S |dkr\dS |dkrhdS d|d fS )Nr   zstd::chrono::_V2::system_clockzstd::chrono::system_clock)zstd::chrono::sys_timer   zstd::chrono::utc_clock)zstd::chrono::utc_timeNzstd::chrono::gps_clock)zstd::chrono::gps_timeNzstd::chrono::tai_clock)zstd::chrono::tai_timeNzstd::filesystem::__file_clock)zstd::chrono::file_timel    um zstd::chrono::local_t)zstd::chrono::local_timer   z{} time_point)r_   r#   r<   rC   r&   r1   )r   clockr&   r   r   r	   _clock  s"    
z StdChronoTimePointPrinter._clockFc                 C   s   |   \}}| jd }|d }t|jj|}| }d}|d ur| \}	}
||	 |
 | }ztj|t	}d
|}W n   Y n0 d|||f }|r|S d||f S )NZ__dr  rK   z [{:%Y-%m-%d %H:%M:%S}]z%d%s%sz%s = { %s })r  r_   r  r#   r&   r  r  r   Zfromtimestamp_utc_timezoner1   )r   Zabbrevr  offsetr  r  printersuffixtimer   r  Zsecsr   r^  r   r   r	   ru   1  s$    
z#StdChronoTimePointPrinter.to_stringN)F)r   r   r   r   rb   r  ru   r   r   r   r	   r    s   r  c                   @   s    e Zd ZdZdd Zdd ZdS )StdChronoZonedTimePrinterz Print a std::chrono::zoned_time.c                 C   s   t || _|| _d S r   r   rl   r   r   r	   rb   I  s    
z"StdChronoZonedTimePrinter.__init__c                 C   s@   | j d  d }| j d }t|jj|}|d}d||S )NZ_M_zone_M_nameZ_M_tpTz%std::chrono::zoned_time = {{ {} {} }})r_   r   r  r#   r&   ru   r1   )r   Zzoner  r  r   r   r	   ru   M  s
    

z#StdChronoZonedTimePrinter.to_stringNr   r   r   r   r	   r  F  s   r  )NZJanuaryZFebruaryZMarchZAprilZMayZJuneZJulyZAugustZ	SeptemberZOctoberZNovemberZDecember)SundayZMondayZTuesdayZ	WednesdayZThursdayZFridayZSaturdayr  c                   @   s    e Zd ZdZdd Zdd ZdS )StdChronoCalendarPrinterzDPrint a std::chrono::day, std::chrono::month, std::chrono::year etc.c                 C   s   t || _|| _d S r   r   rl   r   r   r	   rb   _  s    
z!StdChronoCalendarPrinter.__init__c           	      C   sv  | j }| j}d|v r$|dkr$|d }|dr6|d }|dkrPdt|d S |d	kr||d
k sl|ttkrtd| S t| S |dkrd|S |dkr|d }|dk s|ttkrd| S dt| S |dkrd|d t|d S |dkrd|d S |dkrd||d S |dkr,d|S |dkrFd||d S |dkr`d||d S |dkrvd||S |dkrd |||d S |dkrd||d! S |d"krd |||d S |d#krd |||d S |d$rrd%}|d& dkr"d't|d( d) t|d& }t|d* d+ }t|d d+ }t|d, d+ }|d- rb| }d.||||S d S )/Nmonthz std::chrono::year_month_day_lastZ_M_mzstd::chrono::yearZ_M_yzstd::chrono::dayz{}Z_M_dzstd::chrono::monthr0   z%d is not a valid monthz{}yzstd::chrono::weekdayZ_M_wdr   z%d is not a valid weekdayzstd::chrono::weekday_indexedz{}[{}]rm  zstd::chrono::weekday_lastz{}[last]zstd::chrono::month_dayz{}/{}zstd::chrono::month_day_lastz{}/lastzstd::chrono::month_weekdayZ_M_wdizstd::chrono::month_weekday_lastZ_M_wdlzstd::chrono::year_monthzstd::chrono::year_month_dayz{}/{}/{}Z_M_mdlzstd::chrono::year_month_weekdayz$std::chrono::year_month_weekday_lastzstd::chrono::hh_mm_ssrK   Zfractional_widthz.{:0{}d}Z_M_ssZ_M_rr4  r  _M_sZ	_M_is_negz{:02}:{:02}:{:02}{})r_   rj   rD   r1   r   r!   monthsweekdays)	r   ra   r'   r]  yZwdZfractr  r^  r   r   r	   ru   c  sj    













z"StdChronoCalendarPrinter.to_stringNr   r   r   r   r	   r  \  s   r  c                   @   s    e Zd ZdZdd Zdd ZdS )StdChronoTimeZonePrinterz4Print a chrono::time_zone or chrono::time_zone_link.c                 C   s   t || _|| _d S r   r   rl   r   r   r	   rb     s    
z!StdChronoTimeZonePrinter.__init__c                 C   s6   d| j | jd f }| j dr2|d| jd  7 }|S )Nrt  r  Z_linkz -> %sZ	_M_target)rj   r_   r  )r   r%   r   r   r	   ru     s    z"StdChronoTimeZonePrinter.to_stringNr   r   r   r   r	   r    s   r  c                   @   s    e Zd ZdZdd Zdd ZdS )StdChronoLeapSecondPrinterzPrint a chrono::leap_second.c                 C   s   t || _|| _d S r   r   rl   r   r   r	   rb     s    
z#StdChronoLeapSecondPrinter.__init__c                 C   s.   | j d d }d|dk  }d| jt||f S )Nr  r  z+-r   z
%s %d (%c))r_   rj   abs)r   dater  r   r   r	   ru     s    z$StdChronoLeapSecondPrinter.to_stringNr   r   r   r   r	   r    s   r  c                   @   s    e Zd ZdZdd Zdd ZdS )StdChronoTzdbPrinterzPrint a chrono::tzdb.c                 C   s   t || _|| _d S r   r   rl   r   r   r	   rb     s    
zStdChronoTzdbPrinter.__init__c                 C   s   d| j | jd f S )Nz%s %sversion)rj   r_   r   r   r   r	   ru     s    zStdChronoTzdbPrinter.to_stringNr   r   r   r   r	   r    s   r  c                   @   s    e Zd ZdZdd Zdd ZdS )StdChronoTimeZoneRulePrinterzPrint a chrono::time_zone rule.c                 C   s   t || _|| _d S r   r   rl   r   r   r	   rb     s    
z%StdChronoTimeZoneRulePrinter.__init__c           
      C   s   | j d }|d }t|d  }dddddddd}|d }d	|||d
}|dkrdd||}nVt|d  }|dkrd||}n4|dkrd}	nd}	|d }d|	d ||	d ||}d| j d | j d | j d |S )Nonkindr  stZndZrd)r0   r   r              Zday_of_monthz{}{}Zthr   z{} {}Zday_of_weekr0   zlast {} in {}r   )r  z<=)r   z>=z{} {} {} {} {}z.time_zone rule {} from {} to {} starting on {}r&   fromto)r_   r  r1   getr  )
r   r  r  r  suffixesdayZordinal_dayr   weekday	directionr   r   r	   ru     s0    
z&StdChronoTimeZoneRulePrinter.to_stringNr   r   r   r   r	   r    s   r  c                   @   s    e Zd ZdZdd Zdd ZdS )StdLocalePrinterzPrint a std::locale.c                 C   s   || _ || _d S r   rG  rl   r   r   r	   rb     s    zStdLocalePrinter.__init__c                    st  | j d d }d}|d dkr&d}nBt| jd }t| jd }|d  }|d  }d||}||i}d	}	|	|k r||	 dkr||	  }||	  }d
|||}|||< |	d	 }	qvt| }
t|
d	kr|}nt|
dkrh|
\}}t	| }d  |
|d	kr |}| n|
|d	kr8|}|  d urht fdd| D }d| }d||S )Nr   Z_M_namesrK   r   *z::_S_categoriesz::_S_categories_sizez{}={}r0   z{};{}={}r   c                 3   s   | ]\}}| kr|V  qd S r   r   )r+   r   rZ   otherr   r	   	<genexpr>	  r.   z-StdLocalePrinter.to_string.<locals>.<genexpr>z with "{}={}"zstd::locale = "{}"{})r_   r   r"  rj   r  r1   rs  valuesr!   r   rN   r
   items)r   r  modr&   ZcatsZncatrZ   r  Z	cat_namesr<  Z
uniq_namesZn1Zn2Z	name_listr   r  r	   ru     sD    

zStdLocalePrinter.to_stringNr   r   r   r   r	   r    s   r  c                   @   s    e Zd ZdZdd Zdd ZdS )StdIntegralConstantPrinterz*Print a std::true_type or std::false_type.c                 C   s   || _ || _d S r   rG  rl   r   r   r	   rb   	  s    z#StdIntegralConstantPrinter.__init__c                 C   sL   | j jd}| j jd}|jtjkr4|r0dS dS t| j}d|||S )Nr   r0   zstd::true_typezstd::false_typez
{}<{}, {}>)	r_   r#   r<   r   r   r   rC   rj   r1   )r   r;   r  rL   r   r   r	   ru   	  s    
z$StdIntegralConstantPrinter.to_stringNr   r   r   r   r	   r  	  s   r  c                   @   s    e Zd ZdZdd Zdd ZdS )StdTextEncodingPrinterzPrint a std::text_encoding.c                 C   s   || _ || _d S r   rG  rl   r   r   r	   rb   $	  s    zStdTextEncodingPrinter.__init__c                 C   s<   | j d  }|d dkr$| j d S |d dkr4dS |d S )NZ_M_repZ_M_idr0   r  r   r  )r_   r   )r   Zrepr   r   r	   ru   (	  s    
z StdTextEncodingPrinter.to_stringNr   r   r   r   r	   r   !	  s   r   c                       s$   e Zd Z fddZdd Z  ZS )	RxPrinterc                    s$   t t|   || _|| _d| _d S NT)rY  r  rb   r&   	_functionenabled)r   r&   rR  r_  r   r	   rb   3	  s    zRxPrinter.__init__c                 C   s:   | j s
d S |jjtjkr,ttjdr,| }| | j	|S )Nreferenced_value)
r  r#   r   r   r  r   Valuer  r  r&   )r   r  r   r   r	   invoke9	  s    zRxPrinter.invoke)r   r   r   rb   r  rf  r   r   r_  r	   r  2	  s   r  c                       sH   e Zd Z fddZdd Zdd Zdd Zed	d
 Zdd Z	  Z
S )Printerc                    s6   t t|   || _g | _i | _d| _td| _	d S )NTz^([a-zA-Z0-9_:]+)(<.*>)?$)
rY  r  rb   r&   _subprinters_lookupr  rF   compile_compiled_rx)r   r&   r_  r   r	   rb   H	  s    zPrinter.__init__c                 C   s<   | j |std| t||}| j| || j|< d S )Nz0libstdc++ programming error: "%s" does not match)r  rG   r$   r  r	  rX   r
  )r   r&   rR  r  r   r   r	   addP	  s    
zPrinter.addc                 C   s>   |  || | d|vr:tddt |}|  || | d S )N__cxx11z^(std|__gnu_cxx)::z\g<0>%s)r  rF   rQ   r4   )r   baser&   rR  Zvbaser   r   r	   add_version[	  s    zPrinter.add_versionc                 C   s$   |  ||| |  |d || d S )Nz__cxx1998::)r  )r   r  r&   rR  r   r   r	   add_containerc	  s    zPrinter.add_containerc                 C   s&   | j tjkr|  } |   } | jS r   )r   r   r  r   r  r   r   )r#   r   r   r	   get_basic_typeg	  s    zPrinter.get_basic_typec                 C   sr   |  |j}|sd S | j|}|s(d S |d}|jjtjkrTttj	drT|
 }|| jv rn| j| |S d S )Nr0   r  )r  r#   r  rG   rW  r   r   r  r   r  r  r
  r  )r   ra   rL   rG   basenamer   r   r	   __call__r	  s    

zPrinter.__call__)r   r   r   rb   r  r  r  r   r  r  rf  r   r   r_  r	   r  G	  s   

r  c                   @   s0   e Zd ZdZdd ZG dd deZdd ZdS )	TemplateTypePrinteral  
    A type printer for class templates with default template arguments.

    Recognizes specializations of class templates and prints them without
    any template arguments that use a default template argument.
    Type printers are recursively applied to the template arguments.

    e.g. replace 'std::vector<T, std::allocator<T> >' with 'std::vector<T>'.
    c                 C   s   || _ || _d| _d S r  )r&   _defargsr  r   r&   defargsr   r   r	   rb   	  s    zTemplateTypePrinter.__init__c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	zTemplateTypePrinter._recognizerz-The recognizer class for TemplateTypePrinter.c                 C   s   || _ || _d S r   )r&   r  r  r   r   r	   rb   	  s    z(TemplateTypePrinter._recognizer.__init__c           	   	   C   s   |j du rdS |j | js dS t|}g }d}tt|D ]}|| }| j|}|dur|j| }z|t	
|kr~W  dS W n& t	jy   |j |krY  dS Y n0 d}q<|r dS || | q<|j d|j d }t|}|d d| d S )a  
            If type_obj is a specialization of self.name that uses all the
            default template arguments for the class template, then return
            a string representation of the type without default arguments.
            Otherwise, return None.
            NFTr   <r*   >)r   rD   r&   r\   ranger!   r  r  r1   r   r   r3   rX   _recognize_subtyper  rW   r2   )	r   rY   r[   Zdisplayed_argsZrequire_defaultedrZ   rt   ZdefargrI   r   r   r	   	recognize	  s2    


z)TemplateTypePrinter._recognizer.recognizec                 C   s   |j tjkr| | d S |j tjkrj| | }t| drR|d S d||	 d d f S |j tj
kr| | d S ttdr|j tjkr| | d S tjtj |}|r|S t|S )zxConvert a gdb.Type to a string by applying recognizers,
            or if that fails then simply converting to a string.r  z[]z%s[%d]r0   &TYPE_CODE_RVALUE_REFz&&)r   r   r  r  r   r   r%   r   r  r  r  r   r  rM  rN  rO  )r   rY   rV   r   r   r	   r  	  s$    

z2TemplateTypePrinter._recognizer._recognize_subtypeN)r   r   r   r   rb   r  r  r   r   r   r	   _recognizer	  s   1r   c                 C   s   |  | j| jS z1Return a recognizer object for this type printer.)r   r&   r  r   r   r   r	   instantiate	  s    zTemplateTypePrinter.instantiateNr   r   r   r   rb   objectr   r"  r   r   r   r	   r  	  s   
Pr  c                    s   t d| |}tj| | t d| |}tj| | d|vrdt  t fdd| D }t  | |}tj| | t d| |}tj| | dS )a  
    Add a type printer for a class template with default template arguments.

    Args:
        name (str): The template-name of the class template.
        defargs (dict int:string) The default template arguments.

    Types in defargs can refer to the Nth template-argument using {N}
    (with zero-based indices).

    e.g. 'unordered_map' has these defargs:
    { 2: 'std::hash<{0}>',
      3: 'std::equal_to<{0}>',
      4: 'std::allocator<std::pair<const {0}, {1}> >' }
    r:   zstd::__debug::r  c                 3   s"   | ]\}}|| d  fV  qdS )r:   N)r5   )r+   rZ   r  r  r   r	   r  
  s   z0add_one_template_type_printer.<locals>.<genexpr>N)r  r   rM  register_type_printerr4   dictr  )objr&   r  r  r   r%  r	   add_one_template_type_printer	  s    r)  c                   @   s2   e Zd ZdZd	ddZG dd deZdd ZdS )
FilteringTypePrintera  
    A type printer that uses typedef names for common template specializations.

    Args:
        template (str): The class template to recognize.
        name (str): The typedef-name that will be used instead.
        targ1 (str, optional): The first template argument. Defaults to None.

    Checks if a specialization of the class template 'template' is the same type
    as the typedef 'name', and prints it as 'name' instead.

    e.g. if an instantiation of std::basic_istream<C, T> is the same type as
    std::istream then print it as std::istream.

    If targ1 is provided (not None), match only template specializations with
    this type as the first template argument, e.g. if template='basic_string'
    and targ1='char' then only match 'basic_string<char,...>' and not
    'basic_string<wchar_t,...>'. This rejects non-matching specializations
    more quickly, without needing to do GDB type lookups.
    Nc                 C   s   || _ || _|| _d| _d S r  )	_templater&   _targ1r  r   templater&   targ1r   r   r	   rb   -
  s    zFilteringTypePrinter.__init__c                   @   s    e Zd ZdZdd Zdd ZdS )z FilteringTypePrinter._recognizerz.The recognizer class for FilteringTypePrinter.c                 C   s   || _ || _|| _d | _d S r   )r+  r&   r,  	_type_objr-  r   r   r	   rb   6
  s    z)FilteringTypePrinter._recognizer.__init__c                 C   s   |j du rdS | jdu rz| jdurDd| j| j}|j |sVdS n|j | jsVdS zt| j	 | _W n   Y n0 | jdu rdS tj
| j}tj
|}||krt| jS | jdd dkr| jj dd}|j dd}||krt| jS dS )z
            If type_obj starts with self._template and is the same type as
            self.name then return self.name, otherwise None.
            Nz{}<{}r/   rv   basic_string	__cxx11::rK   )r   r0  r,  r1   r+  rD   r   r   r&   r   rM  r  rW   r  r5   )r   rY   r^  t1t2s1s2r   r   r	   r  <
  s6    





z*FilteringTypePrinter._recognizer.recognizeN)r   r   r   r   rb   r  r   r   r   r	   r   3
  s   r   c                 C   s   |  | j| j| jS r!  )r   r+  r&   r,  r   r   r   r	   r"  f
  s    z FilteringTypePrinter.instantiate)Nr#  r   r   r   r	   r*  
  s   
3r*  c                 C   sX   t d| d| |}tj| | d|vrTdt }t || || |}tj| | d S )Nr:   r  )r*  r   rM  r&  r4   )r(  r.  r&   r/  r  r  r   r   r	   add_one_type_printerk
  s    r7  c                 C   s8  t sd S dD ]p}t| d|d d |d  t| d|d d |d  t| dd|d  d |d  t| d|d d	 |d  qd
D ]r}dD ]"}t| d| |d | |d  qdD ]@}t| d| |d | |d  t| d| |d | |d  qqdD ]z}d
D ](}t| |d ||d  d |d  qdD ]B}t| |d || d  dD ]}t| || || |  qPq0qt| dd dD ]}t| dd|  qt| dd t| dd t| dd t| dd  t| d!d" t| d!d# t| d$d% t| d$d& t| d'd( d)}dD ](}t| |d ||d  d	 |d  qt| d*dd+i t| d,dd-i t| d.dd-i t| d/dd-i t| d0dd-i t| d1dd-i t| d2d3d4d5 t| d6d3d4d5 t| d7d3d-d8 t| d9d3d-d8 t| d:d;d<d4d= t| d>d;d<d4d= t| d?d;d<d-d@ t| dAd;d<d-d@ d S )BN)rK   r  r   r  )u8Zchar8_t)u16Zchar16_t)u32Zchar32_tr1  r   r  r0   z__cxx11::basic_stringr2  basic_string_viewZstring_view)r8  r9  )	Ziosr  ZistreamZostreamZiostreamZfilebufZifstreamZofstreamZfstreambasic_)Z	stringbufistringstreamostringstreamstringstreamz__cxx11::basic_)rK   r2  Zbasic_regexZregex)r   r^  ZwcZwsZmatch_resultsrG   )Z	sub_matchZregex_iteratorZregex_token_iteratorZfposZ	streampos)
ZnanosecondsZmicrosecondsZmillisecondsZsecondsZminutesZhoursZdaysZweeksZyearsr  zchrono::durationzchrono::Zlinear_congruential_engineZminstd_rand0Zminstd_randZmersenne_twister_engineZmt19937Z
mt19937_64Zsubtract_with_carry_engineZranlux24_baseZranlux48_baseZdiscard_block_engineZranlux24Zranlux48Zshuffle_order_engineZknuth_bzexperimental::fundamentals_v1::
unique_ptrzstd::default_delete<{0}>dequezstd::allocator<{0}>r   r   z__cxx11::listvectorr   zstd::less<{0}>z)std::allocator<std::pair<{0} const, {1}>>)r   r  multimaprs  )r0   r   multisetunordered_mapzstd::hash<{0}>zstd::equal_to<{0}>)r   r     unordered_multimapunordered_set)r0   r   r  unordered_multiset)rL  r7  r)  )r(  ZchrH   ZabiZdurr  r   r   r	   register_type_printerst
  s     "
"


rL  c                 C   s8   t rtj| t n| du r t} | jt t|  dS )z4Register libstdc++ pretty-printers with objfile Obj.N)_use_gdb_ppr   ZprintingZregister_pretty_printerlibstdcxx_printerZpretty_printersrX   rL  )r(  r   r   r	   register_libstdcxx_printers
  s    rO  c                  C   sP  t datddt tddt tddt tddt tddt tddt tddt tdd	t tdd
t	 tddt
 tddt tddt tddt tddt	 tddt tddt tddt tddt ttjdr.tddt tddt tdt tdt tdt tdt tdt tdt	 tdt	 tdt tddt tdd t tdd!t tdd"t tdd#t tdd$t tdd%t td&dt td&d t td&d!t td&d"t td&d#t td&d$t tdd't tdd(t tdd)t tdd)t d*D ]*} tdd+|  t tdd+|  t qtd,d-t td,d.t tdd/t td0d1t  td2t td3t td4t td5t td6t td7d8t! td7d9t" td7d:t# td;d<t$ td=d<t$ td>d<t% td?d<t% tdd8t! tdd9t" tdd:t# tdd@t& tddAt' tddBt( tddCt( tddDt( tddEt) tddFt* dGD ]}td,|t+ qtd,dHt, td,dIt, td,dJt- td,dKt. td,dLt/ tddMt0 tdNdOt1 tddPt2 tddQt2 tddRt3 tddSt3 tddTt4 tddUt4 tdNdVt5 tddWt6 tddXt6 tddYt7 tdNdZt8 tdd[t9 tdd\t9 td]t: d S )^Nzlibstdc++-v6r:   r1  rU   ZbitsetrC  r   r   rE  rF  ZpairZpriority_queueZqueuer}   rs  stackrB  rD  Zlocaler  r  r  zstd::__debug::bitsetzstd::__debug::dequezstd::__debug::listzstd::__debug::mapzstd::__debug::multimapzstd::__debug::multisetzstd::__debug::setzstd::__debug::vectorZ
shared_ptrZweak_ptrrG  rJ  rI  rK  r   z
std::tr1::Zinitializer_listZatomicZbasic_stringbuf)r?  r@  rA  r>  zstd::chrono::ZdurationZ
time_pointZintegral_constantzstd::__detail::Z_Statezstd::__debug::unordered_mapzstd::__debug::unordered_setz std::__debug::unordered_multimapz std::__debug::unordered_multisetzstd::__debug::forward_listz$std::experimental::fundamentals_v1::anyZoptionalr=  z#std::experimental::filesystem::v1::r  z,std::experimental::filesystem::v1::__cxx11::zstd::filesystem::zstd::filesystem::__cxx11::ZvariantZ_Node_handleZpartial_orderingZweak_orderingr  spanZbasic_format_args)r  r  Zyearr  Zweekday_indexedZweekday_lastZ	month_dayZmonth_day_lastZmonth_weekdayZmonth_weekday_lastZ
year_monthZyear_month_dayZyear_month_day_lastZyear_month_weekdayZyear_month_weekday_lastZhh_mm_ssZ	time_zoneZtime_zone_linkZ
zoned_timeZleap_secondZtzdbZtext_encodingz__gnu_cxx::ZslistZ_List_iteratorZ_List_const_iteratorZ_Rb_tree_iteratorZ_Rb_tree_const_iteratorZ_Deque_iteratorZ_Deque_const_iteratorZ__normal_iteratorZ_Bit_iteratorZ_Bit_const_iteratorZ_Bit_referenceZ_Slist_iteratorZ_Fwd_list_iteratorZ_Fwd_list_const_iteratorz__gnu_debug::_Safe_iterator);r  rN  r  r  r  r   r   r   r   r   r  r   r   r   r   r  r   r   r  r  r  rg   rA  r1  rF  r  r  r  r  r  r  r  r  rT  rg  ru  rw  r  rl  ro  r  r  r  r  r  r  r  r  r   r   r   r   r  r   r   r   r   r   r   )Zsstreamr   r   r   r	   build_libstdcxx_dictionary
  s   

rS  )N)vr   r?  rF   rO   r  r   rP   r$  r   r   r   zipr   r   r
  timezoneZutcr  Ztzinfor   rM  Zgdb.printingr  rL  Z	gdb.typesr   rM  r   Zprinter_baser)   r4   r9   r@   r=   rJ   rC   rT   rW   r\   r]   rg   ry   r{   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r%  r+  r1  rA  rF  rH  rS  rT  rg  rl  ro  ru  rw  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  rN  r  r)  r*  r7  rL  rO  rS  r   r   r   r	   <module>   s   


%
(&"IU(*$/A" /%-^!,5I!{'$*/?",Ce%T
	o T