
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
h                @   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yd dlZ W n ek
r   d	aY nX d	ayd dlZ ee jd
rdaW n ek
r   Y nX ee dre 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ZadddddddddddddgZbddddddddg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   | j  S )N)__next__)self r   0/usr/share/gcc-8/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 jdS )Nr   )datetime	timedelta)r   dtr   r   r   	utcoffsetI   s    zUTC.utcoffsetc             C   s   dS )Nr   r   )r   r   r   r   r   tznameL   s    z
UTC.tznamec             C   s
   t jdS )Nr   )r   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   sz   | j  }xld|j|f }y
tj|S  tk
r6   Y nX |j }t|r^|d jr^|d j}q
t	dt
| |f q
W 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j | djdd |D }y
tj|S  tjk
r } zFt| krv|jddt d}y
tj|S  tjk
rt   Y nX |W Y dd}~X nX dS )z8
    Lookup template specialization templ<args...>.
    z{}<{}>z, c             S   s   g | ]}t |qS r   )r!   ).0ar   r   r   
<listcomp>   s    z%lookup_templ_spec.<locals>.<listcomp>z::   N)formatjoinr   r   error_versioned_namespacereplace)Ztemplargster   r   r   lookup_templ_spec   s    

r2   c             C   s   d| krd|  } yt |d}W n   |jd}Y nX |j }y
t| |S  tjk
r   t| drt|dddr| jdd	d
} y
t| |S  tjk
r   Y nX dS X 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>.
    z::zstd::
value_typer   Zstdzstd::__cxx1998zstd::__debugZ__gnu_debugz::__cxx1998::r)   N)r%   template_argumentr   r2   r   r,   is_member_of_namespacer.   )nodenameZcontainertypevaltyper   r   r   lookup_node_type   s&    


r8   c             G   s@   t | tjrt| } t| } x|D ]}| j|d r"dS q"W 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.
    z::TF)
isinstancer   Typer!   strip_versioned_namespace
startswith)r#   Z
namespaces	namespacer   r   r   r5      s    
r5   c             C   s2   t | tjr| j} dt|f }tjd| | dk	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)r9   r   r:   r   r-   rematch)xtemplate_namer   r   r   is_specialization_of   s    rB   c             C   s   | j tdS )N )r.   r-   )typenamer   r   r   r;      s    r;   c             C   s<   d}d}t jd dkr&tj||| dS tj||| ddS dS )zCRemove "fundamentals_vN" inline namespace from qualified type name.z&^std::experimental::fundamentals_v\d::zstd::experimental::r   r   r)   )countN)sysversion_infor>   sub)r#   patternreplr   r   r   strip_fundts_namespace   s
    rK   c             C   sV   t | } | jdd} d}x d	D ]}| j|| d |} qW |d }| j|d |} | S )
zARemove known inline namespaces from the canonical name of a type.zstd::__cxx11::zstd::zstd::experimental::fundamentals_v1fundamentals_v2z::zfilesystem::zv1::)rL   rM   )r;   r.   )type_strZexpt_nsZlfts_nsZfs_nsr   r   r   strip_inline_namespaces   s    
rO   c          	   C   s:   d}g }x,y|j | j| W n
   |S |d7 }q
W dS )z-Return a type's template arguments as a list.r   r)   N)appendr4   )type_objntemplate_argsr   r   r   get_template_arg_list   s    rT   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 )N)_val)r   valr   r   r   __init__  s    zSmartPtrIterator.__init__c             C   s   | S )Nr   )r   r   r   r   __iter__  s    zSmartPtrIterator.__iter__c             C   s$   | j d krtd | j  | _ }d|fS )Nzget())rV   StopIteration)r   rW   r   r   r   r   
  s    
zSmartPtrIterator.__next__N)r	   r
   r   r   rX   rY   r   r   r   r   r   rU     s   rU   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)r;   	_typenamerV   _pointer)r   rD   rW   r   r   r   rX     s    
zSharedPointerPrinter.__init__c             C   s
   t | jS )N)rU   r^   )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}|j|S | jd d S )Nzstd::atomicZ_M_refcountZ_M_val_M_ir   pointerZ_M_pi)r]   rV   r%   r   cast)r   Zptr_valZptr_typer   r   r   _get_refcounts  s    

z#SharedPointerPrinter._get_refcountsc             C   sp   d}| j  }| j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 %dr)   z%s<%s> (%s))rc   rV   r   r4   r;   r!   r]   )r   stateZ	refcountstargZusecountZ	weakcountr   r   r   	to_string(  s    
zSharedPointerPrinter.to_stringN)r	   r
   r   r   rX   r_   rc   rg   r   r   r   r   r[     s
   	r[   c             C   s   | j j }|d js&tdt| j  | j|d j }|j j }t|dkr^tdt| j  |d jdkrt|d S |d jr|j|d j S tdt| j  dS )zBReturn the tuple element stored in a _Tuple_impl<N, T> base class.r)   z-Unsupported implementation for std::tuple: %sr   _M_head_implNri   )r   r   r   r    r!   rb   r   r"   )rW   basesZ	head_baser   r   r   r   _tuple_impl_get9  s    



rk   c             C   sh   t t|j}| |krtd|j|jj d j}x*| dkr^|j|jj d j}| d8 } q6W t|S )z6Return the result of std::get<n>(val) on a std::tuple.z0Out of range index for std::get<N> on std::tupler   r)   )r   rT   r   r    rb   r   rk   )rR   rW   Z
tuple_sizenoder   r   r   	tuple_getQ  s    
rm   c             C   sd   | j j d j 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   rB   r    r!   rm   )rW   Z	impl_typeZtuple_memberr   r   r   unique_ptr_get_  s    



rp   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 )N)rV   )r   rD   rW   r   r   r   rX   t  s    zUniquePointerPrinter.__init__c             C   s   t t| jS )N)rU   rp   rV   )r   r   r   r   r_   w  s    zUniquePointerPrinter.childrenc             C   s   | j jjd}djt|S )Nr   zstd::unique_ptr<{}>)rV   r   r4   r*   r!   )r   r0   r   r   r   rg   z  s    zUniquePointerPrinter.to_stringN)r	   r
   r   r   rX   r_   rg   r   r   r   r   rq   q  s   rq   c             C   s   | d j j|j j S )z7Return the value held in a __gnu_cxx::__aligned_membuf.
_M_storage)addressrb   ra   dereference)Zbufr7   r   r   r   get_value_from_aligned_membuf  s    ru   c          
   C   sj   yF| j j d j}|dkr"| d S |dkrD| j jd}t| d |S W n   Y nX tdt| j  dS )z-Return the value held in an _List_node<_Val>.r)   _M_datarr   r   z!Unsupported implementation for %sN)r   r   r"   r4   ru   r    r!   )rl   memberr7   r   r   r   get_value_from_list_node  s    rx   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_basers   _head_count)r   nodetypeheadr   r   r   rX     s    
z!StdListPrinter._iterator.__init__c             C   s   | S )Nr   )r   r   r   r   rY     s    z!StdListPrinter._iterator.__iter__c             C   sR   | j | jkrt| j j| jj }|d | _ | j}| jd | _t|}d| |fS )Nrz   r)   z[%d])r|   r}   rZ   rb   r{   rt   r~   rx   )r   eltrE   rW   r   r   r   r     s    
z!StdListPrinter._iterator.__next__N)r	   r
   r   rX   rY   r   r   r   r   r   	_iterator  s   r   c             C   s   t || _|| _d S )N)r;   r]   rV   )r   rD   rW   r   r   r   rX     s    
zStdListPrinter.__init__c             C   s(   t d| jjj }| j|| jd d S )N
_List_node_M_impl_M_node)r8   rV   r   ra   r   )r   r   r   r   r   r_     s    zStdListPrinter.childrenc             C   s0   | j d d }|d |jkr&d| j S d| j S )Nr   r   rz   zempty %sz%s)rV   rs   r]   )r   Zheadnoder   r   r   rg     s    
zStdListPrinter.to_stringN)	r	   r
   r   r   r   r   rX   r_   rg   r   r   r   r   ry     s
   ry   c               @   s   e Zd Zdd Zdd ZdS )NodeIteratorPrinterc             C   s$   || _ || _|| _t||j| _d S )N)rV   r]   	_contnamer8   r   r{   )r   rD   rW   Zcontnamer6   r   r   r   rX     s    zNodeIteratorPrinter.__init__c             C   s:   | j d sd| j S | j d j| jj j }tt|S )Nr   z(non-dereferenceable iterator for std::%s)rV   r   rb   r{   ra   rt   r!   rx   )r   rl   r   r   r   rg     s
    


