C++程序  |  118行  |  3.42 KB

#include "rs_core.rsh"
#include "rs_structs.h"

/**
* Element
*/
extern uint32_t __attribute__((overloadable))
        rsElementGetSubElementCount(rs_element e) {
    Element_t *element = (Element_t *)e.p;
    if (element == NULL) {
        return 0;
    }
    return element->mHal.state.fieldsCount;
}

extern rs_element __attribute__((overloadable))
        rsElementGetSubElement(rs_element e, uint32_t index) {
    Element_t *element = (Element_t *)e.p;
    if (element == NULL || index >= element->mHal.state.fieldsCount) {
        rs_element nullElem = RS_NULL_OBJ;
        return nullElem;
    }
    rs_element returnElem = {
        element->mHal.state.fields[index]
#ifdef __LP64__
        , 0, 0, 0
#endif
    };
    rs_element rs_retval = RS_NULL_OBJ;
    rsSetObject(&rs_retval, returnElem);
    return rs_retval;
}

extern uint32_t __attribute__((overloadable))
        rsElementGetSubElementNameLength(rs_element e, uint32_t index) {
    Element_t *element = (Element_t *)e.p;
    if (element == NULL || index >= element->mHal.state.fieldsCount) {
        return 0;
    }
    return element->mHal.state.fieldNameLengths[index];
}

extern uint32_t __attribute__((overloadable))
        rsElementGetSubElementName(rs_element e, uint32_t index, char *name, uint32_t nameLength) {
    Element_t *element = (Element_t *)e.p;
    if (element == NULL || index >= element->mHal.state.fieldsCount ||
        nameLength == 0 || name == 0) {
        return 0;
    }

    uint32_t numToCopy = element->mHal.state.fieldNameLengths[index];
    if (nameLength < numToCopy) {
        numToCopy = nameLength;
    }
    // Place the null terminator manually, in case of partial string
    numToCopy --;
    name[numToCopy] = '\0';
    const char *nameSource = element->mHal.state.fieldNames[index];
    for (uint32_t i = 0; i < numToCopy; i ++) {
        name[i] = nameSource[i];
    }
    return numToCopy;
}

extern uint32_t __attribute__((overloadable))
        rsElementGetSubElementArraySize(rs_element e, uint32_t index) {
    Element_t *element = (Element_t *)e.p;
    if (element == NULL || index >= element->mHal.state.fieldsCount) {
        return 0;
    }
    return element->mHal.state.fieldArraySizes[index];
}

extern uint32_t __attribute__((overloadable))
        rsElementGetSubElementOffsetBytes(rs_element e, uint32_t index) {
    Element_t *element = (Element_t *)e.p;
    if (element == NULL || index >= element->mHal.state.fieldsCount) {
        return 0;
    }
    return element->mHal.state.fieldOffsetBytes[index];
}

extern uint32_t __attribute__((overloadable))
        rsElementGetBytesSize(rs_element e) {
    Element_t *element = (Element_t *)e.p;
    if (element == NULL) {
        return 0;
    }
    return element->mHal.state.elementSizeBytes;
}

extern rs_data_type __attribute__((overloadable))
        rsElementGetDataType(rs_element e) {
    Element_t *element = (Element_t *)e.p;
    if (element == NULL) {
        return RS_TYPE_INVALID;
    }
    return element->mHal.state.dataType;
}

extern rs_data_kind __attribute__((overloadable))
        rsElementGetDataKind(rs_element e) {
    Element_t *element = (Element_t *)e.p;
    if (element == NULL) {
        return RS_KIND_INVALID;
    }
    return element->mHal.state.dataKind;
}

extern uint32_t __attribute__((overloadable))
        rsElementGetVectorSize(rs_element e) {
    Element_t *element = (Element_t *)e.p;
    if (element == NULL) {
        return 0;
    }
    return element->mHal.state.vectorSize;
}