int qdpn_data_insert()

in src/proton_utils.c [155:300]


int qdpn_data_insert(pn_data_t *dest, pn_data_t *src)
{
    assert(dest && src);

    switch (pn_data_type(src)) {

        // simple scalar types

    case PN_NULL:
        pn_data_put_null(dest);
        break;
    case PN_BOOL:
        pn_data_put_bool(dest, pn_data_get_bool(src));
        break;
    case PN_UBYTE:
        pn_data_put_ubyte(dest, pn_data_get_ubyte(src));
        break;
    case PN_BYTE:
        pn_data_put_byte(dest, pn_data_get_byte(src));
        break;
    case PN_USHORT:
        pn_data_put_ushort(dest, pn_data_get_ushort(src));
        break;
    case PN_SHORT:
        pn_data_put_short(dest, pn_data_get_short(src));
        break;
    case PN_UINT:
        pn_data_put_uint(dest, pn_data_get_uint(src));
        break;
    case PN_INT:
        pn_data_put_int(dest, pn_data_get_int(src));
        break;
    case PN_CHAR:
        pn_data_put_char(dest, pn_data_get_char(src));
        break;
    case PN_ULONG:
        pn_data_put_ulong(dest, pn_data_get_ulong(src));
        break;
    case PN_LONG:
        pn_data_put_long(dest, pn_data_get_long(src));
        break;
    case PN_TIMESTAMP:
        pn_data_put_timestamp(dest, pn_data_get_timestamp(src));
        break;
    case PN_FLOAT:
        pn_data_put_float(dest, pn_data_get_float(src));
        break;
    case PN_DOUBLE:
        pn_data_put_double(dest, pn_data_get_double(src));
        break;
    case PN_DECIMAL32:
        pn_data_put_decimal32(dest, pn_data_get_decimal32(src));
        break;
    case PN_DECIMAL64:
        pn_data_put_decimal64(dest, pn_data_get_decimal64(src));
        break;
    case PN_DECIMAL128:
        pn_data_put_decimal128(dest, pn_data_get_decimal128(src));
        break;
    case PN_UUID:
        pn_data_put_uuid(dest, pn_data_get_uuid(src));
        break;
    case PN_BINARY:
        pn_data_put_binary(dest, pn_data_get_binary(src));
        break;
    case PN_STRING:
        pn_data_put_string(dest, pn_data_get_string(src));
        break;
    case PN_SYMBOL:
        pn_data_put_symbol(dest, pn_data_get_symbol(src));
        break;

        // complex types

    case PN_DESCRIBED:
        // two children: descriptor and value:
        pn_data_put_described(dest);
        pn_data_enter(dest);
        pn_data_enter(src);
        pn_data_next(src);
        qdpn_data_insert(dest, src);
        pn_data_next(src);
        qdpn_data_insert(dest, src);
        pn_data_exit(src);
        pn_data_exit(dest);
        break;

    case PN_ARRAY: {
        const size_t count = pn_data_get_array(src);
        const bool described = pn_data_is_array_described(src);
        const pn_type_t atype = pn_data_get_array_type(src);

        pn_data_put_array(dest, described, atype);
        pn_data_enter(dest);
        pn_data_enter(src);
        if (described) {
            pn_data_next(src);
            qdpn_data_insert(dest, src);
        }

        for (size_t i = 0; i < count; ++i) {
            pn_data_next(src);
            qdpn_data_insert(dest, src);
        }
        pn_data_exit(src);
        pn_data_exit(dest);
    } break;

    case PN_LIST: {
        const size_t count = pn_data_get_list(src);

        pn_data_put_list(dest);
        pn_data_enter(dest);
        pn_data_enter(src);
        for (size_t i = 0; i < count; ++i) {
            pn_data_next(src);
            qdpn_data_insert(dest, src);
        }
        pn_data_exit(src);
        pn_data_exit(dest);
    } break;

    case PN_MAP: {
        const size_t count = pn_data_get_map(src);

        pn_data_put_map(dest);
        pn_data_enter(dest);
        pn_data_enter(src);
        for (size_t i = 0; i < count / 2; ++i) {
            // key
            pn_data_next(src);
            qdpn_data_insert(dest, src);
            // value
            pn_data_next(src);
            qdpn_data_insert(dest, src);
        }
        pn_data_exit(src);
        pn_data_exit(dest);

    } break;

    default:
        break;
    }
    return 0;
}