zNodeIteratorPrinter.to_stringN)r	   r
   r   rX   rg   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 j| ||dd d S )Nlistr   )r   rX   )r   rD   rW   r   r   r   rX     s    zStdListIteratorPrinter.__init__N)r	   r
   r   r   rX   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 j| ||dd d S )Nforward_list_Fwd_list_node)r   rX   )r   rD   rW   r   r   r   rX     s    z"StdFwdListIteratorPrinter.__init__N)r	   r
   r   r   rX   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_headrz   r   )r{   r|   r~   )r   r   r   r   r   r   rX     s    z"StdSlistPrinter._iterator.__init__c             C   s   | S )Nr   )r   r   r   r   rY     s    z"StdSlistPrinter._iterator.__iter__c             C   sL   | j dkrt| j j| jj }|d | _ | j}| jd | _d| |d fS )Nr   rz   r)   z[%d]rv   )r|   rZ   rb   r{   rt   r~   )r   r   rE   r   r   r   r     s    

z"StdSlistPrinter._iterator.__next__N)r	   r
   r   rX   rY   r   r   r   r   r   r     s   r   c             C   s
   || _ d S )N)rV   )r   rD   rW   r   r   r   rX     s    zStdSlistPrinter.__init__c             C   s    t d| jj}| j|j | jS )Nz__gnu_cxx::_Slist_node)r8   rV   r   r   ra   )r   r   r   r   r   r_     s    zStdSlistPrinter.childrenc             C   s   | j d d dkrdS dS )Nr   rz   r   zempty __gnu_cxx::slistz__gnu_cxx::slist)rV   )r   r   r   r   rg     s    zStdSlistPrinter.to_stringN)	r	   r
   r   r   r   r   rX   r_   rg   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 )N)rV   )r   rD   rW   r   r   r   rX     s    z StdSlistIteratorPrinter.__init__c             C   s<   | j d sdS td| j jj }t| j d j|j d S )Nr   z1non-dereferenceable iterator for __gnu_cxx::slistz__gnu_cxx::_Slist_noderv   )rV   r8   r   ra   r!   rb   rt   )r   r   r   r   r   rg      s
    
z!StdSlistIteratorPrinter.to_stringN)r	   r
   r   r   rX   rg   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 j}d|j | _n|| _|| _d| _	d S )N_M_pr   	_M_offset   )
_bitvec_item_so_finish_fort   r   sizeof_isizer~   )r   startfinishZbitvecityper   r   r   rX     s    


z#StdVectorPrinter._iterator.__init__c             C   s   | S )Nr   )r   r   r   r   rY     s    z#StdVectorPrinter._iterator.__iter__c             C   s   | j }| j d | _ | jr| j| jkr4| j| jkr4tt| jj d| j> @ }| jd | _| j| j	krv| jd | _d| _d| |fS | j| jkrt| jj }| jd | _d| |fS d S )Nr)   r   z[%d])
r~   r   r   r   r   r   rZ   boolrt   r   )r   rE   r   r   r   r   r     s     
z#StdVectorPrinter._iterator.__next__N)r	   r
   r   rX   rY   r   r   r   r   r   r     s   r   c             C   s*   t || _|| _|jjdjtjk| _d S )Nr   )	r;   r]   rV   r   r4   coder   TYPE_CODE_BOOL_is_bool)r   rD   rW   r   r   r   rX   0  s    
zStdVectorPrinter.__init__c             C   s$   | j | jd d | jd d | jS )Nr   _M_start	_M_finish)r   rV   r   )r   r   r   r   r_   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 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)rV   r   rt   r   r   r]   int)	r   r   r   endZfor   ZbllengthZcapacityr   r   r   rg   ;  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   rX   r_   rg   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 )N)rV   )r   rD   rW   r   r   r   rX   T  s    z!StdVectorIteratorPrinter.__init__c             C   s    | j d sdS t| j d j S )NZ
_M_currentz,non-dereferenceable iterator for std::vector)rV   r!   rt   )r   r   r   r   rg   W  s    
z"StdVectorIteratorPrinter.to_stringN)r	   r
   r   r   rX   rg   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 )N)rV   )r   rD   rW   r   r   r   rX   `  s    zStdBitIteratorPrinter.__init__c             C   s.   | j d sdS t| j d j d| j d > @ S )Nr   z2non-dereferenceable iterator for std::vector<bool>r)   r   )rV   r   rt   )r   r   r   r   rg   c  s    
zStdBitIteratorPrinter.to_stringN)r	   r
   r   r   rX   rg   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 )N)rV   )r   rD   rW   r   r   r   rX   m  s    zStdBitReferencePrinter.__init__c             C   s*   | j d sdS t| j d j | j d @ S )Nr   z$invalid std::vector<bool>::referenceZ_M_mask)rV   r   rt   )r   r   r   r   rg   p  s    
z StdBitReferencePrinter.to_stringN)r	   r
   r   r   rX   rg   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   r)   Z__tuple_baseTr   Fz4Top of tuple tree does not consist of a single node.)r   rB   r   r    )nodesr   r   r   _is_nonempty_tuple}  s    z,StdTuplePrinter._iterator._is_nonempty_tuplec             C   s:   || _ | j jj }| j|r0| j j|d j| _ d| _d S )Nr   )r}   r   r   r   rb   r~   )r   r   r   r   r   r   rX     s
    
z"StdTuplePrinter._iterator.__init__c             C   s   | S )Nr   )r   r   r   r   rY     s    z"StdTuplePrinter._iterator.__iter__c             C   s   | j s
t| j jj }t|dkr&tt|dkr:tdt|dkr`| j j|d j}d | _ n&| j j|d j}| j j|d j| _ | jd | _|j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.r)   rh   z[%d])	r}   rZ   r   r   r   r    rb   r~   r"   )r   r   implr   r   r   r   r     s$    	
z"StdTuplePrinter._iterator.__next__N)r	   r
   r   staticmethodr   rX   rY   r   r   r   r   r   r   |  s   r   c             C   s   t || _|| _d S )N)r;   r]   rV   )r   rD   rW   r   r   r   rX     s    
zStdTuplePrinter.__init__c             C   s   | j | jS )N)r   rV   )r   r   r   r   r_     s    zStdTuplePrinter.childrenc             C   s(   t | jjj dkrd| j S d| j S )Nr   zempty %sz%s containing)r   rV   r   r   r]   )r   r   r   r   rg     s    
zStdTuplePrinter.to_stringN)	r	   r
   r   r   r   r   rX   r_   rg   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j|d | _d S )Nc)r;   r]   r   default_visualizer_visualizer)r   rD   rW   r   r   r   rX     s    
zStdStackOrQueuePrinter.__init__c             C   s
   | j j S )N)r   r_   )r   r   r   r   r_     s    zStdStackOrQueuePrinter.childrenc             C   s   d| j | jj f S )Nz%s wrapping: %s)r]   r   rg   )r   r   r   r   rg     s    z StdStackOrQueuePrinter.to_stringc             C   s   t | jdr| jj S d S )Nr   )hasattrr   r   )r   r   r   r   r     s    
z#StdStackOrQueuePrinter.display_hintN)r	   r
   r   r   rX   r_   rg   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 )Nrn   r   Z_M_node_countZ	_M_header_M_leftr   )_size_noder~   )r   Zrbtreer   r   r   rX     s    zRbtreeIterator.__init__c             C   s   | S )Nr   )r   r   r   r   rY     s    zRbtreeIterator.__iter__c             C   s
   t | jS )N)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}|j d rl|j d }xd|j d rh|j d }qNW nF|j d }x$||j d kr|}|j d }qzW |j d |kr|}|| _|S )Nr)   Z_M_rightr   Z	_M_parent)r~   r   rZ   r   rt   )r   resultrl   parentr   r   r   r     s$    zRbtreeIterator.__next__N)r	   r
   r   r   rX   rY   r   r   r   r   r   r   r     s
   r   c          
   C   sj   yF| j j d j}|dkr"| d S |dkrD| j jd}t| d |S W n   Y nX tdt| j  dS )z0Return the value held in an _Rb_tree_node<_Val>.r)   Z_M_value_fieldrr   r   z!Unsupported implementation for %sN)r   r   r"   r4   ru   r    r!   )rl   rw   r7   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}|j | _d S )N_Rb_tree_node)rV   r8   r   ra   
