#include <stdlib.h>
#include <stdio.h>

void c_writeComplex64(double* ptr, double real, double imag, size_t offset) {
    *(double *)((void *)ptr + 16 * offset) = real;
    *(double *)((void *)ptr + 16 * offset + 8) = imag;
}

double c_getComplex64Real(double* ptr, size_t offset) {
    return *(double *)((void *)ptr + 16 * offset);
}

double c_getComplex64Imag(double* ptr, size_t offset) {
    return *(double *)((void *)ptr + 16 * offset + 8);
}

void c_writeComplex32(float* ptr, float real, float imag, size_t offset) {
    *(float *)((void *)ptr + 8 * offset) = real;
    *(float *)((void *)ptr + 8 * offset + 4) = imag;
}

float c_getComplex32Real(float* ptr, size_t offset) {
    return *(float *)((void *)ptr + 8 * offset);
}

float c_getComplex32Imag(float* ptr, size_t offset) {
    return *(float *)((void *)ptr + 8 * offset + 4);
}

float c_readFloat32(float* ptr, size_t offset) {
    return *(float *)((void *)ptr + 4 * offset);
}

double c_readFloat64(double* ptr, size_t offset) {
    return *(double *)((void *)ptr + 8 * offset);
}

unsigned char c_readUInt8(unsigned char* ptr, size_t offset) {
    return *(unsigned char *)((void *)ptr + offset);
}

unsigned short c_readUInt16(unsigned short* ptr, size_t offset) {
    return *(unsigned short *)((void *)ptr + 2 * offset);
}

unsigned int c_readUInt32(unsigned int* ptr, size_t offset) {
    return *(unsigned int *)((void *)ptr + 4 * offset);
}

unsigned long c_readUInt64(unsigned long* ptr, size_t offset) {
    return *(unsigned long *)((void *)ptr + 8 * offset);
}

signed char c_readInt8(signed char* ptr, size_t offset) {
    return *(signed char *)((void *)ptr + offset);
}

signed short c_readInt16(signed short* ptr, size_t offset) {
    return *(signed short *)((void *)ptr + 2 * offset);
}

signed int c_readInt32(signed int* ptr, size_t offset) {
    return *(signed int *)((void *)ptr + 4 * offset);
}

signed long c_readInt64(signed long* ptr, size_t offset) {
    return *(signed long *)((void *)ptr + 8 * offset);
}

void c_writeFloat32(float* ptr, float val, size_t offset) {
    *(float *)((void *)ptr + 4 * offset) = val;
}

void c_writeFloat64(double* ptr, double val, size_t offset) {
    *(double *)((void *)ptr + 8 * offset) = val;
}

void c_writeUInt8(unsigned char* ptr, unsigned char val, size_t offset) {
    *(unsigned char *)((void *)ptr + offset) = val;
}

void c_writeUInt16(unsigned short* ptr, unsigned short val, size_t offset) {
    *(unsigned short *)((void *)ptr + 2 * offset) = val;
}

void c_writeUInt32(unsigned int* ptr, unsigned int val, size_t offset) {
    *(unsigned int *)((void *)ptr + 4 * offset) = val;
}

void c_writeUInt64(unsigned long* ptr, unsigned long val, size_t offset) {
    *(unsigned long *)((void *)ptr + 8 * offset) = val;
}

void c_writeInt8(signed char* ptr, signed char val, size_t offset) {
    *(signed char *)((void *)ptr + offset) = val;
}

void c_writeInt16(signed short* ptr, signed short val, size_t offset) {
    *(signed short *)((void *)ptr + 2 * offset) = val;
}

void c_writeInt32(signed int* ptr, signed int val, size_t offset) {
    *(signed int *)((void *)ptr + 4 * offset) = val;
}

void c_writeInt64(signed long* ptr, signed long val, size_t offset) {
    *(signed long *)((void *)ptr + 8 * offset) = val;
}