B
    \{                 @   sp   d Z ddlmZ ddlmZ ddlmZ ddlmZmZ ddlm	Z	 G d	d
 d
ej
ZG dd dejej
ZdS )z3
    Implements support for HDF5 dimension scales.
    )absolute_import   )h5ds   )base)phil	with_phil)Datasetc               @   s   e Zd ZdZeedd Zejedd Ze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d Zdd Zdd Zdd Zedd ZdS )DimensionProxyz-
        Represents an HDF5 "dimension".
    c          	   C   s>   y t | j}| |jd | j S  ttfk
r8   dS X dS )z& Get or set the dimension scale label ZDIMENSION_LABELS N)r	   _id_dZattrs
_dimensionKeyError
IndexError)selfdset r   ,lib/python3.7/site-packages/h5py/_hl/dims.pylabel   s
    
zDimensionProxy.labelc             C   s   t | j| j| | d S )N)r   Z	set_labelr   r   _e)r   valr   r   r   r   (   s    c             C   s   || _ || _d S )N)r   r   )r   Zid_Z	dimensionr   r   r   __init__.   s    zDimensionProxy.__init__c             C   s   t t| | j| jfS )N)hashtyper   r   )r   r   r   r   __hash__3   s    zDimensionProxy.__hash__c             C   s   t | t |kS )N)r   )r   otherr   r   r   __eq__7   s    zDimensionProxy.__eq__c             c   s   x|   D ]
}|V  q
W d S )N)keys)r   kr   r   r   __iter__;   s    zDimensionProxy.__iter__c             C   s   t | j| jS )N)r   Zget_num_scalesr   r   )r   r   r   r   __len__@   s    zDimensionProxy.__len__c                sn   t  tr0g }tjj|jd t|  S  fdd}tjj|d}|d krbt t|S d S )Nr   c                s   t |  kr| S dS )z- Iterate over scales to find a matching name N)r   get_scale_namer   )Zdsid)itemr   r   r   fM   s    z%DimensionProxy.__getitem__.<locals>.f)	
isinstanceintr   iterater   r   appendr	   r   )r   r#   scalesr$   Zresr   )r#   r   r   __getitem__D   s    
zDimensionProxy.__getitem__c          	   C   s(   t  t| j|j| j W dQ R X dS )zo Attach a scale to this dimension.

        Provide the Dataset of the scale you would like to attach.
        N)r   r   attach_scaler   idr   )r   r   r   r   r   r+   W   s    zDimensionProxy.attach_scalec          	   C   s(   t  t| j|j| j W dQ R X dS )zq Remove a scale from this dimension.

        Provide the Dataset of the scale you would like to remove.
        N)r   r   detach_scaler   r,   r   )r   r   r   r   r   r-   _   s    zDimensionProxy.detach_scalec          	      sH   t : g }t dkr,t j j|jd  fdd|D S Q R X dS )zX Get a list of (name, Dataset) pairs with all scales on this
        dimension.
        r   c                s$   g | ]}  t|t|fqS r   )r   r   r"   r	   ).0x)r   r   r   
<listcomp>t   s   z(DimensionProxy.items.<locals>.<listcomp>N)r   lenr   r'   r   r   r(   )r   r)   r   )r   r   itemsg   s    
zDimensionProxy.itemsc          	   C   s"   t  dd |  D S Q R X dS )z7 Get a list of names for the scales on this dimension. c             S   s   g | ]\}}|qS r   r   )r.   key_r   r   r   r0   {   s    z'DimensionProxy.keys.<locals>.<listcomp>N)r   r2   )r   r   r   r   r   x   s    zDimensionProxy.keysc          	   C   s"   t  dd |  D S Q R X dS )z5 Get a list of Dataset for scales on this dimension. c             S   s   g | ]\}}|qS r   r   )r.   r4   r   r   r   r   r0      s    z)DimensionProxy.values.<locals>.<listcomp>N)r   r2   )r   r   r   r   values}   s    zDimensionProxy.valuesc             C   s"   | j s
dS d| j| jt| j f S )Nz"<Dimension of closed HDF5 dataset>z)<"%s" dimension %d of HDF5 dataset at %s>)r   r   r   r,   )r   r   r   r   __repr__   s    zDimensionProxy.__repr__N)__name__
__module____qualname____doc__propertyr   r   setterr   r   r   r    r!   r*   r+   r-   r2   r   r5   r6   r   r   r   r   r
      s"   r
   c               @   sV   e Zd ZdZedd Zedd Zedd Zedd	 Zed
d Z	dddZ
dS )DimensionManagerz
        Represents a collection of dimension associated with a dataset.

        Like AttributeManager, an instance of this class is returned when
        accessing the ".dims" property on a Dataset.
    c             C   s   |j | _dS )z Private constructor.
        N)r,   r   )r   parentr   r   r   r      s    zDimensionManager.__init__c             C   s$   |t | d krtdt| j|S )z# Return a Dimension object
        r   zIndex out of range)r1   r   r
   r   )r   indexr   r   r   r*      s    zDimensionManager.__getitem__c             C   s   t t| jjS )z3 Number of dimensions associated with the dataset. )r1   r	   r   shape)r   r   r   r   r!      s    zDimensionManager.__len__c             c   s$   xt t| D ]}| | V  qW dS )z Iterate over the dimensions. N)ranger1   )r   ir   r   r   r       s    zDimensionManager.__iter__c             C   s   | j s
dS dt| j  S )Nz#<Dimensions of closed HDF5 dataset>z!<Dimensions of HDF5 object at %s>)r   r,   )r   r   r   r   r6      s    zDimensionManager.__repr__r   c          	   C   s(   t  t|j| | W dQ R X dS )zo Create a new dimension, from an initial scale.

        Provide the dataset and a name for the scale.
        N)r   r   Z	set_scaler,   r   )r   r   namer   r   r   create_scale   s    zDimensionManager.create_scaleN)r   )r7   r8   r9   r:   r   r   r*   r!   r    r6   rD   r   r   r   r   r=      s   r=   N)r:   Z
__future__r   r   r   r   r   r   Zdatasetr	   ZCommonStateObjectr
   ZMappingHDF5r=   r   r   r   r   <module>   s   t