Skip to content
Snippets Groups Projects
Commit 8768668b authored by florian's avatar florian
Browse files

ENH: Implement is_a and getter function for values

parent a8646421
No related branches found
No related tags found
1 merge request!24API: Introduce value and datatype structs to Extern C
Pipeline #13575 passed
Pipeline: caosdb-cppinttest

#13579

    ......@@ -424,7 +424,14 @@ int caosdb_entity_value_is_string(caosdb_entity_value *value, bool *out);
    int caosdb_entity_value_is_double(caosdb_entity_value *value, bool *out);
    int caosdb_entity_value_is_integer(caosdb_entity_value *value, bool *out);
    int caosdb_entity_value_is_bool(caosdb_entity_value *value, bool *out);
    int caosdb_entity_value_is_list(caosdb_entity_value *value, bool *out);
    int caosdb_entity_value_is_vector(caosdb_entity_value *value, bool *out);
    int caosdb_entity_value_get_as_string(caosdb_entity_value *value, char **out);
    int caosdb_entity_value_get_as_double(caosdb_entity_value *value, double *out);
    int caosdb_entity_value_get_as_integer(caosdb_entity_value *value, int64_t *out);
    int caosdb_entity_value_get_as_bool(caosdb_entity_value *value, bool *out);
    int caosdb_entity_value_get_as_vector_size(caosdb_entity_value *value, int *out);
    int caosdb_entity_value_get_as_vector_at(caosdb_entity_value *value, caosdb_entity_value *out,
    const int index);
    // CONSTRUCTORS AND DESTRUCTORS
    int caosdb_entity_create_entity(caosdb_entity_entity *out);
    ......@@ -441,14 +448,14 @@ int caosdb_entity_create_int_value(caosdb_entity_value *out, const int64_t value
    int caosdb_entity_create_string_value(caosdb_entity_value *out, const char *value);
    int caosdb_entity_create_double_value(caosdb_entity_value *out, const double value);
    int caosdb_entity_create_bool_value(caosdb_entity_value *out, const bool value);
    int caosdb_entity_create_int_list_value(caosdb_entity_value *out, const int64_t *value,
    const int length);
    int caosdb_entity_create_string_list_value(caosdb_entity_value *out, const char **value,
    int caosdb_entity_create_int_vector_value(caosdb_entity_value *out, const int64_t *value,
    const int length);
    int caosdb_entity_create_string_vector_value(caosdb_entity_value *out, const char **value,
    const int length);
    int caosdb_entity_create_double_vector_value(caosdb_entity_value *out, const double *value,
    const int length);
    int caosdb_entity_create_bool_vector_value(caosdb_entity_value *out, const bool *value,
    const int length);
    int caosdb_entity_create_double_list_value(caosdb_entity_value *out, const double *value,
    const int length);
    int caosdb_entity_create_bool_list_value(caosdb_entity_value *out, const bool *value,
    const int length);
    int caosdb_entity_delete_value(caosdb_entity_value *out);
    // SETTERS FOR EVERYTHING THAT MAY BE SET
    ......
    ......@@ -166,7 +166,7 @@ extern "C" {
    /**
    * Macro for list-value creators
    */
    #define CREATE_LIST_VALUE(fname, type, arg, assign) \
    #define CREATE_VECTOR_VALUE(fname, type, arg, assign) \
    ERROR_RETURN_CODE( \
    GENERIC_ERROR, \
    int caosdb_entity_create_##fname(caosdb_entity_value *out, arg, const int length), { \
    ......@@ -182,6 +182,28 @@ extern "C" {
    return 0; \
    })
    /**
    * Macro for value is-a functions
    */
    #define VALUE_IS(fname, isfunction) \
    ERROR_RETURN_CODE(GENERIC_ERROR, \
    int caosdb_entity_value_is_##fname(caosdb_entity_value *value, bool *out), { \
    auto *wrapped_value = WRAPPED_VALUE_CAST(value); \
    *out = wrapped_value->isfunction(); \
    return 0; \
    })
    /**
    * Macro for some value getters
    */
    #define VALUE_GET_AS(fname, getfunction, arg) \
    ERROR_RETURN_CODE(GENERIC_ERROR, \
    int caosdb_entity_value_get_as_##fname(caosdb_entity_value *value, arg), { \
    auto *wrapped_value = WRAPPED_VALUE_CAST(value); \
    *out = wrapped_value->getfunction(); \
    return 0; \
    })
    int caosdb_constants_LIBCAOSDB_VERSION_MAJOR() { return caosdb::LIBCAOSDB_VERSION_MAJOR; }
    int caosdb_constants_LIBCAOSDB_VERSION_MINOR() { return caosdb::LIBCAOSDB_VERSION_MINOR; }
    ......@@ -665,10 +687,10 @@ CREATE_VALUE(int_value, const int64_t value)
    CREATE_VALUE(string_value, const char *value)
    CREATE_VALUE(double_value, const double value)
    CREATE_VALUE(bool_value, const bool value)
    CREATE_LIST_VALUE(int_list_value, int64_t, const int64_t *value, value[i])
    CREATE_LIST_VALUE(string_list_value, std::string, const char **value, std::string(value[i]))
    CREATE_LIST_VALUE(double_list_value, double, const double *value, value[i])
    CREATE_LIST_VALUE(bool_list_value, bool, const bool *value, value[i])
    CREATE_VECTOR_VALUE(int_vector_value, int64_t, const int64_t *value, value[i])
    CREATE_VECTOR_VALUE(string_vector_value, std::string, const char **value, std::string(value[i]))
    CREATE_VECTOR_VALUE(double_vector_value, double, const double *value, value[i])
    CREATE_VECTOR_VALUE(bool_vector_value, bool, const bool *value, value[i])
    ERROR_RETURN_CODE(GENERIC_ERROR, int caosdb_entity_delete_value(caosdb_entity_value *out), {
    if (out->_deletable) {
    ......@@ -937,6 +959,40 @@ ERROR_RETURN_CODE(
    return 0;
    })
    VALUE_IS(null, IsNull)
    VALUE_IS(string, IsString)
    VALUE_IS(double, IsDouble)
    VALUE_IS(integer, IsInt64)
    VALUE_IS(bool, IsBool)
    VALUE_IS(vector, IsVector)
    ERROR_RETURN_CODE(GENERIC_ERROR,
    int caosdb_entity_value_get_as_string(caosdb_entity_value *value, char **out), {
    auto *wrapped_value = WRAPPED_VALUE_CAST(value);
    auto *tmp =
    (char *)malloc(sizeof(char) * wrapped_value->GetAsString().length() + 1);
    strcpy(tmp, wrapped_value->GetAsString().c_str());
    delete[] * out;
    *out = tmp;
    return 0;
    })
    VALUE_GET_AS(double, GetAsDouble, double *out)
    VALUE_GET_AS(integer, GetAsInt64, int64_t *out)
    VALUE_GET_AS(bool, GetAsBool, bool *out)
    VALUE_GET_AS(vector_size, GetAsVector().size, int *out)
    ERROR_RETURN_CODE(GENERIC_ERROR,
    int caosdb_entity_value_get_as_vector_at(caosdb_entity_value *value,
    caosdb_entity_value *out,
    const int index),
    {
    if (out->_deletable) {
    return caosdb::StatusCode::EXTERN_C_ASSIGNMENT_ERROR;
    }
    auto *wrapped_value = WRAPPED_VALUE_CAST(value);
    out->wrapped_value = (void *)(&(wrapped_value->GetAsVector().at(index)));
    out->_deletable = false;
    return 0;
    })
    ERROR_RETURN_CODE(GENERIC_ERROR,
    int caosdb_entity_entity_set_role(caosdb_entity_entity *entity, const char *role),
    {
    ......
    ......@@ -145,27 +145,117 @@ TEST_F(test_ccaosdb, test_value) {
    return_code = caosdb_entity_create_double_value(&double_value, 2.7);
    EXPECT_EQ(return_code, 0);
    caosdb_entity_value string_list_value;
    caosdb_entity_value string_vector_value;
    const char *string_values[] = {"a", "b", "c"}; // NOLINT
    return_code = caosdb_entity_create_string_list_value(&string_list_value, string_values, 3);
    return_code = caosdb_entity_create_string_vector_value(&string_vector_value, string_values, 3);
    EXPECT_EQ(return_code, 0);
    caosdb_entity_value int_list_value;
    caosdb_entity_value int_vector_value;
    const int64_t int_values[] = {1, 2, 3}; // NOLINT
    return_code = caosdb_entity_create_int_list_value(&int_list_value, int_values, 3);
    return_code = caosdb_entity_create_int_vector_value(&int_vector_value, int_values, 3);
    EXPECT_EQ(return_code, 0);
    caosdb_entity_value double_list_value;
    caosdb_entity_value double_vector_value;
    const double double_values[] = {1.1, 2.2, 3.3}; // NOLINT
    return_code = caosdb_entity_create_double_list_value(&double_list_value, double_values, 3);
    return_code = caosdb_entity_create_double_vector_value(&double_vector_value, double_values, 3);
    EXPECT_EQ(return_code, 0);
    caosdb_entity_value bool_list_value;
    caosdb_entity_value bool_vector_value;
    const bool bool_values[] = {true, false, false}; // NOLINT
    return_code = caosdb_entity_create_bool_list_value(&bool_list_value, bool_values, 3);
    return_code = caosdb_entity_create_bool_vector_value(&bool_vector_value, bool_values, 3);
    EXPECT_EQ(return_code, 0);
    // TODO(fspreck) Test is... and as... functions
    // One thorough check, afterwards only the ones that should be true
    bool is_a(false);
    return_code = caosdb_entity_value_is_null(&string_value, &is_a);
    EXPECT_EQ(return_code, 0);
    EXPECT_FALSE(is_a);
    return_code = caosdb_entity_value_is_string(&string_value, &is_a);
    EXPECT_EQ(return_code, 0);
    EXPECT_TRUE(is_a);
    return_code = caosdb_entity_value_is_double(&string_value, &is_a);
    EXPECT_EQ(return_code, 0);
    EXPECT_FALSE(is_a);
    return_code = caosdb_entity_value_is_integer(&string_value, &is_a);
    EXPECT_EQ(return_code, 0);
    EXPECT_FALSE(is_a);
    return_code = caosdb_entity_value_is_bool(&string_value, &is_a);
    EXPECT_EQ(return_code, 0);
    EXPECT_FALSE(is_a);
    return_code = caosdb_entity_value_is_vector(&string_value, &is_a);
    EXPECT_EQ(return_code, 0);
    EXPECT_FALSE(is_a);
    caosdb_entity_value_is_integer(&int_value, &is_a);
    EXPECT_TRUE(is_a);
    caosdb_entity_value_is_bool(&bool_value, &is_a);
    EXPECT_TRUE(is_a);
    caosdb_entity_value_is_double(&double_value, &is_a);
    EXPECT_TRUE(is_a);
    caosdb_entity_value_is_vector(&string_vector_value, &is_a);
    EXPECT_TRUE(is_a);
    caosdb_entity_value_is_vector(&int_vector_value, &is_a);
    EXPECT_TRUE(is_a);
    caosdb_entity_value_is_vector(&double_vector_value, &is_a);
    EXPECT_TRUE(is_a);
    caosdb_entity_value_is_vector(&bool_vector_value, &is_a);
    EXPECT_TRUE(is_a);
    // TODO(fspreck) Test as... functions
    char *out_string = nullptr; // NOLINT
    return_code = caosdb_entity_value_get_as_string(&string_value, &out_string);
    EXPECT_EQ(return_code, 0);
    EXPECT_STREQ(out_string, "value");
    int64_t out_int(0);
    return_code = caosdb_entity_value_get_as_integer(&int_value, &out_int);
    EXPECT_EQ(return_code, 0);
    EXPECT_EQ(out_int, 27);
    bool out_bool(false);
    return_code = caosdb_entity_value_get_as_bool(&bool_value, &out_bool);
    EXPECT_EQ(return_code, 0);
    EXPECT_TRUE(out_bool);
    double out_double(0);
    return_code = caosdb_entity_value_get_as_double(&double_value, &out_double);
    EXPECT_EQ(return_code, 0);
    EXPECT_EQ(out_double, 2.7);
    int list_length(0);
    return_code = caosdb_entity_value_get_as_vector_size(&string_vector_value, &list_length);
    EXPECT_EQ(return_code, 0);
    EXPECT_EQ(list_length, 3);
    return_code = caosdb_entity_value_get_as_vector_size(&int_vector_value, &list_length);
    EXPECT_EQ(return_code, 0);
    EXPECT_EQ(list_length, 3);
    return_code = caosdb_entity_value_get_as_vector_size(&double_vector_value, &list_length);
    EXPECT_EQ(return_code, 0);
    EXPECT_EQ(list_length, 3);
    return_code = caosdb_entity_value_get_as_vector_size(&bool_vector_value, &list_length);
    EXPECT_EQ(return_code, 0);
    EXPECT_EQ(list_length, 3);
    // Only check for one, rest should be covered by this + scalar values
    caosdb_entity_value out_val;
    return_code = caosdb_entity_value_get_as_vector_at(&string_vector_value, &out_val, 0);
    EXPECT_EQ(return_code, 0);
    caosdb_entity_value_get_as_string(&out_val, &out_string);
    EXPECT_STREQ(out_string, "a");
    return_code = caosdb_entity_value_get_as_vector_at(&string_vector_value, &out_val, 1);
    EXPECT_EQ(return_code, 0);
    caosdb_entity_value_get_as_string(&out_val, &out_string);
    EXPECT_STREQ(out_string, "b");
    return_code = caosdb_entity_value_get_as_vector_at(&string_vector_value, &out_val, 2);
    EXPECT_EQ(return_code, 0);
    caosdb_entity_value_get_as_string(&out_val, &out_string);
    EXPECT_STREQ(out_string, "c");
    return_code = caosdb_entity_delete_value(&string_value);
    EXPECT_EQ(return_code, 0);
    ......@@ -175,13 +265,13 @@ TEST_F(test_ccaosdb, test_value) {
    EXPECT_EQ(return_code, 0);
    return_code = caosdb_entity_delete_value(&double_value);
    EXPECT_EQ(return_code, 0);
    return_code = caosdb_entity_delete_value(&string_list_value);
    return_code = caosdb_entity_delete_value(&string_vector_value);
    EXPECT_EQ(return_code, 0);
    return_code = caosdb_entity_delete_value(&int_list_value);
    return_code = caosdb_entity_delete_value(&int_vector_value);
    EXPECT_EQ(return_code, 0);
    return_code = caosdb_entity_delete_value(&double_list_value);
    return_code = caosdb_entity_delete_value(&double_vector_value);
    EXPECT_EQ(return_code, 0);
    return_code = caosdb_entity_delete_value(&bool_list_value);
    return_code = caosdb_entity_delete_value(&bool_vector_value);
    EXPECT_EQ(return_code, 0);
    }
    ......
    0% Loading or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Finish editing this message first!
    Please register or to comment