Example #1
0
    def check(self, left, right):
        in1_type = left.type
        in2_type = right.type
        if not isinstance(in1_type, rtypes.TypeString) or not isinstance(in2_type, rtypes.TypeString):
            return False

        if in1_type.dims[0].shape == UNDEFINED or in2_type.dims[0].shape == UNDEFINED:
            nshape = UNDEFINED
        else:
            nshape = in1_type.dims[0].shape + in2_type.dims[0].shape

        in1_impli_cls = casts.findImplicitCastTypes(in1_type.__class__)
        in2_impli_cls = casts.findImplicitCastTypes(in2_type.__class__)
        out_impli_cls = in1_impli_cls & in2_impli_cls
        out_impli_cls = rtypes.mostSpecializedTypesCls(out_impli_cls)
        assert len(out_impli_cls) == 1, (
            "Multiple output types for " + "arithmetic operation found: " + str(out_impli_cls)
        )
        out_cls = out_impli_cls[0]

        ndim = dimensions.Dim(
            nshape, dependent=(True,) * len(left.dims), name=in1_type.dims[0].name + "_" + in2_type.dims[0].name
        )
        out_type = out_cls(in1_type.has_missing or in2_type.has_missing, dims=dimpaths.DimPath(ndim))
        return out_type  # }}}
Example #2
0
    def check(self, left, right):
        in1_type = left.type
        in2_type = right.type
        if not isinstance(in1_type, rtypes.TypeNumber) or not isinstance(in2_type, rtypes.TypeNumber):
            return False

        in1_impli_cls = casts.findImplicitCastTypes(in1_type.__class__)
        in2_impli_cls = casts.findImplicitCastTypes(in2_type.__class__)
        out_impli_cls = in1_impli_cls & in2_impli_cls

        out_impli_cls = [ocls for ocls in out_impli_cls if issubclass(ocls, rtypes.TypeNumber)]
        if not out_impli_cls:
            return False

        out_impli_cls = rtypes.mostSpecializedTypesCls(out_impli_cls)
        assert len(out_impli_cls) == 1, (
            "Multiple output types for " + "arithmetic operation found: " + str(out_impli_cls)
        )
        out_cls = out_impli_cls[0]

        out_type = out_cls(in1_type.has_missing or in2_type.has_missing)

        return out_type  # }}}