_link_type)r   rD   rW   r   r   r   r   rX   !  s    z!StdRbtreeIteratorPrinter.__init__c             C   s0   | j d sdS | j d j| jj }tt|S )Nr   z6non-dereferenceable iterator for associative container)rV   rb   r   rt   r!   r   )r   rl   r   r   r   rg   &  s    
z"StdRbtreeIteratorPrinter.to_stringN)r	   r
   r   r   rX   rg   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 )N)rV   )r   rD   rW   r   r   r   rX   0  s    z StdDebugIteratorPrinter.__init__c             C   sb   t jd}| jjjd}| jj|d }|s<t| jj|S | jd |d krRdS t| jj|S )Nz __gnu_debug::_Safe_iterator_baser   Z_M_sequenceZ
_M_versionzinvalid iterator)r   r   rV   r   r4   rb   r!   )r   Z	base_typer   Zsafe_seqr   r   r   rg   5  s    
z!StdDebugIteratorPrinter.to_stringN)r	   r
   r   r   rX   rg   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.r)   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 )Nr   )_rbiterr~   _type)r   rbiterr   r   r   r   rX   J  s    zStdMapPrinter._iter.__init__c             C   s   | S )Nr   )r   r   r   r   rY   O  s    zStdMapPrinter._iter.__iter__c             C   sh   | j d dkr@t| j}|j| jj }t|}|| _|d }n
| jd }d| j  |f}| j d | _ |S )Nr   r   firstsecondz[%d]r)   )r~   r   r   rb   r   rt   r   Z_pair)r   rR   itemr   r   r   r   r   R  s    


zStdMapPrinter._iter.__next__N)r	   r
   r   rX   rY   r   r   r   r   r   _iterI  s   r   c             C   s   t || _|| _d S )N)r;   r]   rV   )r   rD   rW   r   r   r   rX   _  s    
zStdMapPrinter.__init__c             C   s   d| j ttt| jf S )Nz
%s with %s)r]   r   r   r   rV   )r   r   r   r   rg   c  s    zStdMapPrinter.to_stringc             C   s$   t d| jjj }| jt| j|S )Nr   )r8   rV   r   ra   r   r   )r   rl   r   r   r   r_   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   rX   rg   r_   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 )Nr   )r   r~   r   )r   r   r   r   r   r   rX   t  s    zStdSetPrinter._iter.__init__c             C   s   | S )Nr   )r   r   r   r   rY   y  s    zStdSetPrinter._iter.__iter__c             C   s@   t | j}|j| jj }t|}d| j |f}| jd | _|S )Nz[%d]r)   )r   r   rb   r   rt   r   r~   )r   r   r   r   r   r   r   |  s    
zStdSetPrinter._iter.__next__N)r	   r
   r   rX   rY   r   r   r   r   r   r   s  s   r   c             C   s   t || _|| _d S )N)r;   r]   rV   )r   rD   rW   r   r   r   rX     s    
zStdSetPrinter.__init__c             C   s   d| j ttt| jf S )Nz
%s with %s)r]   r   r   r   rV   )r   r   r   r   rg     s    zStdSetPrinter.to_stringc             C   s$   t d| jjj }| jt| j|S )Nr   )r8   rV   r   ra   r   r   )r   rl   r   r   r   r_     s    zStdSetPrinter.childrenN)	r	   r
   r   r   r   r   rX   rg   r_   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 )N)r;   r]   rV   )r   rD   rW   r   r   r   rX     s    
zStdBitsetPrinter.__init__c             C   s
   d| j  S )Nz%s)r]   )r   r   r   r   rg     s    zStdBitsetPrinter.to_stringc       	   
   C   s   y| j d }W n
   g S |j}|jtjkr8|j j}n|g}|j}|j| }g }d}xh||k r|| }d}xF|dkr|d@ dkr|jd|| d |  df |d }|d? }qnW |d }qXW |S )NZ_M_wr   r)   z[%d]r   )rV   r   r   r   TYPE_CODE_ARRAYtargetr   rP   )	r   ZwordsZwtypeZtsizeZnwordsr   Zbytewbitr   r   r   r_     s,    


zStdBitsetPrinter.childrenN)r	   r
   r   r   rX   rg   r_   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 )Nr   )r   _p_end_last_buffer_sizer~   )r   rl   r   r   lastbuffer_sizer   r   r   rX     s    zStdDequePrinter._iter.__init__c             C   s   | S )Nr   )r   r   r   r   rY     s    zStdDequePrinter._iter.__iter__c             C   sr   | j | jkrtd| j | j j f}| jd | _| j d | _ | j | jkrn| jd | _| jd | _ | j | j | _|S )Nz[%d]r)   r   )r   r   rZ   r~   rt   r   r   r   )r   r   r   r   r   r     s    zStdDequePrinter._iter.__next__N)r	   r
   r   rX   rY   r   r   r   r   r   r     s   r   c             C   sH   t || _|| _|jjd| _| jj}|dk r>td| | _nd| _d S )Nr   i   r)   )	r;   r]   rV   r   r4   Z_elttyper   r   r   )r   rD   rW   sizer   r   r   rX     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   r)   _M_last_M_cur_M_firstz
%s with %s)rV   r   r]   r   long)r   r   r   Zdelta_nZdelta_sZdelta_er   r   r   r   rg     s    zStdDequePrinter.to_stringc             C   s@   | j d d }| j d d }| j|d |d |d |d | jS )Nr   r   r   r   r   r   )rV   r   r   )r   r   r   r   r   r   r_     s    zStdDequePrinter.childrenc             C   s   dS )Nr   r   )r   r   r   r   r     s    zStdDequePrinter.display_hintN)
r	   r
   r   r   r   r   rX   rg   r_   r   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 )N)rV   )r   rD   rW   r   r   r   rX     s    z StdDequeIteratorPrinter.__init__c             C   s    | j d sdS t| j d j S )Nr   z+non-dereferenceable iterator for std::deque)rV   r!   rt   )r   r   r   r   rg   	  s    
z!StdDequeIteratorPrinter.to_stringN)r	   r
   r   r   rX   rg   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   || _ |jddk| _d S )Nz::__cxx11::basic_stringr)   ri   )rV   find_new_string)r   rD   rW   r   r   r   rX     s    zStdStringPrinter.__init__c             C   s   | j j}|jtjkr|j }| j d d }| jrL| j d }|j|jj }n<|j	 j }tj
t|d j }|j|d }|j d }t|dr|j|dS |j|dS )	NZ_M_dataplusr   Z_M_string_lengthz::_Repr)   Z	_M_lengthlazy_string)r   )rV   r   r   r   TYPE_CODE_REFr   r   rb   r   unqualifiedr   r!   ra   rt   r   r   string)r   r   ptrr   ZrealtypeZreptypeheaderr   r   r   rg     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   rX   rg   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 )N)rV   )r   _rW   r   r   r   rX   <  s    zStdStringBufPrinter.__init__c             C   sL   t | j\}}}|rB| s"||kr2|j|| dS |j|| dS | jd S )N)r   Z	_M_string)r   rV   r   )r   r   r   r   r   r   r   rg   ?  s    zStdStringBufPrinter.to_stringc             C   s   dS )Nr   r   )r   r   r   r   r   I  s    z StdStringBufPrinter.display_hintN)r	   r
   r   r   rX   rg   r   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j D d }tjd|j|j tj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  s    z3StdStringStreamPrinter.__init__.<locals>.<listcomp>r   Z__streamz$__stream->rdbuf()_M_stringbuf)rV   r]   r   r   r   Zset_convenience_variablerb   rs   parse_and_eval
_streambuf_was_redirected)r   rD   rW   Zbasetyper   r   r   rX   P  s    zStdStringStreamPrinter.__init__c             C   s$   | j rd| j| jj f S | jd S )Nz%s redirected to %sr   )r   r]   r   rt   rV   )r   r   r   r   rg   ]  s    z StdStringStreamPrinter.to_stringc             C   s   | j r
d S dS )Nr   )r   )r   r   r   r   r   c  s    z#StdStringStreamPrinter.display_hintN)r	   r
   r   r   rX   rg   r   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   sj   |d | _ d| _|d | _t|jdj | _d| _x2| j| jkrd| j | j | _| jrVP | jd | _q4W d S )NZ
_M_bucketsr   Z_M_bucket_countZ_Noder)   )_buckets_bucket_bucket_countr%   r   ra   
_node_typer   )r   	hashtabler   r   r   rX   j  s    

zTr1HashtableIterator.__init__c             C   s   | S )Nr   )r   r   r   r   rY   v  s    zTr1HashtableIterator.__iter__c             C   s   | j dkrt| j j| j}|j d }|j d | _ | j dkr| jd | _x2| j| jkr~| j| j | _ | j rpP | jd | _qNW |S )Nr   Z_M_vrz   r)   )r   rZ   rb   r   rt   r   r   r   )r   rl   r   r   r   r   r   y  s    

