Skip to content
TO_TYPE_SPECIFIC_IO

TO_TYPE_SPECIFIC_IO

Description

Build a TypeSpecificIO value for type T over data pointer d. Token-pastes _write_T and _read_T to pick the right callback pair from the per-type writer/reader symbols.

Parameters

Name Direction Description
T in Type identifier (must match _write_T / _read_T symbols).
d in Pointer to the value being read/written.

Success

Returns an initialised TypeSpecificIO.

Failure

Compile-time error if _write_T / _read_T are undeclared for the given T.

Usage example (Cross-references)

Usage examples (Cross-references)
    #ifdef __cplusplus
    #    define ZstrIO(zstr, alloc_ptr)                                                                                    \
            TO_TYPE_SPECIFIC_IO(ZstrAlloc, &LVAL(((ZstrIOArg) {.value = (void *)&(zstr), .allocator = (alloc_ptr)})))
    #else
    #    define ZstrIO(zstr, alloc_ptr)                                                                                    \
    #    define IOFMT_BITVEC_CASE_(x, addr)                                                                                \
    BitVec:                                                                                                                \
            TO_TYPE_SPECIFIC_IO(BitVec, addr),
    #else
    #    define IOFMT_BITVEC_CASE_(x, addr)
    #    define IOFMT_INT_CASE_(x, addr)                                                                                   \
    Int:                                                                                                                   \
            TO_TYPE_SPECIFIC_IO(Int, addr),
    #else
    #    define IOFMT_INT_CASE_(x, addr)
    #    define IOFMT_FLOAT_CASE_(x, addr)                                                                                 \
    Float:                                                                                                                 \
            TO_TYPE_SPECIFIC_IO(Float, addr),
    #else
    #    define IOFMT_FLOAT_CASE_(x, addr)
                (x),                                                                                                       \
                TypeSpecificIO: (x),                                                                                       \
                Str: TO_TYPE_SPECIFIC_IO(Str, &(x)),                                                                       \
                IOFMT_FLOAT_CASE_(x, &(x)) IOFMT_INT_CASE_(x, &(x)) IOFMT_BITVEC_CASE_(x, &(x))                            \
                    Zstr: TO_TYPE_SPECIFIC_IO(Zstr, &(x)),                                                                 \
                Str: TO_TYPE_SPECIFIC_IO(Str, &(x)),                                                                       \
                IOFMT_FLOAT_CASE_(x, &(x)) IOFMT_INT_CASE_(x, &(x)) IOFMT_BITVEC_CASE_(x, &(x))                            \
                    Zstr: TO_TYPE_SPECIFIC_IO(Zstr, &(x)),                                                                 \
                char *: TO_TYPE_SPECIFIC_IO(Zstr, &(x)),                                                                   \
                unsigned char: TO_TYPE_SPECIFIC_IO(u8, &(x)),                                                              \
                IOFMT_FLOAT_CASE_(x, &(x)) IOFMT_INT_CASE_(x, &(x)) IOFMT_BITVEC_CASE_(x, &(x))                            \
                    Zstr: TO_TYPE_SPECIFIC_IO(Zstr, &(x)),                                                                 \
                char *: TO_TYPE_SPECIFIC_IO(Zstr, &(x)),                                                                   \
                unsigned char: TO_TYPE_SPECIFIC_IO(u8, &(x)),                                                              \
                unsigned short: TO_TYPE_SPECIFIC_IO(u16, &(x)),                                                            \
                    Zstr: TO_TYPE_SPECIFIC_IO(Zstr, &(x)),                                                                 \
                char *: TO_TYPE_SPECIFIC_IO(Zstr, &(x)),                                                                   \
                unsigned char: TO_TYPE_SPECIFIC_IO(u8, &(x)),                                                              \
                unsigned short: TO_TYPE_SPECIFIC_IO(u16, &(x)),                                                            \
                unsigned int: TO_TYPE_SPECIFIC_IO(u32, &(x)),                                                              \
                char *: TO_TYPE_SPECIFIC_IO(Zstr, &(x)),                                                                   \
                unsigned char: TO_TYPE_SPECIFIC_IO(u8, &(x)),                                                              \
                unsigned short: TO_TYPE_SPECIFIC_IO(u16, &(x)),                                                            \
                unsigned int: TO_TYPE_SPECIFIC_IO(u32, &(x)),                                                              \
                unsigned long: sizeof(unsigned long) == 4 ? TO_TYPE_SPECIFIC_IO(u32, &(x)) :                               \
                unsigned char: TO_TYPE_SPECIFIC_IO(u8, &(x)),                                                              \
                unsigned short: TO_TYPE_SPECIFIC_IO(u16, &(x)),                                                            \
                unsigned int: TO_TYPE_SPECIFIC_IO(u32, &(x)),                                                              \
                unsigned long: sizeof(unsigned long) == 4 ? TO_TYPE_SPECIFIC_IO(u32, &(x)) :                               \
                                                            TO_TYPE_SPECIFIC_IO(u64, &(x)),                                \
                unsigned short: TO_TYPE_SPECIFIC_IO(u16, &(x)),                                                            \
                unsigned int: TO_TYPE_SPECIFIC_IO(u32, &(x)),                                                              \
                unsigned long: sizeof(unsigned long) == 4 ? TO_TYPE_SPECIFIC_IO(u32, &(x)) :                               \
                                                            TO_TYPE_SPECIFIC_IO(u64, &(x)),                                \
                unsigned long long: TO_TYPE_SPECIFIC_IO(u64, &(x)),                                                        \
                unsigned int: TO_TYPE_SPECIFIC_IO(u32, &(x)),                                                              \
                unsigned long: sizeof(unsigned long) == 4 ? TO_TYPE_SPECIFIC_IO(u32, &(x)) :                               \
                                                            TO_TYPE_SPECIFIC_IO(u64, &(x)),                                \
                unsigned long long: TO_TYPE_SPECIFIC_IO(u64, &(x)),                                                        \
                signed char: TO_TYPE_SPECIFIC_IO(i8, &(x)),                                                                \
                unsigned long: sizeof(unsigned long) == 4 ? TO_TYPE_SPECIFIC_IO(u32, &(x)) :                               \
                                                            TO_TYPE_SPECIFIC_IO(u64, &(x)),                                \
                unsigned long long: TO_TYPE_SPECIFIC_IO(u64, &(x)),                                                        \
                signed char: TO_TYPE_SPECIFIC_IO(i8, &(x)),                                                                \
                signed short: TO_TYPE_SPECIFIC_IO(i16, &(x)),                                                              \
                                                            TO_TYPE_SPECIFIC_IO(u64, &(x)),                                \
                unsigned long long: TO_TYPE_SPECIFIC_IO(u64, &(x)),                                                        \
                signed char: TO_TYPE_SPECIFIC_IO(i8, &(x)),                                                                \
                signed short: TO_TYPE_SPECIFIC_IO(i16, &(x)),                                                              \
                signed int: TO_TYPE_SPECIFIC_IO(i32, &(x)),                                                                \
                unsigned long long: TO_TYPE_SPECIFIC_IO(u64, &(x)),                                                        \
                signed char: TO_TYPE_SPECIFIC_IO(i8, &(x)),                                                                \
                signed short: TO_TYPE_SPECIFIC_IO(i16, &(x)),                                                              \
                signed int: TO_TYPE_SPECIFIC_IO(i32, &(x)),                                                                \
                signed long: sizeof(signed long) == 4 ? TO_TYPE_SPECIFIC_IO(i32, &(x)) : TO_TYPE_SPECIFIC_IO(i64, &(x)),   \
                signed char: TO_TYPE_SPECIFIC_IO(i8, &(x)),                                                                \
                signed short: TO_TYPE_SPECIFIC_IO(i16, &(x)),                                                              \
                signed int: TO_TYPE_SPECIFIC_IO(i32, &(x)),                                                                \
                signed long: sizeof(signed long) == 4 ? TO_TYPE_SPECIFIC_IO(i32, &(x)) : TO_TYPE_SPECIFIC_IO(i64, &(x)),   \
                signed long long: TO_TYPE_SPECIFIC_IO(i64, &(x)),                                                          \
                signed short: TO_TYPE_SPECIFIC_IO(i16, &(x)),                                                              \
                signed int: TO_TYPE_SPECIFIC_IO(i32, &(x)),                                                                \
                signed long: sizeof(signed long) == 4 ? TO_TYPE_SPECIFIC_IO(i32, &(x)) : TO_TYPE_SPECIFIC_IO(i64, &(x)),   \
                signed long long: TO_TYPE_SPECIFIC_IO(i64, &(x)),                                                          \
                f32: TO_TYPE_SPECIFIC_IO(f32, &(x)),                                                                       \
                signed int: TO_TYPE_SPECIFIC_IO(i32, &(x)),                                                                \
                signed long: sizeof(signed long) == 4 ? TO_TYPE_SPECIFIC_IO(i32, &(x)) : TO_TYPE_SPECIFIC_IO(i64, &(x)),   \
                signed long long: TO_TYPE_SPECIFIC_IO(i64, &(x)),                                                          \
                f32: TO_TYPE_SPECIFIC_IO(f32, &(x)),                                                                       \
                f64: TO_TYPE_SPECIFIC_IO(f64, &(x)),                                                                       \
                signed long: sizeof(signed long) == 4 ? TO_TYPE_SPECIFIC_IO(i32, &(x)) : TO_TYPE_SPECIFIC_IO(i64, &(x)),   \
                signed long long: TO_TYPE_SPECIFIC_IO(i64, &(x)),                                                          \
                f32: TO_TYPE_SPECIFIC_IO(f32, &(x)),                                                                       \
                f64: TO_TYPE_SPECIFIC_IO(f64, &(x)),                                                                       \
                char: TO_TYPE_SPECIFIC_IO(i8, &(x))                                                                        \
                signed long long: TO_TYPE_SPECIFIC_IO(i64, &(x)),                                                          \
                f32: TO_TYPE_SPECIFIC_IO(f32, &(x)),                                                                       \
                f64: TO_TYPE_SPECIFIC_IO(f64, &(x)),                                                                       \
                char: TO_TYPE_SPECIFIC_IO(i8, &(x))                                                                        \
            )
                f32: TO_TYPE_SPECIFIC_IO(f32, &(x)),                                                                       \
                f64: TO_TYPE_SPECIFIC_IO(f64, &(x)),                                                                       \
                char: TO_TYPE_SPECIFIC_IO(i8, &(x))                                                                        \
            )
    #else
                (x),                                                                                                       \
                TypeSpecificIO: (x),                                                                                       \
                Str: TO_TYPE_SPECIFIC_IO(Str, (void *)&(x)),                                                               \
                IOFMT_FLOAT_CASE_(x, (void *)&(x)) IOFMT_INT_CASE_(x, (void *)&(x)) IOFMT_BITVEC_CASE_(x, (void *)&(x))    \
                    Zstr: TO_TYPE_SPECIFIC_IO(Zstr, (void *)&(x)),                                                         \
                Str: TO_TYPE_SPECIFIC_IO(Str, (void *)&(x)),                                                               \
                IOFMT_FLOAT_CASE_(x, (void *)&(x)) IOFMT_INT_CASE_(x, (void *)&(x)) IOFMT_BITVEC_CASE_(x, (void *)&(x))    \
                    Zstr: TO_TYPE_SPECIFIC_IO(Zstr, (void *)&(x)),                                                         \
                char *: TO_TYPE_SPECIFIC_IO(Zstr, (void *)&(x)),                                                           \
                unsigned char: TO_TYPE_SPECIFIC_IO(u8, (void *)&(x)),                                                      \
                IOFMT_FLOAT_CASE_(x, (void *)&(x)) IOFMT_INT_CASE_(x, (void *)&(x)) IOFMT_BITVEC_CASE_(x, (void *)&(x))    \
                    Zstr: TO_TYPE_SPECIFIC_IO(Zstr, (void *)&(x)),                                                         \
                char *: TO_TYPE_SPECIFIC_IO(Zstr, (void *)&(x)),                                                           \
                unsigned char: TO_TYPE_SPECIFIC_IO(u8, (void *)&(x)),                                                      \
                unsigned short: TO_TYPE_SPECIFIC_IO(u16, (void *)&(x)),                                                    \
                    Zstr: TO_TYPE_SPECIFIC_IO(Zstr, (void *)&(x)),                                                         \
                char *: TO_TYPE_SPECIFIC_IO(Zstr, (void *)&(x)),                                                           \
                unsigned char: TO_TYPE_SPECIFIC_IO(u8, (void *)&(x)),                                                      \
                unsigned short: TO_TYPE_SPECIFIC_IO(u16, (void *)&(x)),                                                    \
                unsigned int: TO_TYPE_SPECIFIC_IO(u32, (void *)&(x)),                                                      \
                char *: TO_TYPE_SPECIFIC_IO(Zstr, (void *)&(x)),                                                           \
                unsigned char: TO_TYPE_SPECIFIC_IO(u8, (void *)&(x)),                                                      \
                unsigned short: TO_TYPE_SPECIFIC_IO(u16, (void *)&(x)),                                                    \
                unsigned int: TO_TYPE_SPECIFIC_IO(u32, (void *)&(x)),                                                      \
                unsigned long: sizeof(unsigned long) == 4 ? TO_TYPE_SPECIFIC_IO(u32, (void *)&(x)) :                       \
                unsigned char: TO_TYPE_SPECIFIC_IO(u8, (void *)&(x)),                                                      \
                unsigned short: TO_TYPE_SPECIFIC_IO(u16, (void *)&(x)),                                                    \
                unsigned int: TO_TYPE_SPECIFIC_IO(u32, (void *)&(x)),                                                      \
                unsigned long: sizeof(unsigned long) == 4 ? TO_TYPE_SPECIFIC_IO(u32, (void *)&(x)) :                       \
                                                            TO_TYPE_SPECIFIC_IO(u64, (void *)&(x)),                        \
                unsigned short: TO_TYPE_SPECIFIC_IO(u16, (void *)&(x)),                                                    \
                unsigned int: TO_TYPE_SPECIFIC_IO(u32, (void *)&(x)),                                                      \
                unsigned long: sizeof(unsigned long) == 4 ? TO_TYPE_SPECIFIC_IO(u32, (void *)&(x)) :                       \
                                                            TO_TYPE_SPECIFIC_IO(u64, (void *)&(x)),                        \
                unsigned long long: TO_TYPE_SPECIFIC_IO(u64, (void *)&(x)),                                                \
                unsigned int: TO_TYPE_SPECIFIC_IO(u32, (void *)&(x)),                                                      \
                unsigned long: sizeof(unsigned long) == 4 ? TO_TYPE_SPECIFIC_IO(u32, (void *)&(x)) :                       \
                                                            TO_TYPE_SPECIFIC_IO(u64, (void *)&(x)),                        \
                unsigned long long: TO_TYPE_SPECIFIC_IO(u64, (void *)&(x)),                                                \
                signed char: TO_TYPE_SPECIFIC_IO(i8, (void *)&(x)),                                                        \
                unsigned long: sizeof(unsigned long) == 4 ? TO_TYPE_SPECIFIC_IO(u32, (void *)&(x)) :                       \
                                                            TO_TYPE_SPECIFIC_IO(u64, (void *)&(x)),                        \
                unsigned long long: TO_TYPE_SPECIFIC_IO(u64, (void *)&(x)),                                                \
                signed char: TO_TYPE_SPECIFIC_IO(i8, (void *)&(x)),                                                        \
                signed short: TO_TYPE_SPECIFIC_IO(i16, (void *)&(x)),                                                      \
                                                            TO_TYPE_SPECIFIC_IO(u64, (void *)&(x)),                        \
                unsigned long long: TO_TYPE_SPECIFIC_IO(u64, (void *)&(x)),                                                \
                signed char: TO_TYPE_SPECIFIC_IO(i8, (void *)&(x)),                                                        \
                signed short: TO_TYPE_SPECIFIC_IO(i16, (void *)&(x)),                                                      \
                signed int: TO_TYPE_SPECIFIC_IO(i32, (void *)&(x)),                                                        \
                unsigned long long: TO_TYPE_SPECIFIC_IO(u64, (void *)&(x)),                                                \
                signed char: TO_TYPE_SPECIFIC_IO(i8, (void *)&(x)),                                                        \
                signed short: TO_TYPE_SPECIFIC_IO(i16, (void *)&(x)),                                                      \
                signed int: TO_TYPE_SPECIFIC_IO(i32, (void *)&(x)),                                                        \
                signed long: sizeof(signed long) == 4 ? TO_TYPE_SPECIFIC_IO(i32, (void *)&(x)) :                           \
                signed char: TO_TYPE_SPECIFIC_IO(i8, (void *)&(x)),                                                        \
                signed short: TO_TYPE_SPECIFIC_IO(i16, (void *)&(x)),                                                      \
                signed int: TO_TYPE_SPECIFIC_IO(i32, (void *)&(x)),                                                        \
                signed long: sizeof(signed long) == 4 ? TO_TYPE_SPECIFIC_IO(i32, (void *)&(x)) :                           \
                                                        TO_TYPE_SPECIFIC_IO(i64, (void *)&(x)),                            \
                signed short: TO_TYPE_SPECIFIC_IO(i16, (void *)&(x)),                                                      \
                signed int: TO_TYPE_SPECIFIC_IO(i32, (void *)&(x)),                                                        \
                signed long: sizeof(signed long) == 4 ? TO_TYPE_SPECIFIC_IO(i32, (void *)&(x)) :                           \
                                                        TO_TYPE_SPECIFIC_IO(i64, (void *)&(x)),                            \
                signed long long: TO_TYPE_SPECIFIC_IO(i64, (void *)&(x)),                                                  \
                signed int: TO_TYPE_SPECIFIC_IO(i32, (void *)&(x)),                                                        \
                signed long: sizeof(signed long) == 4 ? TO_TYPE_SPECIFIC_IO(i32, (void *)&(x)) :                           \
                                                        TO_TYPE_SPECIFIC_IO(i64, (void *)&(x)),                            \
                signed long long: TO_TYPE_SPECIFIC_IO(i64, (void *)&(x)),                                                  \
                f32: TO_TYPE_SPECIFIC_IO(f32, (void *)&(x)),                                                               \
                signed long: sizeof(signed long) == 4 ? TO_TYPE_SPECIFIC_IO(i32, (void *)&(x)) :                           \
                                                        TO_TYPE_SPECIFIC_IO(i64, (void *)&(x)),                            \
                signed long long: TO_TYPE_SPECIFIC_IO(i64, (void *)&(x)),                                                  \
                f32: TO_TYPE_SPECIFIC_IO(f32, (void *)&(x)),                                                               \
                f64: TO_TYPE_SPECIFIC_IO(f64, (void *)&(x)),                                                               \
                                                        TO_TYPE_SPECIFIC_IO(i64, (void *)&(x)),                            \
                signed long long: TO_TYPE_SPECIFIC_IO(i64, (void *)&(x)),                                                  \
                f32: TO_TYPE_SPECIFIC_IO(f32, (void *)&(x)),                                                               \
                f64: TO_TYPE_SPECIFIC_IO(f64, (void *)&(x)),                                                               \
                char: TO_TYPE_SPECIFIC_IO(i8, (void *)&(x))                                                                \
                signed long long: TO_TYPE_SPECIFIC_IO(i64, (void *)&(x)),                                                  \
                f32: TO_TYPE_SPECIFIC_IO(f32, (void *)&(x)),                                                               \
                f64: TO_TYPE_SPECIFIC_IO(f64, (void *)&(x)),                                                               \
                char: TO_TYPE_SPECIFIC_IO(i8, (void *)&(x))                                                                \
            )
                f32: TO_TYPE_SPECIFIC_IO(f32, (void *)&(x)),                                                               \
                f64: TO_TYPE_SPECIFIC_IO(f64, (void *)&(x)),                                                               \
                char: TO_TYPE_SPECIFIC_IO(i8, (void *)&(x))                                                                \
            )
    #endif
Last updated on