def iternext_series_array(context, builder, sig, args, result): """ Implementation of iternext() for the ArrayIterator type :param context: context descriptor :param builder: llvmlite IR Builder :param sig: iterator signature :param args: tuple with iterator arguments, such as instruction, operands and types :param result: iternext result """ [iterty] = sig.args [iter] = args arrayty = iterty.array_type if arrayty.ndim != 1: raise NotImplementedError("iterating over %dD array" % arrayty.ndim) iterobj = context.make_helper(builder, iterty, value=iter) ary = make_array(arrayty)(context, builder, value=iterobj.array) nitems, = cgutils.unpack_tuple(builder, ary.shape, count=1) index = builder.load(iterobj.index) is_valid = builder.icmp(lc.ICMP_SLT, index, nitems) result.set_valid(is_valid) with builder.if_then(is_valid): value = _getitem_array1d(context, builder, arrayty, ary, index, wraparound=False) result.yield_(value) nindex = cgutils.increment_index(builder, index) builder.store(nindex, iterobj.index)
def iternext_itertuples(context, builder, sig, args, result): iterty, = sig.args it, = args # TODO: support string arrays iterobj = context.make_helper(builder, iterty, value=it) # first array type is implicit int index # use len() to support string arrays len_sig = signature(types.intp, iterty.array_types[1]) nitems = context.compile_internal(builder, lambda a: len(a), len_sig, [iterobj.array0]) # ary = make_array(iterty.array_types[1])(context, builder, value=iterobj.array0) # nitems, = cgutils.unpack_tuple(builder, ary.shape, count=1) index = builder.load(iterobj.index) is_valid = builder.icmp(lc.ICMP_SLT, index, nitems) result.set_valid(is_valid) with builder.if_then(is_valid): values = [index] # XXX implicit int index for i, arr_typ in enumerate(iterty.array_types[1:]): arr_ptr = getattr(iterobj, "array{}".format(i)) if arr_typ == types.Array(types.NPDatetime('ns'), 1, 'C'): getitem_sig = signature(pandas_timestamp_type, arr_typ, types.intp) val = context.compile_internal( builder, lambda a, i: hpat.pd_timestamp_ext. convert_datetime64_to_timestamp(np.int64(a[i])), getitem_sig, [arr_ptr, index]) else: getitem_sig = signature(arr_typ.dtype, arr_typ, types.intp) val = context.compile_internal(builder, lambda a, i: a[i], getitem_sig, [arr_ptr, index]) # arr = make_array(arr_typ)(context, builder, value=arr_ptr) # val = _getitem_array1d(context, builder, arr_typ, arr, index, # wraparound=False) values.append(val) value = context.make_tuple(builder, iterty.yield_type, values) result.yield_(value) nindex = cgutils.increment_index(builder, index) builder.store(nindex, iterobj.index)
def iternext_str_array(context, builder, sig, args, result): [iterty] = sig.args [iter_arg] = args iterobj = context.make_helper(builder, iterty, value=iter_arg) len_sig = signature(types.intp, string_array_type) nitems = context.compile_internal(builder, lambda a: len(a), len_sig, [iterobj.array]) index = builder.load(iterobj.index) is_valid = builder.icmp(lc.ICMP_SLT, index, nitems) result.set_valid(is_valid) with builder.if_then(is_valid): getitem_sig = signature(string_type, string_array_type, types.intp) value = context.compile_internal(builder, lambda a, i: a[i], getitem_sig, [iterobj.array, index]) result.yield_(value) nindex = cgutils.increment_index(builder, index) builder.store(nindex, iterobj.index)
def iternext_unicode(context, builder, sig, args, result): [iterty] = sig.args [iter] = args tyctx = context.typing_context # get ref to unicode.__getitem__ fnty = tyctx.resolve_value_type(operator.getitem) getitem_sig = fnty.get_call_type(tyctx, (types.unicode_type, types.uintp), {}) getitem_impl = context.get_function(fnty, getitem_sig) # get ref to unicode.__len__ fnty = tyctx.resolve_value_type(len) len_sig = fnty.get_call_type(tyctx, (types.unicode_type, ), {}) len_impl = context.get_function(fnty, len_sig) # grab unicode iterator struct iterobj = context.make_helper(builder, iterty, value=iter) # find the length of the string strlen = len_impl(builder, (iterobj.data, )) # find the current index index = builder.load(iterobj.index) # see if the index is in range is_valid = builder.icmp_unsigned('<', index, strlen) result.set_valid(is_valid) with builder.if_then(is_valid): # return value at index gotitem = getitem_impl(builder, ( iterobj.data, index, )) result.yield_(gotitem) # bump index for next cycle nindex = cgutils.increment_index(builder, index) builder.store(nindex, iterobj.index)
def iternext_unicode(context, builder, sig, args, result): [iterty] = sig.args [iter] = args tyctx = context.typing_context # get ref to unicode.__getitem__ fnty = tyctx.resolve_value_type(operator.getitem) getitem_sig = fnty.get_call_type(tyctx, (types.unicode_type, types.uintp), {}) getitem_impl = context.get_function(fnty, getitem_sig) # get ref to unicode.__len__ fnty = tyctx.resolve_value_type(len) len_sig = fnty.get_call_type(tyctx, (types.unicode_type,), {}) len_impl = context.get_function(fnty, len_sig) # grab unicode iterator struct iterobj = context.make_helper(builder, iterty, value=iter) # find the length of the string strlen = len_impl(builder, (iterobj.data,)) # find the current index index = builder.load(iterobj.index) # see if the index is in range is_valid = builder.icmp_unsigned('<', index, strlen) result.set_valid(is_valid) with builder.if_then(is_valid): # return value at index gotitem = getitem_impl(builder, (iterobj.data, index,)) result.yield_(gotitem) # bump index for next cycle nindex = cgutils.increment_index(builder, index) builder.store(nindex, iterobj.index)