zTr1HashtableIterator.__next__N)r	   r
   r   rX   rY   r   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jd}|jjdjd}tdt||r>dnd}|j | _d S )	NZ_M_before_begin_M_nxtr)   	   r   zstd::__detail::_Hash_nodetrueZfalse)r   r   r4   r2   r!   ra   r   )r   r   r7   cachedZ	node_typer   r   r   rX     s    
zStdHashtableIterator.__init__c             C   s   | S )Nr   )r   r   r   r   rY     s    zStdHashtableIterator.__iter__c             C   sR   | j dkrt| j j| jj }|d | _ |d j}|j|jjdj }|j S )Nr   r   rr   )	r   rZ   rb   r   rt   rs   r   r4   ra   )r   r   valptrr   r   r   r     s    


zStdHashtableIterator.__next__N)r	   r
   r   rX   rY   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edd	 Zd
d Z	dS )Tr1UnorderedSetPrinterz1Print a std::unordered_set or tr1::unordered_set.c             C   s   t || _|| _d S )N)r;   r]   rV   )r   rD   rW   r   r   r   rX     s    
zTr1UnorderedSetPrinter.__init__c             C   s   | j jdr| jS | jd S )Nzstd::tr1_M_h)r]   r<   rV   )r   r   r   r   
_hashtable  s    z!Tr1UnorderedSetPrinter._hashtablec             C   s   | j  d }d| jt|f S )N_M_element_countz
%s with %s)r  r]   r   )r   rE   r   r   r   rg     s    z Tr1UnorderedSetPrinter.to_stringc             C   s   d|  S )Nz[%d]r   )ir   r   r   _format_count  s    z$Tr1UnorderedSetPrinter._format_countc             C   s@   t | jtj }| jjdr.t|t| j S t|t	| j S )Nzstd::tr1)
r   r  	itertoolsrE   r]   r<   r   r   r  r   )r   counterr   r   r   r_     s    zTr1UnorderedSetPrinter.childrenN)
r	   r
   r   r   rX   r  rg   r   r  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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 )N)r;   r]   rV   )r   rD   rW   r   r   r   rX     s    
zTr1UnorderedMapPrinter.__init__c             C   s   | j jdr| jS | jd S )Nzstd::tr1r  )r]   r<   rV   )r   r   r   r   r    s    z!Tr1UnorderedMapPrinter._hashtablec             C   s   | j  d }d| jt|f S )Nr  z
%s with %s)r  r]   r   )r   rE   r   r   r   rg     s    z Tr1UnorderedMapPrinter.to_stringc             c   s&   x | D ]}x|D ]
}|V  qW qW d S )Nr   )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 )Nz[%d]r   )r  r   r   r   r    s    z$Tr1UnorderedMapPrinter._format_countc             C   sd   t | jtj }| jjdr@| jt | jt| j	 }t
||S | jt | jt| j	 }t
||S )Nzstd::tr1)r   r  r  rE   r]   r<   r  r  r   r  r   r   )r   r	  datar   r   r   r_     s    
zTr1UnorderedMapPrinter.childrenc             C   s   dS )Nr   r   )r   r   r   r   r     s    z#Tr1UnorderedMapPrinter.display_hintN)r	   r
   r   r   rX   r  rg   r   r  r  r  r_   r   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 )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 )Nrz   r   )r{   r|   r~   )r   r   r   r   r   r   rX     s    
z(StdForwardListPrinter._iterator.__init__c             C   s   | S )Nr   )r   r   r   r   rY     s    z(StdForwardListPrinter._iterator.__iter__c             C   sl   | j dkrt| j j| jj }|d | _ | j}| jd | _|d j}|j|jjdj	 }d| |j fS )Nr   rz   r)   rr   z[%d])
r|   rZ   rb   r{   rt   r~   rs   r   r4   ra   )r   r   rE   r  r   r   r   r     s    


z(StdForwardListPrinter._iterator.__next__N)r	   r
   r   rX   rY   r   r   r   r   r   r     s   r   c             C   s   || _ t|| _d S )N)rV   r;   r]   )r   rD   rW   r   r   r   rX      s    zStdForwardListPrinter.__init__c             C   s(   t d| jjj }| j|| jd d S )Nr   r   r   )r8   rV   r   ra   r   )r   r   r   r   r   r_     s    zStdForwardListPrinter.childrenc             C   s*   | j d d d dkr d| j S d| j S )Nr   r   rz   r   zempty %sz%s)rV   r]   )r   r   r   r   rg     s    
zStdForwardListPrinter.to_stringN)	r	   r
   r   r   r   r   rX   r_   rg   r   r   r   r   r    s
   r  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 )N)_contained_valuer   _hint)r   rW   ZvizZhintr   r   r   rX     s    z"SingleObjContainerPrinter.__init__c             C   s(   t st|S tjjtj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 )N)rV   )r   rW   r   r   r   rX     s    z-SingleObjContainerPrinter._contained.__init__c             C   s   | S )Nr   )r   r   r   r   rY   "  s    z-SingleObjContainerPrinter._contained.__iter__c             C   s"   | j d krt| j }d | _ d|fS )Nz[contained value])rV   rZ   )r   Zretvalr   r   r   r   %  s
    
z-SingleObjContainerPrinter._contained.__next__N)r	   r
   r   rX   rY   r   r   r   r   r   
_contained  s   r  c             C   s6   | j d kr| jd S t| jdr*| jj S | j| j S )Nr_   )r  r  r   r   r_   )r   r   r   r   r_   ,  s
    


z"SingleObjContainerPrinter.childrenc             C   s(   t | jdr"t | jdr"| jj S | jS )Nr_   r   )r   r   r   r  )r   r   r   r   r   3  s    
z&SingleObjContainerPrinter.display_hint)N)
r	   r
   r   r   rX   r  r   r  r_   r   r   r   r   r   r    s   
r  c          	   C   sH   | j  j} tjd dkr"t| } nt| } ytj| jj	S    dS 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)
rt   rs   rF   rG   r   r   r   Zblock_for_pcfunctionr"   )r   r   r   r   function_pointer_to_name;  s    

r  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rt|}|sXtd| j dj|}tj	||}|std| j |j
d}	d|	kr
g }
xPtj D ]D}y(tjd||j
d}|
jtj| W q tjk
r   Y qX qW t|
dkr td	|
d }n
tj|	}|jd| _d }d
|	kr@| jd d j}n(d|	krZ| jd d }ntd| j |j| jj j }tj|}tt| j|| 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 %sr)   zstd::stringzstd::string(?!\w)z;Cannot uniquely determine std::string type used in std::anyz::_Manager_internalrr   Z	_M_bufferz::_Manager_externalr\   )r;   r]   rK   rV   _contained_typer  r    r*   r>   r?   groupr  _string_typesrH   rP   r   r   r,   r   r4   rs   rb   ra   rt   r   superrX   )r   rD   rW   contained_value
visualizerZmgrfuncZrxmZmgrnameZmgrtypessr@   Zmgrtyper  )	__class__r   r   rX   V  sX    










zStdExpAnyPrinter.__init__c             C   sT   | j d krd| j S d| j }t| jdr8|| jj  S | j| j }|tt| S )Nz%s [no contained value]z%s containing r_   )r  r]   r   r   rg   r  r;   r!   )r   descr7   r   r   r   rg     s    


zStdExpAnyPrinter.to_stringc                 s@   t tjdj h} d dddt g}|  fdd|D O } | S )Nzstd::stringzAbasic_string<char, std::char_traits<char>, std::allocator<char> >zstd::zstd::__cxx11::c                s   h | ]}|  qS r   r   )r&   q)r#  r   r   	<setcomp>  s    z1StdExpAnyPrinter._string_types.<locals>.<setcomp>)r!   r   r   r   r-   )ZstringsZqualsr   )r#  r   r    s    
zStdExpAnyPrinter._string_types)	r	   r
   r   r   rX   rg   r   r  __classcell__r   r   )r$  r   r  S  s   D	r  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jdr8|d }|}n*|d }|d }y|d }W n   Y nX tj|}|std }tt| j|| d S )N
_M_payloadzstd::experimental
_M_engaged_M_value)	r;   r]   rK   r<   r   r   r  r)  rX   )r   rD   rW   ZpayloadZengagedr  r   )r$  r   r   rX     s"    


zStdExpOptionalPrinter.__init__c             C   s:   | j d krd| j S t| jdr4d| j| jj f S | jS )Nz%s [no contained value]r_   z%s containing %s)r  r]   r   r   rg   )r   r   r   r   rg     s    

