Ejemplo n.º 1
0
    def __init__(self, type, values):
        values = tuple(type.value(v) for v in values)
        iterator = ValuesIterator(type, values)

        generator = Function().returns(type)
        generator.code("""
            switch({{rand_int}}(0, {{_size}})) {
                {%- for i, v in _values %}
                case {{i}}: return {{b(v)}};
                {%- endfor %}
                default: assert(0);
            }
        """, _values=enumerate(values), _size=len(values), rand_int=rand_int)
        generator.uses(values)

        super().__init__(type, iterator, generator())
Ejemplo n.º 2
0
Archivo: join.py Proyecto: spirali/qit
 def _make_generator(self, type, domains, ratios):
     generators = tuple(d.generator for d in domains)
     f = Function(returns=type)
     f.code("""
         qint s = 0;
         {%- for r in _ratios %}
         s += {{b(r)}};
         {%- if not loop.last %}
         qint r{{loop.index0}} = s;
         {%- endif %}
         {%- endfor %}
         qint r = {{rand_int}}(0, s);
         {%- for g in _generators %}
             {%- if not loop.last %}
             if (r < r{{loop.index0}})
             {% endif %}
             {
                 return {{b(g)}};
             }
         {%- endfor %}
     """, _generators=generators, _ratios=ratios, rand_int=rand_int)
     f.uses(generators + ratios)
     return f()