U
    uc$                     @   sp   d Z ddlmZ dZdZG dd dZG dd deZG d	d
 d
eZdd ZG dd deZ	G dd dZ
dS )zBuffers
    BytesIOi   i    c                   @   sj   e Zd ZdZdddZdd Zdd ZeZd	d
 ZdddZ	dddZ
dd Zdd Zdd Zdd ZdS )FileBasedBufferr   Nc                 C   sn   || _ |d k	rj| }| }|d |t}|s8qD|| q(t| | | _|| || d S Nr   )	filegetfiletellseekread
COPY_BYTESwriteintremain)selfr   from_buffer	from_fileread_posdata r   4/tmp/pip-unpacked-wheel-yalm6hg1/waitress/buffers.py__init__   s    


zFileBasedBuffer.__init__c                 C   s   | j S N)r   r   r   r   r   __len__,   s    zFileBasedBuffer.__len__c                 C   s   dS )NTr   r   r   r   r   __nonzero__/   s    zFileBasedBuffer.__nonzero__c                 C   sB   | j }| }|dd || || | jt| | _d S Nr      )r   r   r	   r   r   len)r   sr   r   r   r   r   append4   s    

zFileBasedBuffer.appendFc                 C   sT   | j }|s| }|dk r$| }n
||}|rF|  jt|8  _n
|| |S r   )r   r   r
   r   r   r	   r   numbytesskipr   r   resr   r   r   get<   s    


zFileBasedBuffer.getc                 C   s:   | j |k rtd|| j f | j|d | j | | _ d S )Nz)Can't skip %d bytes in buffer of %d bytes   )r   
ValueErrorr   r	   )r   r"   allow_pruner   r   r   r#   K   s    
zFileBasedBuffer.skipc                 C   s
   t  d S r   NotImplementedErrorr   r   r   r   newfileS   s    zFileBasedBuffer.newfilec                 C   sp   | j }| jdkrB| }|dd | }|| |dkrBd S |  }|t}|sZqf|| qJ|| _ d S r   )r   r   r   r	   r+   r
   r   r   )r   r   r   sznfr   r   r   r   pruneV   s    


zFileBasedBuffer.prunec                 C   s   | j S r   )r   r   r   r   r   r   h   s    zFileBasedBuffer.getfilec                 C   s    t | jdr| j  d| _d S )Ncloser   )hasattrr   r/   r   r   r   r   r   r/   k   s    
zFileBasedBuffer.close)N)r    F)r   )__name__
__module____qualname__r   r   r   r   __bool__r   r%   r#   r+   r.   r   r/   r   r   r   r   r      s   


r   c                   @   s   e Zd ZdddZdd ZdS )TempfileBasedBufferNc                 C   s   t | |  | d S r   )r   r   r+   r   r   r   r   r   r   r   s    zTempfileBasedBuffer.__init__c                 C   s   ddl m} |dS )Nr   )TemporaryFilezw+b)tempfiler7   )r   r7   r   r   r   r+   u   s    zTempfileBasedBuffer.newfile)Nr1   r2   r3   r   r+   r   r   r   r   r5   q   s   
r5   c                   @   s   e Zd ZdddZdd ZdS )BytesIOBasedBufferNc                 C   s&   |d k	rt | t | nt | _d S r   )r   r   r   r   r6   r   r   r   r   |   s    zBytesIOBasedBuffer.__init__c                 C   s   t  S r   r   r   r   r   r   r+      s    zBytesIOBasedBuffer.newfile)Nr9   r   r   r   r   r:   {   s   
r:   c                 C   s&   t | dr|  S t | do$t | dS )Nseekabler	   r   )r0   r;   )fpr   r   r   _is_seekable   s    
r=   c                   @   sF   e Zd ZdddZdddZdd	d
Zdd Zdd ZeZdd Z	dS )ReadOnlyFileBasedBuffer   c                 C   sD   || _ || _t| j r@t| j dr,| j j| _| j j| _| j j| _d S )Nr;   )r   
block_sizer=   r0   r;   r	   r   )r   r   r@   r   r   r   r      s    


z ReadOnlyFileBasedBuffer.__init__Nc                 C   sb   t | jr\| j }| jdd | j }| j| || }|d krP|| _nt||| _| jS r   )r=   r   r   r	   r   min)r   sizeZ	start_posZend_posfsizer   r   r   prepare   s    


