#define MVM_P6INT_C_TYPE_CHAR      -1
#define MVM_P6INT_C_TYPE_SHORT     -2
#define MVM_P6INT_C_TYPE_INT       -3
#define MVM_P6INT_C_TYPE_LONG      -4
#define MVM_P6INT_C_TYPE_LONGLONG  -5
#define MVM_P6INT_C_TYPE_SIZE_T    -6
#define MVM_P6INT_C_TYPE_BOOL      -7
#define MVM_P6INT_C_TYPE_ATOMIC    -8

/* Representation used by P6 native ints. */
struct MVMP6intBody {
    /* Integer storage slot. */
    union {
        MVMint64  i64;
        MVMint32  i32;
        MVMint16  i16;
        MVMint8   i8;
        MVMuint64 u64;
        MVMuint32 u32;
        MVMuint16 u16;
        MVMuint8  u8;
    } value;
};
struct MVMP6int {
    MVMObject common;
    MVMP6intBody body;
};

/* The bit width requirement is shared for all instances of the same type. */
struct MVMP6intREPRData {
    MVMint16       bits;
    MVMint16       is_unsigned;
    MVMStorageSpec storage_spec;
};

/* Function for REPR setup. */
const MVMREPROps * MVMP6int_initialize(MVMThreadContext *tc);

void MVMP6int_set_int(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 value);
MVMint64 MVMP6int_get_int(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data);
MVMint16 MVMP6int_is_unsigned(MVMSTable *st);