zStdExpOptionalPrinter.to_string)r	   r
   r   r   rX   rg   r(  r   r   )r$  r   r)    s   r)  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	| jj
 j }tj|}tt| j||d d S )N_M_indexZ_M_ur   rr   r   )rT   r   r;   r]   _indexr   r  r   rs   rb   ra   rt   r   r   r  r-  rX   )r   rD   rW   Zalternativesr  r   Zaddr)r$  r   r   rX     s    




zStdVariantPrinter.__init__c             C   sH   | j d krd| j S t| jdr8d| j| j| jj f S d| j| jf S )Nz%s [no contained value]r_   z%s [index %d] containing %sz%s [index %d])r  r]   r   r   r/  rg   )r   r   r   r   rg     s    


zStdVariantPrinter.to_string)r	   r
   r   r   rX   rg   r(  r   r   )r$  r   r-    s   r-  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 jd| _|j jdjd}t|jd| _|j jd| jk| _|d }|r~| jrbt|j }nt	|d | j}t
j|}nd }d }|d }|d r|d	 nd | _tt| j||d
 d S )Nr)   r   r   r   r\   rr   Z_M_allocr+  r*  r   )r   r4   _value_typerB   r"   _is_rb_tree_node_is_map_noder   rt   ru   r   r   Z_allocr  r0  rX   )r   rD   rW   r   Znodeptrr  r   Zoptalloc)r$  r   r   rX     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j f S |S d| S d S )	Nznode handle for z
unordered r   setz with elementr_   z%s = %szempty %s)r2  r3  r  r   r   rg   )r   r%  r   r   r   rg   	  s    
zStdNodeHandlePrinter.to_string)r	   r
   r   r   rX   rg   r(  r   r   )r$  r   r0    s   r0  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 )N)rV   )r   rD   rW   r   r   r   rX      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   )rV   r   r   r   )r   r   r   r   r   r   rg   #  s
    


z!StdExpStringViewPrinter.to_stringc             C   s   dS )Nr   r   )r   r   r   r   r   *  s    z$StdExpStringViewPrinter.display_hintN)r	   r
   r   r   rX   rg   r   r   r   r   r   r5    s   r5  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   )rV   r]   r   
_num_cmpts)r   rD   rW   r   r   r   r   r   rX   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_typer   	_Root_dirzroot-directory
   
_Root_namez	root-nameii)r!   rV   )r   r0   r   r   r   
_path_type8  s    zStdExpPathPrinter._path_typec             C   s8   d| j d  }| jdkr0| j }|r0d||f }d| S )Nz%s_M_pathnamer   z%s [%s]z!experimental::filesystem::path %s)rV   r9  r=  )r   pathr0   r   r   r   rg   @  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   rX   I  s    z$StdExpPathPrinter._iterator.__init__c             C   s   | S )Nr   )r   r   r   r   rY   O  s    z$StdExpPathPrinter._iterator.__iter__c             C   sd   | j | jkrt| j j }| j}| jd | _| j d | _ |d }t| j|j }|sX|}d| |fS )Nr)   r>  z[%s])r   r   rZ   rt   r~   r7  r@  r=  )r   r   rE   r?  r0   r   r   r   r   R  s    
z$StdExpPathPrinter._iterator.__next__N)r	   r
   r   rX   rY   r   r   r   r   r   r   H  s   r   c             C   s   | j | jd | jS )Nr8  )r   rV   r]   )r   r   r   r   r_   _  s    zStdExpPathPrinter.childrenN)
r	   r
   r   r   rX   r=  rg   r   r   r_   r   r   r   r   r7  .  s   r7  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 }|jtjdd@ | _| jdkrF|| _nd | _d S )Nr8  r   Z	uintptr_t   r   )rV   r]   rp   rb   r   r   r   _impl)r   rD   rW   r   r   r   r   rX   f  s    
zStdPathPrinter.__init__c             C   sH   t | jjtj| jd }|dd  dkr0dS |d	d  dkrDdS d S )
Nz::_Typer   r:  zroot-directoryr;  r<  z	root-nameii)r!   r   rb   r   r   r]   )r   r0   r   r   r   r=  p  s    zStdPathPrinter._path_typec             C   s8   d| j d  }| jdkr0| j }|r0d||f }d| S )Nz%sr>  r   z%s [%s]zfilesystem::path %s)rV   r   r=  )r   r?  r0   r   r   r   rg   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jd}tj|d }tjd}|j|j }|j }ttjdrbtd|j	 |j
}n
d|j	 }|j|j | }|j|j | _| j| | _d| _nd | _d | _d S )Nr   z::_Cmptcharalignofr   r   )r@  r   r   rb   ra   rt   r   r:   maxr   rF  r   r   r~   )	r   r   rA  Zint_typeZ	cmpt_type	char_typer   Zsizeof_Implbeginr   r   r   rX     s     


z!StdPathPrinter._iterator.__init__c             C   s   | S )Nr   )r   r   r   r   rY     s    z!StdPathPrinter._iterator.__iter__c             C   sd   | j | jkrt| j j }| j}| jd | _| j d | _ |d }t| j|j }|sX|}d| |fS )Nr)   r>  z[%s])r   r   rZ   rt   r~   rB  r@  r=  )r   r   rE   r?  r0   r   r   r   r     s    
z!StdPathPrinter._iterator.__next__N)r	   r
   r   rX   rY   r   r   r   r   r   r     s   r   c             C   s   | j | j| jS )N)r   rD  r]   )r   r   r   r   r_     s    zStdPathPrinter.childrenN)
r	   r
   r   r   rX   r=  rg   r   r   r_   r   r   r   r   rB  c  s   
(rB  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 )N)rV   )r   rD   rW   r   r   r   rX     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   )rV   _which)r   rW   r   r   r   rX     s    zStdPairPrinter._iter.__init__c             C   s   | S )Nr   )r   r   r   r   rY     s    zStdPairPrinter._iter.__iter__c             C   s8   | j d krt| j }|dkr$d| _ nd | _ || j| fS )Nr   r   )rK  rZ   rV   )r   Zwhichr   r   r   r     s    
zStdPairPrinter._iter.__next__N)r	   r
   r   r   rX   rY   r   r   r   r   r   r     s   r   c             C   s   | j | jS )N)r   rV   )r   r   r   r   r_     s    zStdPairPrinter.childrenc             C   s   d S )Nr   )r   r   r   r   rg     s    zStdPairPrinter.to_stringN)	r	   r
   r   r   rX   r   r   r_   rg   r   r   r   r   rJ    s
   rJ  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&   ||j dd d  | _|d | _d S )N:r)   r,  )rfindr]   rV   )r   rD   rW   r   r   r   rX     s    zStdCmpCatPrinter.__init__c             C   sJ   | j dkr| jdkrd}n"dddddddd	i}|t| j }d
j| j |S )Nstrong_orderingr   Zequalr   Z	unorderedr)   ZlessZ
equivalentZgreaterzstd::{}::{}ri   )r]   rV   r   r*   )r   r"   namesr   r   r   rg     s
    zStdCmpCatPrinter.to_stringN)r	   r
   r   r   rX   rg   r   r   r   r   rL    s   rL  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   sL   || _ t|| _tjd krHydd l}dt_W n tk
rF   dt_Y nX d S )Nr   TF)rV   r;   r]   rQ  _system_is_posixposixImportError)r   rD   rW   rS  r   r   r   rX     s    


zStdErrorCodePrinter.__init__c             C   s&   t j| }|d k	r"|jt jkr"|S d S )N)r   r   r   ZTYPE_CODE_ENUM)r"   r#   r   r   r   _find_errc_enum  s    
z#StdErrorCodePrinter._find_errc_enumc             C   sB   x<dt gD ]0}ydj||}| j|S  tk
r8   Y q
X q
W d S )NrC   z	std::{}{})r-   r*   rU  r   )clsr"   nsZqnamer   r   r   _find_standard_errc_enum  s    
z,StdErrorCodePrinter._find_standard_errc_enumc       	      C   s   dddg}x~|D ]v}|d }xhdt gD ]\}dj|}tjdj||d }|d k	r&||j jkr&d	| }| jd
j||}||fS q&W qW dS )NstreamZsocketzip::resolverz_category()rC   zstd::{}experimental::net::v1z{}::{}::__cr   znet::z{}::{}_errc)NN)r-   r*   r   Zlookup_symbolvaluers   rU  )	rV  catZnet_catsr   r!  rW  Zsymr"   enumr   r   r   _match_net_ts_category  s    


