/// Utilities to work with C bindings (e.g. OpenGL, SDL)
module sily.clang;

import std.traits: isNumeric, isArray;

import sily.array: deepLength, ArrayBaseType;

import core.stdc.config: c_long, c_ulong;
import core.stdc.stdint: intptr_t, uintptr_t;

/// C types (in form of cDTYPE, i.e clang size_t -> csize_t)
alias csize_t = uint;

// version (X86_64) {
// } else {
// }

/// Returns C style size
csize_t csizeof(T)(T var) if (isNumeric!T) {
    return cast(csize_t) (var * T.sizeof);
}

/// Ditto
csize_t csizeof(T)(T var) if (isArray!T) {
    return cast(csize_t) (deepLength(var) * (ArrayBaseType!T).sizeof);
}