ó
ù“Fac           @   sF   d  Z  d d l m Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d S(   sI   
This module contains helper classes for alignment arithmetic and checks
iÿÿÿÿ(   t   gcdt	   Alignmentc           B   sS   e  Z d  d d „ Z d „  Z d „  Z e d „  ƒ Z d „  Z d „  Z d „  Z	 RS(	   i   i    c         C   s   | |  _  | | |  _ d  S(   N(   t   alignt   offset(   t   selfR   R   (    (    s0   /usr/lib/python2.7/site-packages/xcbgen/align.pyt   __init__	   s    	c         C   s"   |  j  | j  k o! |  j | j k S(   N(   R   R   (   R   t   other(    (    s0   /usr/lib/python2.7/site-packages/xcbgen/align.pyt   __eq__   s    c         C   s   d |  j  |  j f S(   Ns   (align=%d, offset=%d)(   R   R   (   R   (    (    s0   /usr/lib/python2.7/site-packages/xcbgen/align.pyt   __str__   s    c         C   sh   |  d d k r t  d d ƒ S|  d d k r: t  d d ƒ S|  d d k rW t  d d ƒ St  d d ƒ Sd  S(   Ni   i    i   i   i   (   R   (   t   size(    (    s0   /usr/lib/python2.7/site-packages/xcbgen/align.pyt   for_primitive_type   s    c         C   s$   |  j  | |  j } t |  j | ƒ S(   N(   R   R   R   (   R   R	   t
   new_offset(    (    s0   /usr/lib/python2.7/site-packages/xcbgen/align.pyt   align_after_fixed_size#   s    c         C   sƒ   |  j  d k r" |  j d k r" t S| d k r2 t S| j  |  j  k  rH t S| j  |  j  d k rb t S| j |  j  |  j k r t St S(   sš   
        Assuming the given external_align, checks whether
        self is fulfilled for all cases.
        Returns True if yes, False otherwise.
        i   i    N(   R   R   t   Truet   Nonet   False(   R   t   external_align(    (    s0   /usr/lib/python2.7/site-packages/xcbgen/align.pyt   is_guaranteed_at(   s    c         C   s¢   t  |  j | j ƒ } |  j | } | j | } | | k rD | } nQ t | | ƒ } t  | | ƒ } |  j | } | j | } | | k s t ‚ | } t | | ƒ S(   N(   R    R   R   t   abst   AssertionErrorR   (   R   R   t	   new_alignt   new_offset_candidate1t   new_offset_candidate2R   t   offset_diff(    (    s0   /usr/lib/python2.7/site-packages/xcbgen/align.pyt   combine_withI   s    	(
   t   __name__t
   __module__R   R   R   t   staticmethodR
   R   R   R   (    (    (    s0   /usr/lib/python2.7/site-packages/xcbgen/align.pyR      s   				!t   AlignmentLogc           B   sP   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 RS(   c         C   s   g  |  _  g  |  _ d |  _ d  S(   Ni   (   t   ok_listt	   fail_listt	   verbosity(   R   (    (    s0   /usr/lib/python2.7/site-packages/xcbgen/align.pyR   ^   s    		c   
   
   C   sÜ  d } xò |  j  D]ç \ } } } } } t | ƒ } d | } |  j | ƒ r | d  k sb | d k r” | d | t | ƒ | t | ƒ t | ƒ f 7} n8 | d | t | ƒ t | ƒ | t | ƒ t | ƒ f 7} |  j d k r÷ | |  j | | ƒ 7} q÷ q q WxÚ |  j D]Ï \ } } } } }	 t | ƒ } d | } | d  k sH| d k rw| d | t | ƒ | t | ƒ | |	 f 7} n5 | d | t | ƒ | t | ƒ t | ƒ | |	 f 7} |  j d k r| |  j | | ƒ 7} qqW| S(   Nt    s     s'       %sok: %s:
	%sbefore: %s, after: %s
s5       %sok: field "%s" in %s:
	%sbefore: %s, after: %s
i   s>       %sfail: align %s is incompatible with
	%s%s
	%sReason: %s
sL       %sfail: align %s is incompatible with
	%sfield "%s" in %s
	%sReason: %s
(   R   t   lent   ok_callstack_is_relevantR   t   strR   t   callstack_to_strR   (
   R   t   resultt   align_beforet
   field_namet   type_objt	   callstackt   align_aftert	   stacksizet   indentt   reason(    (    s0   /usr/lib/python2.7/site-packages/xcbgen/align.pyR   c   s0    
, 
)/c         C   sG   d | } x( | D]  } | d | t  | ƒ f 7} q W| d | 7} | S(   Ns   	%scallstack: [
s   	  %s%s
s   	%s]
(   R#   (   R   R,   R)   R%   t
   stack_elem(    (    s0   /usr/lib/python2.7/site-packages/xcbgen/align.pyR$   ‡   s
    
c         C   s¹   |  j  d k r t St | ƒ d k r) t Sx‰ |  j D]~ \ } } } } } t | ƒ t | ƒ k r3 t | | t | ƒ  ƒ } t g  | D] \ } }	 | |	 k ^ qƒ ƒ }
 |
 r± t Sq3 q3 Wt S(   Ni   i    (   R   R   R!   R   t   zipt   allR   (   R   t   ok_callstackR&   R'   R(   t   fail_callstackR-   t   zippedt   it   jt	   is_subset(    (    s0   /usr/lib/python2.7/site-packages/xcbgen/align.pyR"      s    +c         C   s#   |  j  j | | | | | f ƒ d  S(   N(   R   t   append(   R   R&   R'   R(   R)   R*   (    (    s0   /usr/lib/python2.7/site-packages/xcbgen/align.pyt   ok£   s    c         C   s#   |  j  j | | | | | f ƒ d  S(   N(   R   R7   (   R   R&   R'   R(   R)   R-   (    (    s0   /usr/lib/python2.7/site-packages/xcbgen/align.pyt   fail¦   s    c         C   s*   |  j  j | j  ƒ |  j j | j ƒ d  S(   N(   R   t   extendR   (   R   R   (    (    s0   /usr/lib/python2.7/site-packages/xcbgen/align.pyR7   ©   s    c         C   s   t  |  j ƒ S(   N(   R!   R   (   R   (    (    s0   /usr/lib/python2.7/site-packages/xcbgen/align.pyt   ok_count­   s    (
   R   R   R   R   R$   R"   R8   R9   R7   R;   (    (    (    s0   /usr/lib/python2.7/site-packages/xcbgen/align.pyR   \   s   		$					N(   t   __doc__t	   fractionsR    t   objectR   R   (    (    (    s0   /usr/lib/python2.7/site-packages/xcbgen/align.pyt   <module>   s   U