z*StdErrorCodePrinter._match_net_ts_categoryc          
   C   s   d}d}d}| j |\}}|dk	r.d|||fS |jj }|jjdrLd}d}|jjdrbd}| j}|jjdr|d	}| jd
}|jjdrd}| jd}|dkryW n   Y nX ||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   endswithrR  rX  )rV  r[  r"   r\  is_errnor!  r#   r   r   r   _category_info  s2    


z"StdErrorCodePrinter._category_infoc             C   s   | j dd S )zX
        Strip any nested-name-specifier from name to give an unqualified name.
        z::r)   ri   )split)r"   r   r   r   _unqualified_name7  s    z%StdErrorCodePrinter._unqualified_namec       	   
   C   s   | j d }| j d }| j|\}}}}|dkrVddd}||| j| j krV| jd S t|}|r|dkrytjt| }W q   Y qX n|d k	r| jt|j|}|d k	rd| }n|}d	| j||f S )
Nr,  Z_M_catr   r_  r^  )
error_codeerror_conditionz = { }z"%s"z%s = {%s: %s})	rV   rd  rf  r]   r!   errno	errorcoder   rb   )	r   rZ  r[  r"   Zalt_namer\  rc  Zdefault_catsZstrvalr   r   r   rg   >  s(    



zStdErrorCodePrinter.to_string)r	   r
   r   r   rR  rX   r   rU  classmethodrX  r]  rd  rf  rg   r   r   r   r   rQ    s   	+rQ  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 )N)rV   r]   )r   rD   rW   r   r   r   rX   [  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	j||}|d k	r| jd
|  d k	rdj||| jd
|  }d| S )NZ	_M_opcode   rz   ZaltZsubexprnegZbackref_index)repeatalternativeZsubexpr_beginZsubexpr_endZline_begin_assertionZline_end_assertionZword_boundaryZsubexpr_lookaheadZbackrefr?   ZacceptZdummyunknownzopcode={}, next={}Z_M_z	{}, {}={}z{%s})r!   rV   r*   )r   ZopcodeZnext_idZvariantsvr#  r   r   r   rg   _  s     

zStdRegexStatePrinter.to_stringN)r	   r
   r   r   rX   rg   r   r   r   r   rl  X  s   rl  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 )Nr   )r~   _beginr   )r   rI  r   r   r   r   rX   y  s    z!StdSpanPrinter._iterator.__init__c             C   s   | S )Nr   )r   r   r   r   rY   ~  s    z!StdSpanPrinter._iterator.__iter__c             C   s8   | j | jkrt| j }| j d | _ d| | j| j fS )Nr)   z[%d])r~   r   rZ   rt  rt   )r   rE   r   r   r   r     s
    z!StdSpanPrinter._iterator.__next__N)r	   r
   r   rX   rY   r   r   r   r   r   r   x  s   r   c             C   sL   t || _|| _tjd}|jjd|kr:|d d | _n|jjd| _d S )Nzstatic_cast<std::size_t>(-1)r)   Z	_M_extentZ_M_extent_value)r;   r]   rV   r   r   r   r4   r   )r   rD   rW   Zsize_maxr   r   r   rX     s    

zStdSpanPrinter.__init__c             C   s   d| j | jf S )Nz%s of length %d)r]   r   )r   r   r   r   rg     s    zStdSpanPrinter.to_stringc             C   s   | j | jd | jS )Nr\   )r   rV   r   )r   r   r   r   r_     s    zStdSpanPrinter.childrenc             C   s   dS )Nr   r   )r   r   r   r   r     s    zStdSpanPrinter.display_hintN)
r	   r
   r   r   r   r   rX   rg   r_   r   r   r   r   r   rs  u  s   	rs  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 )Nr6  )r]   rV   r   )r   rD   rW   r   r   r   rX     s    z"StdInitializerListPrinter.__init__c             C   s   d| j | jf S )Nz%s of length %d)r]   r   )r   r   r   r   rg     s    z#StdInitializerListPrinter.to_stringc             C   s   t j| jd | jS )NZ_M_array)rs  r   rV   r   )r   r   r   r   r_     s    z"StdInitializerListPrinter.childrenc             C   s   dS )Nr   r   )r   r   r   r   r     s    z&StdInitializerListPrinter.display_hintN)r	   r
   r   r   rX   rg   r_   r   r   r   r   r   ru    s
   ru  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jd| _| jjd k	rnt | jj}|jdsR|jdrn|d }t	||| _| j
| _d S )Nr   zstd::shared_ptr<zstd::weak_ptr<r   )r;   r]   rV   _shptr_printerr   r4   r1  r   r<   r[   _shptr_childrenr_   )r   rD   rW   r#   r   r   r   r   rX     s    


zStdAtomicPrinter.__init__c             C   s   t | jjS )N)rU   rw  r^   )r   r   r   r   rx    s    z StdAtomicPrinter._shptr_childrenc             C   s   | j d k	r| j 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 )Nr`   Z_M_fpZ_M_br   Z_M_basez%s<%s> = { %s })rw  rg   r1  r   r   ZTYPE_CODE_INTrV   TYPE_CODE_FLTTYPE_CODE_PTRr   r]   r!   )r   rW   r   r   r   rg     s    


zStdAtomicPrinter.to_stringN)r	   r
   r   r   rX   rx  rg   r   r   r   r   rv    s   rv  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 )N)r;   r]   rV   )r   rD   rW   r   r   r   rX     s    
zStdFormatArgsPrinter.__init__c             C   s   t | jj}t |d d }|tjdkr0d}n|tjdkrDd}nd}| jd }|dkrbd	| S |dkrt| jd
 }d||f S )Nr   r)   rE  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)rT   rV   r   r   r   )r   ZtargsrH  r#   r   r   r   r   rg     s    

zStdFormatArgsPrinter.to_stringN)r	   r
   r   r   rX   rg   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 )N)r;   r]   rV   )r   rD   rW   r   r   r   rX     s    
z!StdChronoDurationPrinter.__init__c             C   s*   | j jjd}|jd}|jd}||fS )Nr)   r   )rV   r   r4   )r   Zperiodr   denr   r   r   _ratio  s    

zStdChronoDurationPrinter._ratioc             C   s   | j  \}}|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j|S dj||S )Nr)   r#  i  Zmsi@B usi ʚ;rW  <   mini  hiQ dz[{}]sz[{}/{}]s)r  r*   )r   r   r~  r   r   r   _suffix  s&    
z StdChronoDurationPrinter._suffixc             C   s4   | j d }|jj jtjkr$d| }dj|| j S )N__rz%gz"std::chrono::duration = {{ {}{} }})rV   r   r   r   r   ry  r*   r  )r   rr   r   r   rg     s    
z"StdChronoDurationPrinter.to_stringN)r	   r
   r   r   rX   r  r  rg   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 )N)r;   r]   rV   )r   rD   rW   r   r   r   rX     s    
z"StdChronoTimePointPrinter.__init__c             C   sv   | j 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j|d fS )Nr   zstd::chrono::_V2::system_clockzstd::chrono::system_clockstd::chrono::sys_timezstd::chrono::utc_clockstd::chrono::utc_timezstd::chrono::gps_clockstd::chrono::gps_timezstd::chrono::tai_clockstd::chrono::tai_timezstd::filesystem::__file_clockstd::chrono::file_time    um zstd::chrono::local_tstd::chrono::local_timez{} time_point)r  r   )r  N)r  N)r  N)r  r  )r  r   )rV   r   r4   r;   r"   r*   )r   clockr"   r   r   r   _clock  s     
z StdChronoTimePointPrinter._clockFc          
   C   s   | j  \}}| jd }|d }t|jj|}|j }d}|d k	r|j \}	}
||	 |
 | }ytjj|t	}dj
|}W n   Y nX d|||f }|r|S d||f S )NZ__dr  rC   z [{:%Y-%m-%d %H:%M:%S}]z%d%s%sz%s = { %s })r  rV   r}  r   r"   r  r  r   Zfromtimestamp_utc_timezoner*   )r   Zabbrevr  offsetr  r  printersuffixtimer   r~  Zsecsr   r#  r   r   r   rg   1  s$    
z#StdChronoTimePointPrinter.to_stringN)F)r	   r
   r   r   rX   r  rg   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 )N)r;   r]   rV   )r   rD   rW   r   r   r   rX   I  s    
z"StdChronoZonedTimePrinter.__init__c             C   s@   | j d j d }| j d }t|jj|}|jd}dj||S )NZ_M_zone_M_nameZ_M_tpTz%std::chrono::zoned_time = {{ {} {} }})rV   rt   r  r   r"   rg   r*   )r   Zzoner  r  r   r   r   rg   M  s
    

z#StdChronoZonedTimePrinter.to_stringN)r	   r
   r   r   rX   rg   r   r   r   r   r  F  s   r  ZJanuaryZFebruaryZMarchZAprilZMayZJuneZJulyZAugustZ	SeptemberZOctoberZNovemberZDecemberZSundayZMondayZTuesdayZ	WednesdayZThursdayZFridayZSaturdayc               @   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 )N)r;   r]   rV   )r   rD   rW   r   r   r   rX   _  s    
z!StdChronoCalendarPrinter.__init__c       	      C   sv  | j }| j}d|kr$|dkr$|d }|jdr6|d }|dkrPdjt|d S |d	kr||d
k sl|ttkrtd| S t| S |dkrdj|S |dkr|d }|dk s|ttkrd| S djt| S |dkrdj|d t|d S |dkrdj|d S |dkrdj||d S |dkr,dj|S |dkrFdj||d S |dkr`dj||d S |dkrvdj||S |dkrd j|||d S |dkrdj||d! S |d"krd j|||d S |d#krd j|||d S |jd$rrd%}|d& dkr"d'jt|d( d) t|d& }t|d* d+ }t|d d+ }t|d, d+ }|d- rb| }d.j||||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::monthr)   z%d is not a valid monthz{}yzstd::chrono::weekdayZ_M_wdr   z%d is not a valid weekdayzstd::chrono::weekday_indexedz{}[{}]r.  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_ssrC   Zfractional_widthz.{:0{}d}Z_M_ssZ_M_rr  r  _M_sZ	_M_is_negz{:02}:{:02}:{:02}{})rV   r]   r<   r*   r   r   monthsweekdays)	r   rW   r#   r"  yZwdZfractr  r#  r   r   r   rg   c  sh    