zReadOnlyFileBasedBuffer.preparer    Fc                 C   sZ   |dks|| j kr| j }| j}|s*| }||}|rL|  j t|8  _ n
|| |S )Nr    )r   r   r   r
   r   r	   r!   r   r   r   r%      s    

zReadOnlyFileBasedBuffer.getc                 C   s   | S r   r   r   r   r   r   __iter__   s    z ReadOnlyFileBasedBuffer.__iter__c                 C   s   | j | j}|st|S r   )r   r
   r@   StopIteration)r   valr   r   r   next   s    zReadOnlyFileBasedBuffer.nextc                 C   s   t d S r   r)   )r   r   r   r   r   r      s    zReadOnlyFileBasedBuffer.append)r?   )N)r    F)
r1   r2   r3   r   rD   r%   rE   rH   __next__r   r   r   r   r   r>      s   


r>   c                   @   s   e Zd ZdZdZdZdZdd Zdd Zd	d
 Z	e	Z
dd Zdd Zdd Zdd ZdddZdddZdd Zdd Zdd ZdS ) OverflowableBufferz
    This buffer implementation has four stages:
    - No data
    - Bytes-based buffer
    - BytesIO-based buffer
    - Temporary file storage
    The first two stages are fastest for simple transfers.
    FN    c                 C   s
   || _ d S r   )overflow)r   rL   r   r   r   r      s    zOverflowableBuffer.__init__c                 C   s$   | j }|d k	r| S | j S d S r   )bufr   strbufr   rM   r   r   r   r      s    zOverflowableBuffer.__len__c                 C   s   |   dkS r   )r   r   r   r   r   r      s    zOverflowableBuffer.__nonzero__c                 C   sF   | j }t|| jkr|   n|   | j}|rB|| j  d| _ |S NrK   )rN   r   rL   _set_large_buffer_set_small_bufferrM   r   )r   rN   rM   r   r   r   _create_buffer   s    
z!OverflowableBuffer._create_bufferc                 C   s,   | j }t|| _ t|dr"|  d| _d S )Nr/   F)rM   r:   r0   r/   
overflowedr   Zoldbufr   r   r   rR      s
    

z$OverflowableBuffer._set_small_bufferc                 C   s,   | j }t|| _ t|dr"|  d| _d S )Nr/   T)rM   r5   r0   r/   rT   rU   r   r   r   rQ      s
    

z$OverflowableBuffer._set_large_bufferc                 C   sl   | j }|d kr>| j}t|t| tk r6|| | _d S |  }|| | }| jsh|| jkrh| 	  d S r   )
rM   rN   r   STRBUF_LIMITrS   r   r   rT   rL   rQ   )r   r   rM   rN   r,   r   r   r   r   
  s    


zOverflowableBuffer.appendr    c                 C   s0   | j }|d kr$| j}|s|S |  }|||S r   )rM   rN   rS   r%   )r   r"   r#   rM   rN   r   r   r   r%     s    zOverflowableBuffer.getc                 C   sB   | j }|d kr2|r*|t| jkr*d| _d S |  }||| d S rP   )rM   r   rN   rS   r#   )r   r"   r(   rM   r   r   r   r#   #  s    zOverflowableBuffer.skipc                 C   sD   | j }|dkrd| _dS |  | jr@| }|| jk r@|   dS )zt
        A potentially expensive operation that removes all data
        already retrieved from the buffer.
        NrK   )rM   rN   r.   rT   r   rL   rR   )r   rM   r,   r   r   r   r.   /  s    
zOverflowableBuffer.prunec                 C   s   | j }|d kr|  }| S r   )rM   rS   r   rO   r   r   r   r   A  s    zOverflowableBuffer.getfilec                 C   s   | j }|d k	r|  d S r   )rM   r/   rO   r   r   r   r/   G  s    zOverflowableBuffer.close)r    F)F)r1   r2   r3   __doc__rT   rM   rN   r   r   r   r4   rS   rR   rQ   r   r%   r#   r.   r   r/   r   r   r   r   rJ      s"   		


	
rJ   N)rW   ior   r   rV   r   r5   r:   r=   r>   rJ   r   r   r   r   <module>   s   X
;