Esempio n. 1
0
SEXP c_check_vector(SEXP x, SEXP strict, SEXP any_missing, SEXP all_missing, SEXP len, SEXP min_len, SEXP max_len, SEXP unique, SEXP names) {
    if (!isVector(x))
        return make_type_error(x, "vector");
    if (asFlag(strict, "strict")) {
        SEXP attr = ATTRIB(x);
        if ((length(attr) > 0 && (TAG(attr) != R_NamesSymbol)) || CDR(attr) != R_NilValue)
            return make_type_error(x, "vector");
    }
    assert(check_vector_len(x, len, min_len, max_len));
    assert(check_vector_names(x, names));
    assert(check_vector_missings(x, any_missing, all_missing));
    assert(check_vector_unique(x, unique));
    return ScalarLogical(TRUE);
}
Esempio n. 2
0
SEXP c_check_dataframe(SEXP x, SEXP any_missing, SEXP all_missing, SEXP min_rows, SEXP min_cols, SEXP rows, SEXP cols, SEXP row_names, SEXP col_names) {
    if (!isFrame(x))
        return make_type_error(x, "data.frame");
    assert(check_matrix_dims(x, min_rows, min_cols, rows, cols));

    if (!isNull(row_names)) {
        SEXP nn = getAttrib(x, install("row.names"));
        msg_t msg;

        if (isInteger(nn)) {
            nn = PROTECT(coerceVector(nn, STRSXP));
            msg = check_names(nn, row_names, "Rows");
            UNPROTECT(1);
        } else {
            msg = check_names(nn, row_names, "Rows");
        }
        if (!msg.ok)
            return make_result(msg.msg);
    }

    if (!isNull(col_names))
        assert(check_names(getAttrib(x, R_NamesSymbol), col_names, "Columns"));
    if (!asFlag(any_missing, "any.missing") && any_missing_frame(x))
        return make_result("Contains missing values");
    if (!asFlag(all_missing, "all.missing") && all_missing_frame(x))
        return make_result("Contains only missing values");
    return ScalarLogical(TRUE);
}
Esempio n. 3
0
SEXP c_check_array(SEXP x, SEXP mode, SEXP any_missing, SEXP d, SEXP min_d, SEXP max_d) {
    if (!isArray(x))
        return make_type_error(x, "array");

    assert(check_storage(x, mode));

    if (!asFlag(any_missing, "any.missing") && any_missing_atomic(x))
        return make_result("Contains missing values");

    R_len_t ndim = length(getAttrib(x, R_DimSymbol));
    if (!isNull(d)) {
        R_len_t di = asCount(d, "d");
        if (ndim != di)
            return make_result("Must be a %i-d array, but has dimension %i", di, ndim);
    }

    if (!isNull(min_d)) {
        R_len_t di = asCount(min_d, "min.d");
        if (ndim < di)
            return make_result("Must have >=%i dimensions, but has dimension %i", di, ndim);
    }

    if (!isNull(max_d)) {
        R_len_t di = asCount(max_d, "max.d");
        if (ndim > di)
            return make_result("Must have <=%i dimensions, but has dimension %i", di, ndim);
    }

    return ScalarLogical(TRUE);
}
Esempio n. 4
0
SEXP c_check_scalar(SEXP x, SEXP na_ok) {
    Rboolean is_na = is_scalar_na(x);
    if (xlength(x) != 1 || (!is_na && !isVectorAtomic(x)))
        return make_type_error(x, "atomic scalar");
    if (is_na && !asFlag(na_ok, "na.ok"))
        return make_result("May not be NA");
    return ScalarLogical(TRUE);
}
Esempio n. 5
0
SEXP c_check_atomic_vector(SEXP x, SEXP any_missing, SEXP all_missing, SEXP len, SEXP min_len, SEXP max_len, SEXP unique, SEXP names) {
    if (!isVectorAtomic(x))
        return make_type_error(x, "atomic vector");
    assert(check_vector_len(x, len, min_len, max_len));
    assert(check_vector_names(x, names));
    assert(check_vector_missings(x, any_missing, all_missing));
    assert(check_vector_unique(x, unique));
    return ScalarLogical(TRUE);
}
Esempio n. 6
0
SEXP c_check_integer(SEXP x, SEXP lower, SEXP upper, SEXP any_missing, SEXP all_missing, SEXP len, SEXP min_len, SEXP max_len, SEXP unique, SEXP names) {
    if (!isInteger(x) && !all_missing_atomic(x))
        return make_type_error(x, "integer");
    assert(check_vector_len(x, len, min_len, max_len));
    assert(check_vector_names(x, names));
    assert(check_vector_missings(x, any_missing, all_missing));
    assert(check_bounds(x, lower, upper));
    assert(check_vector_unique(x, unique));
    return ScalarLogical(TRUE);
}
Esempio n. 7
0
SEXP c_check_character(SEXP x, SEXP min_chars, SEXP any_missing, SEXP all_missing, SEXP len, SEXP min_len, SEXP max_len, SEXP unique, SEXP names) {
    if (!isString(x) && !all_missing_atomic(x))
        return make_type_error(x, "character");
    assert(check_vector_len(x, len, min_len, max_len));
    assert(check_vector_names(x, names));
    assert(check_vector_missings(x, any_missing, all_missing));
    assert(check_min_chars(x, min_chars));
    assert(check_vector_unique(x, unique));
    return ScalarLogical(TRUE);
}
Esempio n. 8
0
SEXP c_check_int(SEXP x, SEXP na_ok, SEXP lower, SEXP upper, SEXP tol) {
    Rboolean is_na = is_scalar_na(x);
    double dtol = asNumber(tol, "tol");
    if (xlength(x) != 1 || (!is_na && !isIntegerish(x, dtol)))
        return make_type_error(x, "single integerish value");
    if (is_na) {
        if (!asFlag(na_ok, "na.ok"))
            return make_result("May not be NA");
    }
    assert(check_bounds(x, lower, upper));
    return ScalarLogical(TRUE);
}
Esempio n. 9
0
SEXP c_check_number(SEXP x, SEXP na_ok, SEXP lower, SEXP upper, SEXP finite) {
    Rboolean is_na = is_scalar_na(x);
    if (xlength(x) != 1 || (!is_na && !isStrictlyNumeric(x)))
        return make_type_error(x, "number");
    if (is_na) {
        if (!asFlag(na_ok, "na.ok"))
            return make_result("May not be NA");
        return ScalarLogical(TRUE);
    }
    assert(check_vector_finite(x, finite));
    assert(check_bounds(x, lower, upper));
    return ScalarLogical(TRUE);
}
Esempio n. 10
0
// bit
Val bit(Val bitvec, Val index)
{
    if (simple_bit_vector_p(bitvec))
    {
        return sbit(bitvec, index);
    }
    else if (bit_vector_p(bitvec))
    {
        const Vector* pRunner =
            bitvec->Decode<Vector>();

        if (cmp_xx(index, pRunner->m_total_size) >= 0)
        {
            error(Qvector_index_error,
                Kvector, bitvec,
                Kdatum, index );
        }

        for (;;)
        {
            index = add_xx(index, pRunner->m_offset);
            Val datavec = pRunner->m_displaced_to;
            if (simple_bit_vector_p(datavec))
            {
                return sbit(datavec, index);
            }

            if (! bit_vector_p(datavec))
            {
                error(make_type_error(bitvec, Qbit_vector));
            }

            pRunner = datavec->Decode<BitVector>();
        } // for
    } // if

    error(make_type_error(bitvec, Qbit_vector));
} // bit
Esempio n. 11
0
SEXP c_check_count(SEXP x, SEXP na_ok, SEXP positive, SEXP tol) {
    Rboolean is_na = is_scalar_na(x);
    double dtol = asNumber(tol, "tol");
    if (xlength(x) != 1 || (!is_na && !isIntegerish(x, dtol)))
        return make_type_error(x, "count");
    if (is_na) {
        if (!asFlag(na_ok, "na.ok"))
            return make_result("May not be NA");
    } else  {
        const int pos = (int) asFlag(positive, "positive");
        if (asInteger(x) < pos)
            return make_result("Must be >= %i", pos);
    }
    return ScalarLogical(TRUE);
}
Esempio n. 12
0
SEXP c_check_matrix(SEXP x, SEXP mode, SEXP any_missing, SEXP all_missing, SEXP min_rows, SEXP min_cols, SEXP rows, SEXP cols, SEXP row_names, SEXP col_names) {
    if (!isMatrix(x))
        return make_type_error(x, "matrix");
    assert(check_storage(x, mode));
    assert(check_matrix_dims(x, min_rows, min_cols, rows, cols));

    if (!isNull(row_names) && xlength(x) > 0) {
        SEXP nn = getAttrib(x, R_DimNamesSymbol);
        if (!isNull(nn))
            nn = VECTOR_ELT(nn, 0);
        assert(check_names(nn, row_names, "Rows"));
    }

    if (!isNull(col_names) && xlength(x) > 0) {
        SEXP nn = getAttrib(x, R_DimNamesSymbol);
        if (!isNull(nn))
            nn = VECTOR_ELT(nn, 1);
        assert(check_names(nn, col_names, "Columns"));
    }
    assert(check_vector_missings(x, any_missing, all_missing));
    return ScalarLogical(TRUE);
}
Esempio n. 13
0
// Syntax:
//  .replace-vector vector-1 vector-2 &optional start-1 end-1 start-2 end-2
//      => vector-1
//
// Arguments and Values:
//  vector-1    specialized vector or simple-vector.
//  vector-2    vector of same type of vector-1
//
// For:
//  bit-and, bit-andc1, ... bit-xor
//  replace
//
Val replace_vector(Val v1, Val v2, Val s1, Val e1, Val s2, Val e2)
{
    check_type(v1, data_vector);

    Val classd = v1->Decode<Record>()->m_classd;

    if (v2->Is<Record>() && v2->Decode<Record>()->m_classd != classd)
    {
        error(make_type_error(v2, type_of(v1)));
    }

    if (! fixnump(s1) || minusp_xx(s1) || cmp_xx(s1, length(v1)) > 0)
    {
        error(Qbounding_index_error, Kdatum, s1, Ksequence, v1);
    }

    if (nil == e1) e1 = length(v1);
    if (! fixnump(e1) || cmp_xx(s1, e1) > 0 && cmp_xx(e1, length(v1)) > 0)
    {
        error(Qbounding_index_error,
            Ksequence, v1,
            Kstart,    s1,
            Kdatum,    e1 );
    }

    if (! fixnump(s2) || minusp_xx(s2) || cmp_xx(s2, length(v2)) > 0)
    {
        error(Qbounding_index_error, Kdatum, s2, Ksequence, v2);
    }

    if (nil == e2) e2 = length(v1);
    if (! fixnump(e2) || cmp_xx(s2, e2) > 0 && cmp_xx(e2, length(v2)) > 0)
    {
        error(Qbounding_index_error,
            Ksequence, v2,
            Kstart,    s2,
            Kdatum,    e2 );
    }

    Int iS1 = Fixnum::Decode_(s1);
    Int iS2 = Fixnum::Decode_(s2);

    Int n1 = Fixnum::Decode_(e1) - iS1;
    Int n2 = Fixnum::Decode_(e2) - iS2;
    Int n = min(n1, n2);
    if (0 == n) return v1;

    void* pv1 = reinterpret_cast<void*>(v1->Decode<DataVector>() + 1);
    void* pv2 = reinterpret_cast<void*>(v2->Decode<DataVector>() + 1);

    switch (classd->Decode<ClassD>()->m_format_param->ToInt())
    {
    case Fixnum::One * 1:
        bit_replace(v1, v2, 
            static_cast<uint>(iS1), static_cast<uint>(iS2),
            static_cast<uint>(n) );
        break;

    case Fixnum::One * 8:
        evcl_memmove(
            reinterpret_cast<uint8*>(pv1) + iS1,
            reinterpret_cast<uint8*>(pv2) + iS2,
            n );
        break;

    case Fixnum::One * 16:
        evcl_memmove(
            reinterpret_cast<uint16*>(pv1) + iS1,
            reinterpret_cast<uint16*>(pv2) + iS2,
            n * 2 );
        break;

    case Fixnum::One * 32:
        evcl_memmove(
            reinterpret_cast<uint32*>(pv1) + iS1,
            reinterpret_cast<uint32*>(pv2) + iS2,
            n * 4 );
        break;

    case Fixnum::One * 64:
        evcl_memmove(
            reinterpret_cast<uint64*>(pv1) + iS1,
            reinterpret_cast<uint64*>(pv2) + iS2,
            n * 8 );
        break;

    case Fixnum::One * 128:
        evcl_memmove(
            reinterpret_cast<uint64*>(pv1) + iS1 * 2,
            reinterpret_cast<uint64*>(pv2) + iS2 * 2,
            n * 16 );
        break;

    default:
        CAN_NOT_HAPPEN();
    } // switch classd

    return v1;
} // replace_vector