z"StdChronoCalendarPrinter.to_stringN)r	   r
   r   r   rX   rg   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 )N)r;   r]   rV   )r   rD   rW   r   r   r   rX     s    
z!StdChronoTimeZonePrinter.__init__c             C   s6   d| j | jd f }| j jdr2|d| jd  7 }|S )Nz%s = %sr  Z_linkz -> %sZ	_M_target)r]   rV   rb  )r   r!   r   r   r   rg     s    z"StdChronoTimeZonePrinter.to_stringN)r	   r
   r   r   rX   rg   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 )N)r;   r]   rV   )r   rD   rW   r   r   r   rX     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))rV   r]   abs)r   Zdatern  r   r   r   rg     s    z$StdChronoLeapSecondPrinter.to_stringN)r	   r
   r   r   rX   rg   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 )N)r;   r]   rV   )r   rD   rW   r   r   r   rX     s    
zStdChronoTzdbPrinter.__init__c             C   s   d| j | jd f S )Nz%s %sversion)r]   rV   )r   r   r   r   rg     s    zStdChronoTzdbPrinter.to_stringN)r	   r
   r   r   rX   rg   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 )N)r;   r]   rV   )r   rD   rW   r   r   r   rX     s    
z%StdChronoTimeZoneRulePrinter.__init__c       
      C   s   | j d }|d }t|d  }dddddddd}|d }d	j||j|d
}|dkrddj||}nVt|d  }|dkrdj||}n4|dkrd}	nd}	|d }dj|	d ||	d ||}dj| j d | j d | j d |S )Nonkindr  stZndZrd)r)   r   rC              Zday_of_monthz{}{}Zthr   z{} {}Zday_of_weekr)   zlast {} in {}r   r   <=r   >=z{} {} {} {} {}z.time_zone rule {} from {} to {} starting on {}r"   fromZto)r   r  )r   r  )rV   r  r*   getr  )
r   r  r  r  suffixesdayZordinal_dayr   weekday	directionr   r   r   rg     s*    
z&StdChronoTimeZoneRulePrinter.to_stringN)r	   r
   r   r   rX   rg   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 )N)rV   r]   )r   rD   rW   r   r   r   rX     s    zStdLocalePrinter.__init__c                sx  | j d d }d}|d dkr&d}nFtj| jd }tj| jd }|d j }|d j }dj||}||i}d	}	xN|	|k r||	 dkr||	 j }||	 j }d
j|||}|||< |	d	 }	qxW t|j }
t|
d	kr|}nt|
dkrl|
\}}t	|j }d  |j
|d	kr$|}| n|j
|d	kr<|}|  d k	rlt fdd|j D }dj| }dj||S )Nr   Z_M_namesrC   r   *z::_S_categoriesz::_S_categories_sizez{}={}r)   z{};{}={}r   c             3   s   | ]\}}| kr|V  qd S )Nr   )r&   r   rR   )otherr   r   	<genexpr>	  s    z-StdLocalePrinter.to_string.<locals>.<genexpr>z with "{}={}"zstd::locale = "{}"{})rV   r   r   r]   r   r*   r4  valuesr   r   rE   r   items)r   rP  modr"   ZcatsZncatrR   r[  Z	cat_namesr  Z
uniq_namesZn1Zn2Z	name_listr   )r  r   rg     sD    
zStdLocalePrinter.to_stringN)r	   r
   r   r   rX   rg   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 )N)rV   r]   )r   rD   rW   r   r   r   rX   	  s    z#StdIntegralConstantPrinter.__init__c             C   sL   | j jjd}| j jjd}|jtjkr4|r0dS dS t| j}dj|||S )Nr   r)   zstd::true_typezstd::false_typez
{}<{}, {}>)	rV   r   r4   r   r   r   r;   r]   r*   )r   r3   rZ  rD   r   r   r   rg   	  s    
z$StdIntegralConstantPrinter.to_stringN)r	   r
   r   r   rX   rg   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 )N)rV   r]   )r   rD   rW   r   r   r   rX   $	  s    zStdTextEncodingPrinter.__init__c             C   s<   | j d j }|d dkr$| j d S |d dkr4dS |d S )NZ_M_repZ_M_idr)   r  r   rq  )rV   rt   )r   Zrepr   r   r   rg   (	  s    
z StdTextEncodingPrinter.to_stringN)r	   r
   r   r   rX   rg   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| j  || _|| _d| _d S )NT)r  r  rX   r"   	_functionenabled)r   r"   r  )r$  r   r   rX   3	  s    zRxPrinter.__init__c             C   s:   | j s
d S |jjtjkr,ttjdr,|j }| j| j	|S )Nreferenced_value)
r  r   r   r   r   r   Valuer  r  r"   )r   rZ  r   r   r   invoke9	  s    zRxPrinter.invoke)r	   r
   r   rX   r  r(  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| j  || _g | _i | _d| _tjd| _	d S )NTz^([a-zA-Z0-9_:]+)(<.*>)?$)
r  r  rX   r"   _subprinters_lookupr  r>   compile_compiled_rx)r   r"   )r$  r   r   rX   H	  s    zPrinter.__init__c             C   s<   | j j|std| t||}| jj| || j|< d S )Nz0libstdc++ programming error: "%s" does not match)r  r?   r    r  r  rP   r  )r   r"   r  r  r   r   r   addP	  s    

zPrinter.addc             C   s>   | j || | d|kr:tjddt |}| j || | d S )N__cxx11z^(std|__gnu_cxx)::z\g<0>%s)r  r>   rH   r-   )r   baser"   r  Zvbaser   r   r   add_version[	  s
    
zPrinter.add_versionc             C   s$   | j ||| | j |d || d S )Nz__cxx1998::)r  )r   r  r"   r  r   r   r   add_containerc	  s    zPrinter.add_containerc             C   s&   | j tjkr| j } | j j } | jS )N)r   r   r   r   r   r   r   )r   r   r   r   get_basic_typeg	  s    zPrinter.get_basic_typec             C   sr   | j |j}|sd S | jj|}|s(d S |jd}|jjtjkrTttj	drT|j
 }|| jkrn| j| j|S d S )Nr)   r  )r  r   r  r?   r  r   r   r   r   r  r  r  r  )r   rW   rD   r?   basenamer   r   r   __call__r	  s    

zPrinter.__call__)r	   r
   r   rX   r  r  r  r   r  r  r(  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 )NT)r"   _defargsr  )r   r"   defargsr   r   r   rX   	  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 )N)r"   r  )r   r"   r  r   r   r   rX   	  s    z(TemplateTypePrinter._recognizer.__init__c       	      C   s   |j dkrdS |j j| js dS t|}g }d}xtt|D ]}|| }| jj|}|dk	r|j| }y|t	j
|kr|dS W n$ t	jk
r   |j |krdS Y nX d}q>|rdS |j| j| q>W |j d|j jd }t|}|d dj| 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   <z, >)r   r<   r"   rT   ranger   r  r  r*   r   r   r,   rP   _recognize_subtyper   rO   r+   )	r   rQ   rS   Zdisplayed_argsZrequire_defaultedrR   rf   ZdefargrA   r   r   r   	recognize	  s2    



z)TemplateTypePrinter._recognizer.recognizec             C   s   |j tjkr| j|j d S |j tjkrj| j|j }t|j jdrR|d S d||j	 d d f S |j tj
kr| j|j d S ttdr|j tjkr| j|j d S tjjtj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]r)   &TYPE_CODE_RVALUE_REFz&&)r   r   rz  r  r   r   r!   r   rb  r  r   r   r  r  r  r  )r   rQ   rN   r   r   r   r  	  s"    
z2TemplateTypePrinter._recognizer._recognize_subtypeN)r	   r
   r   r   rX   r  r  r   r   r   r   _recognizer	  s   1r  c             C   s   | j | 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   rX   objectr  r  r   r   r   r   r  	  s   	Pr  c                s   t d| |}tjj| | t d| |}tjj| | d|krdt  t fdd|j D }t  | |}tjj| | t d| |}tj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}> >' }
    zstd::zstd::__debug::r  c             3   s"   | ]\}}||j d  fV  qdS )zstd::N)r.   )r&   rR   r  )rW  r   r   r  
  s   z0add_one_template_type_printer.<locals>.<genexpr>N)r  r   r  register_type_printerr-   dictr  )objr"   r  r  r   )rW  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 )NT)	_templater"   _targ1r  )r   templater"   targ1r   r   r   rX   -
  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 )N)r  r"   r  	_type_obj)r   r  r"   r  r   r   r   rX   6
  s    z)FilteringTypePrinter._recognizer.__init__c          	   C   s   |j dkrdS | jdkrz| jdk	rDdj| j| j}|j j|sVdS n|j j| jsVdS ytj| jj	 | _W n   Y nX | jdkrdS tj
j| j}tj
j|}||krt| jS | jjdd dkr| jj jdd}|j 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{}<{}z::r)   basic_stringz	__cxx11::rC   ri   )r   r  r  r*   r  r<   r   r   r"   r   r  r  rO   re  r.   )r   rQ   r#  Zt1Zt2s1s2r   r   r   r  <
  s4    





z*FilteringTypePrinter._recognizer.recognizeN)r	   r
   r   r   rX   r  r   r   r   r   r  3
  s   r  c             C   s   | j | j| j| jS )z1Return a recognizer object for this type printer.)r  r  r"   r  )r   r   r   r   r  f
  s    z FilteringTypePrinter.instantiate)N)r	   r
   r   r   rX   r  r  r  r   r   r   r   r  
  s   
3r  c             C   sX   t d| d| |}tjj| | d|krTdt }t || || |}tjj| | d S )Nzstd::r  )r  r   r  r  r-   )r  r  r"   r  r  rW  r   r   r   add_one_type_printerk
  s    r  c          
   C   sd  t sd S xxdgD ]p}t| d|d d |d  t| d|d d |d  t| dd|d  d |d  t| d|d d |d  qW xdjD ]|}x*dkD ]"}t| d| |d | |d  qW xJdlD ]B}t| d| |d | |d  t| d!| |d | |d   qW qW xdmD ]}x0dpD ](}t| |d" ||d  d# |d  qW xNdqD ]F}t| |d( || d)  x&drD ]}t| || || |  qlW qJW qW t| d-d. xdsD ]}t| d9d:|  qW t| d;d< t| d;d= t| d>d? t| d>d@ t| dAdB t| dAdC t| dDdE t| dDdF t| dGdH dI}x0dyD ](}t| |d ||d  d |d  q<W t| dJddKi t| dLddMi t| dNddMi t| dOddMi t| dPddMi t| dQddMi t| dRdSdTdU t| dVdSdTdU t| dWdSdMdX t| dYdSdMdX t| dZd[d\dTd] t| d^d[d\dTd] t| d_d[d\dMd` t| dad[d\dMd` d S )zNrC   rE  r   r|  u8char8_tu16char16_tu32char32_tr  r   r   r)   z__cxx11::basic_string	__cxx11::basic_string_viewZstring_viewiosr   istreamostreamiostreamfilebufifstreamofstreamfstreambasic_	stringbufistringstreamostringstreamstringstreamz__cxx11::basic_Zbasic_regexZregexr   r#  wcwsZmatch_resultsr?   	sub_matchregex_iteratorregex_token_iteratorZfposZ	streamposnanosecondsmicrosecondsmillisecondssecondsminuteshoursdaysweeks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   rC  multimapr4  )r)   r   multisetunordered_mapzstd::hash<{0}>zstd::equal_to<{0}>)r   rC     unordered_multimapunordered_set)r)   r   rC  unordered_multisetrC   rE  r   r|  r  r  r  r  r  r  )r  r  r  r  r  rC   rE  r   r|  )r  r  )	r  r   r  r  r  r  r  r  r  )r  r  r  r  )rC   r  rC   rE  r   r|  )r  r   )r   r#  r   r  )r  r  r  )
r  r  r  r  r	  r
  r  r  r  r  rC   rE  r   r|  r  r  r  r  r  r  )r!  r"  r#  r$  r%  )r  r  r  )r  Zchr@   abiZdurrW  r   r   r   register_type_printerst
  s       
"(




*   






r'  c             C   s8   t rtjj| t n| dkr t} | jjt t|  dS )z4Register libstdc++ pretty-printers with objfile Obj.N)_use_gdb_ppr   ZprintingZregister_pretty_printerlibstdcxx_printerZpretty_printersrP   r'  )r  r   r   r   register_libstdcxx_printers
  s    r*  c              C   sX  t datjddt tjddt tjddt tjddt tjddt tjddt tjddt tjdd	t tjdd
t	 tjddt
 tjddt tjddt tjddt tjddt	 tjddt tjddt tjddt tjddt ttjdr.tjddt tjddt tjdt tjdt tjdt tjdt tjdt tjdt	 tjdt	 tjdt tjddt tjdd t tjdd!t tjdd"t tjdd#t tjdd$t tjdd%t tjd&dt tjd&d t tjd&d!t tjd&d"t tjd&d#t tjd&d$t tjdd't tjdd(t tjdd)t tjdd)t x2doD ]*} tjdd-|  t tjdd-|  t qW tjd.d/t tjd.d0t tjdd1t tjd2d3t  tjd4t tjd5t tjd6t tjd7t tjd8t tjd9d:t! tjd9d;t" tjd9d<t# tjd=d>t$ tjd?d>t$ tjd@d>t% tjdAd>t% tjdd:t! tjdd;t" tjdd<t# tjddBt& tjddCt' tjddDt( tjddEt( tjddFt( tjddGt) tjddHt* xdpD ]}tjd.|t+ qW tjd.dYt, tjd.dZt, tjd.d[t- tjd.d\t. tjd.d]t/ tjdd^t0 tjd_d`t1 tjddat2 tjddbt2 tjddct3 tjdddt3 tjddet4 tjddft4 tjd_dgt5 tjddht6 tjddit6 tjddjt7 tjd_dkt8 tjddlt9 tjddmt9 tjdnt: d S )qNzlibstdc++-v6zstd::r  zstd::__cxx11::Zbitsetr  r   r   r  r  ZpairZpriority_queueZqueuero   r4  stackr  r  Zlocalera  rg  rh  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_ptrr  r  r  r  r   z
std::tr1::Zinitializer_listZatomicZbasic_stringbufr  r  r  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_orderingrO  spanZbasic_format_argsr  r  yearr  weekday_indexedweekday_last	month_daymonth_day_lastmonth_weekdaymonth_weekday_last
year_monthyear_month_dayyear_month_day_lastyear_month_weekdayyear_month_weekday_last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  r  r  )r  r  r.  r  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  );r  r)  r  r   r  r   r   ry   r   r   rJ  r   r   rq   r   r  r   r   r  rQ  r  r[   r
  r  r  ru  rv  r   r   r}  r  r  rl  r  r)  r5  r7  rB  r-  r0  rL  rs  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
  sL   






  
r;  )N)vr   r  r>   rF   ri  r   rG   r  r   r   r   zipr   r   r   ZtimezoneZutcr  Ztzinfor   r(  Zgdb.printingrT  r  Z	gdb.typesr   r  r   Zprinter_baser%   r-   r2   r8   r5   rB   r;   rK   rO   rT   rU   r[   rk   rm   rp   rq   ru   rx   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  r)  r-  r0  r5  r7  rB  rJ  rL  rQ  rl  rs  ru  rv  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   <module>   s   

%
(&"IU(*$/A" /%-^!,5I!{'$*/?",Ce%T
	o T