Delete DqnInspect, it's too broken. Replace with new one
This commit is contained in:
parent
c36ea18a64
commit
96b7c05daf
867
Code/Dqn.h
867
Code/Dqn.h
File diff suppressed because it is too large
Load Diff
190
Code/DqnHeader.h
190
Code/DqnHeader.h
@ -1,8 +1,51 @@
|
||||
#ifndef DQN_HEADER_H
|
||||
#define DQN_HEADER_H
|
||||
|
||||
// NOTE: Copy the function prototype, all functions will be whitespaced aligned to the longest return type of the file
|
||||
// NOTE: If you function contains a comma NOT in the argument list (i.e. multiple template parameters), this macro does NOT work.
|
||||
// Please use the DQN_HEADER_COPY_BEGIN and DQN_HEADER_COPY_END unfortunately.
|
||||
#define DQN_HEADER_COPY_PROTOTYPE(func_return, func_name_and_types) func_return func_name_and_types
|
||||
|
||||
// NOTE: Copy all contents from the file between the begin and end macro
|
||||
#define DQN_HEADER_COPY_BEGIN
|
||||
#define DQN_HEADER_COPY_END
|
||||
|
||||
// NOTE: Copy comments by writing comments with the prefix, "// @"
|
||||
// @ Hello this comment will be copied to the output
|
||||
|
||||
// NOTE: Example Input
|
||||
#if 0
|
||||
#include "DqnHeader.h"
|
||||
|
||||
// @ ptr1: Pointer to the first block of memory
|
||||
// @ ptr2: Pointer to the second block of memory
|
||||
// @ num_bytes: The number of bytes to compare in both blocks of memory
|
||||
DQN_HEADER_COPY_PROTOTYPE(int, Dqn_MemCmp(void const *ptr1, void const *ptr2, size_t num_bytes))
|
||||
{
|
||||
int result = memcmp(ptr1, ptr2, num_bytes);
|
||||
return result;
|
||||
}
|
||||
|
||||
DQN_HEADER_COPY_BEGIN
|
||||
struct HelloWorld
|
||||
{
|
||||
int foo, bar;
|
||||
};
|
||||
DQN_HEADER_COPY_END
|
||||
#endif
|
||||
|
||||
// NOTE: Example Output
|
||||
#if 0
|
||||
// @ ptr1: Pointer to the first block of memory
|
||||
// @ ptr2: Pointer to the second block of memory
|
||||
// @ num_bytes: The number of bytes to compare in both blocks of memory
|
||||
int Dqn_MemCmp(void const *ptr1, void const *ptr2, size_t num_bytes);
|
||||
struct HelloWorld
|
||||
{
|
||||
int foo, bar;
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif /* DQN_HEADER_H */
|
||||
|
||||
#ifdef DQN_HEADER_IMPLEMENTATION
|
||||
@ -10,12 +53,13 @@
|
||||
#define _CRT_SECURE_NO_WARNINGS // NOTE: Undefined at end of file
|
||||
#include <stddef.h>
|
||||
|
||||
#define DQN_USE_PRIMITIVE_TYPEDEFS
|
||||
#define DQN_IMPLEMENTATION
|
||||
#include "Dqn.h"
|
||||
|
||||
char const *Dqn_Header__ParseFunctionReturnType(char const *ptr, isize *len)
|
||||
char const *ParseFunctionReturnType(char const *ptr, isize *len)
|
||||
{
|
||||
char const *result = Dqn_StrSkipWhitespace(ptr);
|
||||
char const *result = Dqn_Str_SkipWhitespace(ptr);
|
||||
isize result_len = 0;
|
||||
for (int scope = 0; ptr; ptr++) // NOTE: Parse the function return type
|
||||
{
|
||||
@ -37,7 +81,7 @@ char const *Dqn_Header__ParseFunctionReturnType(char const *ptr, isize *len)
|
||||
return result;
|
||||
}
|
||||
|
||||
char const *Dqn_Header__ParseFunctionNameAndParameters(char const *ptr, isize *len)
|
||||
char const *ParseFunctionNameAndParameters(char const *ptr, isize *len)
|
||||
{
|
||||
char const *result = ptr;
|
||||
int result_len = 0;
|
||||
@ -56,7 +100,7 @@ char const *Dqn_Header__ParseFunctionNameAndParameters(char const *ptr, isize *l
|
||||
return result;
|
||||
}
|
||||
|
||||
char const *Dqn_Header__ParseFunctionComment(char const *ptr, isize *len)
|
||||
char const *ParseFunctionComment(char const *ptr, isize *len)
|
||||
{
|
||||
while (ptr[0] != '"') ptr++;
|
||||
ptr++;
|
||||
@ -80,11 +124,35 @@ char const *Dqn_Header__ParseFunctionComment(char const *ptr, isize *len)
|
||||
|
||||
}
|
||||
|
||||
enum struct HeaderEntryType
|
||||
{
|
||||
Prototype,
|
||||
Comment,
|
||||
CopyBegin,
|
||||
Count
|
||||
};
|
||||
|
||||
struct HeaderEntry
|
||||
{
|
||||
HeaderEntryType type;
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
Dqn_Slice<char> return_val;
|
||||
Dqn_Slice<char> name_and_args;
|
||||
} function_decl;
|
||||
|
||||
Dqn_Slice<char> comment;
|
||||
Dqn_Slice<char> copy_range;
|
||||
};
|
||||
};
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
if (argc < 1)
|
||||
{
|
||||
fprintf(stdout, "DqnHeader Usage: %s [<source code filename>, ...]\n", argv[0]);
|
||||
fprintf(stdout, "Header Usage: %s [<source code filename>, ...]\n", argv[0]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -93,7 +161,7 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
char const *file = argv[arg_index];
|
||||
isize buf_size = 0;
|
||||
char *buf = Dqn_FileReadWithArena(&arena, file, &buf_size);
|
||||
char *buf = Dqn_File_ReadWithArena(&arena, file, &buf_size);
|
||||
if (!buf)
|
||||
{
|
||||
fprintf(stderr, "Failed to read file: %s\n", file);
|
||||
@ -105,14 +173,6 @@ int main(int argc, char *argv[])
|
||||
char constexpr HEADER_COPY_BEGIN[] = "DQN_HEADER_COPY_BEGIN";
|
||||
char constexpr HEADER_COPY_END[] = "DQN_HEADER_COPY_END";
|
||||
|
||||
enum struct FindString
|
||||
{
|
||||
HeaderPrototype,
|
||||
HeaderComment,
|
||||
HeaderCopyBegin,
|
||||
Count
|
||||
};
|
||||
|
||||
char const *find_list[] = {HEADER_COPY_PROTOTYPE, HEADER_COMMENT, HEADER_COPY_BEGIN};
|
||||
isize constexpr find_string_lens[] = {
|
||||
Dqn_CharCountI(HEADER_COPY_PROTOTYPE),
|
||||
@ -120,68 +180,130 @@ int main(int argc, char *argv[])
|
||||
Dqn_CharCountI(HEADER_COPY_BEGIN),
|
||||
};
|
||||
|
||||
isize num_header_entries = 0;
|
||||
{
|
||||
char const *ptr = buf;
|
||||
char const *ptr_end = buf + buf_size;
|
||||
isize ptr_len = buf_size;
|
||||
isize matched_find_index = -1;
|
||||
for (char const *token = Dqn_Str_FindMulti(ptr, find_list, find_string_lens, Dqn_ArrayCountI(find_list), &matched_find_index, ptr_len);
|
||||
token;
|
||||
token = Dqn_Str_FindMulti(ptr, find_list, find_string_lens, Dqn_ArrayCountI(find_list), &matched_find_index, ptr_len))
|
||||
{
|
||||
ptr = token + find_string_lens[matched_find_index];
|
||||
num_header_entries++;
|
||||
ptr_len = ptr_end - ptr;
|
||||
}
|
||||
}
|
||||
|
||||
HeaderEntry *header_entries = DQN_MEM_ARENA_ALLOC_ARRAY(&arena, HeaderEntry, num_header_entries);
|
||||
isize header_entries_index = 0;
|
||||
isize max_prototype_return_val = 0;
|
||||
|
||||
char const *ptr = buf;
|
||||
char const *ptr_end = buf + buf_size;
|
||||
isize ptr_len = buf_size;
|
||||
isize matched_find_index = -1;
|
||||
for (char const *token = Dqn_StrMultiFind(ptr, find_list, find_string_lens, Dqn_ArrayCountI(find_list), &matched_find_index, ptr_len);
|
||||
for (char const *token = Dqn_Str_FindMulti(ptr, find_list, find_string_lens, Dqn_ArrayCountI(find_list), &matched_find_index, ptr_len);
|
||||
token;
|
||||
token = Dqn_StrMultiFind(ptr, find_list, find_string_lens, Dqn_ArrayCountI(find_list), &matched_find_index, ptr_len))
|
||||
token = Dqn_Str_FindMulti(ptr, find_list, find_string_lens, Dqn_ArrayCountI(find_list), &matched_find_index, ptr_len))
|
||||
{
|
||||
if (matched_find_index == (isize)FindString::HeaderPrototype)
|
||||
HeaderEntry *entry = header_entries + header_entries_index++;
|
||||
entry->type = static_cast<HeaderEntryType>(matched_find_index);
|
||||
if (matched_find_index == (isize)HeaderEntryType::Prototype)
|
||||
{
|
||||
ptr = token + find_string_lens[matched_find_index] + 1 /*macro start parenthesis*/;
|
||||
isize func_type_len = 0;
|
||||
char const *func_type = Dqn_Header__ParseFunctionReturnType(ptr, &func_type_len);
|
||||
char const *func_type = ParseFunctionReturnType(ptr, &func_type_len);
|
||||
|
||||
ptr = func_type + func_type_len + 1; // Ptr is at macro comma, skip the comma
|
||||
ptr = Dqn_StrSkipWhitespace(ptr);
|
||||
ptr = Dqn_Str_SkipWhitespace(ptr);
|
||||
isize func_name_len = 0;
|
||||
char const *func_name = Dqn_Header__ParseFunctionNameAndParameters(ptr, &func_name_len);
|
||||
char const *func_name = ParseFunctionNameAndParameters(ptr, &func_name_len);
|
||||
|
||||
entry->function_decl.return_val = Dqn_AsprintfSlice(&arena, "%.*s", func_type_len, func_type);
|
||||
entry->function_decl.name_and_args = Dqn_AsprintfSlice(&arena, "%.*s", func_name_len, func_name);
|
||||
ptr = func_name + func_name_len + 1; // Ptr is at macro closing paren, skip the paren
|
||||
fprintf(stdout, "%.*s %.*s;\n", (int)func_type_len, func_type, (int)func_name_len, func_name);
|
||||
|
||||
max_prototype_return_val = DQN_MAX(max_prototype_return_val, func_type_len);
|
||||
}
|
||||
else if (matched_find_index == (isize)FindString::HeaderComment)
|
||||
else if (matched_find_index == (isize)HeaderEntryType::Comment)
|
||||
{
|
||||
char const *comment_start = token;
|
||||
ptr = token;
|
||||
while (ptr[0] != '\n' && ptr[0] != '\r')
|
||||
ptr++;
|
||||
|
||||
isize comment_len = ptr - comment_start;
|
||||
fprintf(stdout, "%.*s\n", (int)comment_len, comment_start);
|
||||
|
||||
entry->comment.buf = DQN_MEM_ARENA_ALLOC_ARRAY(&arena, char, comment_len);
|
||||
DQN_FOR_EACH(comment_index, comment_len)
|
||||
{
|
||||
// NOTE: We capture "// @", and we want to skip the @ symbol, its ugly which is at the index 3
|
||||
// Also if a space is given after the '@' symbol then skip that too.
|
||||
char ch = comment_start[comment_index];
|
||||
if (comment_index == 3 && ch == '@') continue;
|
||||
if (comment_index == 4 && ch == ' ') continue;
|
||||
entry->comment.buf[entry->comment.len++] = ch;
|
||||
}
|
||||
|
||||
while (entry->comment.len > 0 && Dqn_Char_IsWhitespace(entry->comment.buf[entry->comment.len - 1]))
|
||||
entry->comment.len--;
|
||||
ptr = comment_start + comment_len;
|
||||
}
|
||||
else if (matched_find_index == (isize)FindString::HeaderCopyBegin)
|
||||
else if (matched_find_index == (isize)HeaderEntryType::CopyBegin)
|
||||
{
|
||||
ptr = token + find_string_lens[matched_find_index];
|
||||
ptr = Dqn_StrSkipWhitespace(ptr);
|
||||
ptr = Dqn_Str_SkipWhitespace(ptr);
|
||||
char const *copy_start = ptr;
|
||||
char const *copy_end = Dqn_StrFind(ptr, HEADER_COPY_END, ptr_len, Dqn_CharCountI(HEADER_COPY_END));
|
||||
char const *copy_end = Dqn_Str_Find(ptr, HEADER_COPY_END, ptr_len, Dqn_CharCountI(HEADER_COPY_END));
|
||||
if (!copy_end)
|
||||
{
|
||||
fprintf(stderr, "Header copy begin macro: %s not matched with a copy end macro: %s", HEADER_COPY_BEGIN, HEADER_COPY_END);
|
||||
return -1;
|
||||
}
|
||||
|
||||
isize copy_len = copy_end - copy_start;
|
||||
auto mem_scope = Dqn_MemArenaScopedRegion(&arena);
|
||||
char *sanitised_copy = (char *)MEM_ARENA_ALLOC(&arena, copy_len);
|
||||
isize sanitised_len = 0;
|
||||
isize copy_len = copy_end - copy_start;
|
||||
entry->copy_range.buf = (char *)DQN_MEM_ARENA_ALLOC(&arena, copy_len);
|
||||
DQN_FOR_EACH(copy_index, copy_len)
|
||||
{
|
||||
char ch = copy_start[copy_index];
|
||||
if (ch == '\r') continue;
|
||||
sanitised_copy[sanitised_len++] = ch;
|
||||
entry->copy_range.buf[entry->copy_range.len++] = ch;
|
||||
}
|
||||
|
||||
ptr = copy_end;
|
||||
fprintf(stdout, "%.*s\n", (int)sanitised_len, sanitised_copy);
|
||||
}
|
||||
|
||||
ptr_len = ptr_end - ptr;
|
||||
}
|
||||
DQN_ASSERT(header_entries_index == num_header_entries);
|
||||
|
||||
DQN_FOR_EACH(entry_index, header_entries_index)
|
||||
{
|
||||
HeaderEntry const *entry = header_entries + entry_index;
|
||||
switch(entry->type)
|
||||
{
|
||||
case HeaderEntryType::Prototype:
|
||||
{
|
||||
isize remaining_space = max_prototype_return_val - entry->function_decl.return_val.len + 1;
|
||||
fprintf(stdout, "%.*s", (int)entry->function_decl.return_val.len, entry->function_decl.return_val.str);
|
||||
DQN_FOR_EACH(space, remaining_space) fputs(" ", stdout);
|
||||
fprintf(stdout, " %.*s;\n", (int)entry->function_decl.name_and_args.len, entry->function_decl.name_and_args.str);
|
||||
}
|
||||
break;
|
||||
|
||||
case HeaderEntryType::Comment:
|
||||
{
|
||||
fprintf(stdout, "%.*s\n", (int)entry->comment.len, entry->comment.buf);
|
||||
}
|
||||
break;
|
||||
|
||||
case HeaderEntryType::CopyBegin:
|
||||
{
|
||||
fprintf(stdout, "%.*s\n", (int)entry->copy_range.len, entry->copy_range.buf);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
556
Code/DqnHeader_Generated.h
Normal file
556
Code/DqnHeader_Generated.h
Normal file
@ -0,0 +1,556 @@
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
//
|
||||
// NOTE: Typedefs, Macros, Utils
|
||||
//
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
constexpr Dqn_usize Dqn_ArrayCount(T const (&)[N]);
|
||||
constexpr Dqn_isize Dqn_ArrayCountI(T const (&)[N]);
|
||||
constexpr Dqn_usize Dqn_CharCount(char const (&)[N]);
|
||||
constexpr Dqn_isize Dqn_CharCountI(char const (&)[N]);
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
//
|
||||
// NOTE: Logging
|
||||
//
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
constexpr inline char const * Dqn_LogTypeTag(Dqn_LogType type);
|
||||
// NOTE: Set the callback to get called whenever a log message has been printed
|
||||
#define DQN_LOG_CALLBACK(name) void name(Dqn_LogType type, char const *file, Dqn_usize file_len, char const *func, Dqn_usize func_len, Dqn_usize line, char const *log_str)
|
||||
typedef DQN_LOG_CALLBACK(Dqn_LogCallback);
|
||||
Dqn_LogCallback *Dqn_log_callback;
|
||||
|
||||
#define DQN_LOG_E(fmt, ...) Dqn_Log(Dqn_LogType::Error, DQN_STR_AND_LEN(__FILE__), DQN_STR_AND_LEN(__func__), __LINE__, fmt, ## __VA_ARGS__)
|
||||
#define DQN_LOG_D(fmt, ...) Dqn_Log(Dqn_LogType::Debug, DQN_STR_AND_LEN(__FILE__), DQN_STR_AND_LEN(__func__), __LINE__, fmt, ## __VA_ARGS__)
|
||||
#define DQN_LOG_W(fmt, ...) Dqn_Log(Dqn_LogType::Warning, DQN_STR_AND_LEN(__FILE__), DQN_STR_AND_LEN(__func__), __LINE__, fmt, ## __VA_ARGS__)
|
||||
#define DQN_LOG_I(fmt, ...) Dqn_Log(Dqn_LogType::Info, DQN_STR_AND_LEN(__FILE__), DQN_STR_AND_LEN(__func__), __LINE__, fmt, ## __VA_ARGS__)
|
||||
#define DQN_LOG_M(fmt, ...) Dqn_Log(Dqn_LogType::Info, DQN_STR_AND_LEN(__FILE__), DQN_STR_AND_LEN(__func__), __LINE__, fmt, ## __VA_ARGS__)
|
||||
#define DQN_LOG(log_type, fmt, ...) Dqn_Log(log_type, DQN_STR_AND_LEN(__FILE__), DQN_STR_AND_LEN(__func__), __LINE__, fmt, ## __VA_ARGS__)
|
||||
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
//
|
||||
// NOTE: Math
|
||||
//
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
union Dqn_V2I
|
||||
{
|
||||
struct { Dqn_i32 x, y; };
|
||||
struct { Dqn_i32 w, h; };
|
||||
struct { Dqn_i32 min, max; };
|
||||
Dqn_i32 e[2];
|
||||
|
||||
constexpr Dqn_V2I() = default;
|
||||
constexpr Dqn_V2I(Dqn_f32 x_, Dqn_f32 y_): x((Dqn_i32)x_), y((Dqn_i32)y_) {}
|
||||
constexpr Dqn_V2I(Dqn_i32 x_, Dqn_i32 y_): x(x_), y(y_) {}
|
||||
constexpr Dqn_V2I(Dqn_i32 xy): x(xy), y(xy) {}
|
||||
|
||||
constexpr bool operator!=(Dqn_V2I other) const { return !(*this == other); }
|
||||
constexpr bool operator==(Dqn_V2I other) const { return (x == other.x) && (y == other.y); }
|
||||
constexpr bool operator>=(Dqn_V2I other) const { return (x >= other.x) && (y >= other.y); }
|
||||
constexpr bool operator<=(Dqn_V2I other) const { return (x <= other.x) && (y <= other.y); }
|
||||
constexpr bool operator< (Dqn_V2I other) const { return (x < other.x) && (y < other.y); }
|
||||
constexpr bool operator> (Dqn_V2I other) const { return (x > other.x) && (y > other.y); }
|
||||
constexpr Dqn_V2I operator- (Dqn_V2I other) const { Dqn_V2I result(x - other.x, y - other.y); return result; }
|
||||
constexpr Dqn_V2I operator+ (Dqn_V2I other) const { Dqn_V2I result(x + other.x, y + other.y); return result; }
|
||||
constexpr Dqn_V2I operator* (Dqn_V2I other) const { Dqn_V2I result(x * other.x, y * other.y); return result; }
|
||||
constexpr Dqn_V2I operator* (Dqn_f32 other) const { Dqn_V2I result(x * other, y * other); return result; }
|
||||
constexpr Dqn_V2I operator* (Dqn_i32 other) const { Dqn_V2I result(x * other, y * other); return result; }
|
||||
constexpr Dqn_V2I operator/ (Dqn_V2I other) const { Dqn_V2I result(x / other.x, y / other.y); return result; }
|
||||
constexpr Dqn_V2I operator/ (Dqn_f32 other) const { Dqn_V2I result(x / other, y / other); return result; }
|
||||
constexpr Dqn_V2I operator/ (Dqn_i32 other) const { Dqn_V2I result(x / other, y / other); return result; }
|
||||
constexpr Dqn_V2I &operator*=(Dqn_V2I other) { *this = *this * other; return *this; }
|
||||
constexpr Dqn_V2I &operator*=(Dqn_f32 other) { *this = *this * other; return *this; }
|
||||
constexpr Dqn_V2I &operator*=(Dqn_i32 other) { *this = *this * other; return *this; }
|
||||
constexpr Dqn_V2I &operator-=(Dqn_V2I other) { *this = *this - other; return *this; }
|
||||
constexpr Dqn_V2I &operator+=(Dqn_V2I other) { *this = *this + other; return *this; }
|
||||
};
|
||||
|
||||
union Dqn_V2
|
||||
{
|
||||
struct { Dqn_f32 x, y; };
|
||||
struct { Dqn_f32 w, h; };
|
||||
struct { Dqn_f32 min, max; };
|
||||
Dqn_f32 e[2];
|
||||
|
||||
constexpr Dqn_V2() = default;
|
||||
constexpr Dqn_V2(Dqn_f32 a) : x(a), y(a) {}
|
||||
constexpr Dqn_V2(Dqn_i32 a) : x((Dqn_f32)a), y((Dqn_f32)a) {}
|
||||
constexpr Dqn_V2(Dqn_f32 x_, Dqn_f32 y_): x(x_), y(y_) {}
|
||||
constexpr Dqn_V2(Dqn_i32 x_, Dqn_i32 y_): x((Dqn_f32)x_), y((Dqn_f32)y_) {}
|
||||
constexpr Dqn_V2(Dqn_V2I a) : x((Dqn_f32)a.x), y((Dqn_f32)a.y) {}
|
||||
|
||||
constexpr bool operator!=(Dqn_V2 other) const { return !(*this == other); }
|
||||
constexpr bool operator==(Dqn_V2 other) const { return (x == other.x) && (y == other.y); }
|
||||
constexpr bool operator>=(Dqn_V2 other) const { return (x >= other.x) && (y >= other.y); }
|
||||
constexpr bool operator<=(Dqn_V2 other) const { return (x <= other.x) && (y <= other.y); }
|
||||
constexpr bool operator< (Dqn_V2 other) const { return (x < other.x) && (y < other.y); }
|
||||
constexpr bool operator> (Dqn_V2 other) const { return (x > other.x) && (y > other.y); }
|
||||
constexpr Dqn_V2 operator- (Dqn_V2 other) const { Dqn_V2 result(x - other.x, y - other.y); return result; }
|
||||
constexpr Dqn_V2 operator+ (Dqn_V2 other) const { Dqn_V2 result(x + other.x, y + other.y); return result; }
|
||||
constexpr Dqn_V2 operator* (Dqn_V2 other) const { Dqn_V2 result(x * other.x, y * other.y); return result; }
|
||||
constexpr Dqn_V2 operator* (Dqn_f32 other) const { Dqn_V2 result(x * other, y * other); return result; }
|
||||
constexpr Dqn_V2 operator* (Dqn_i32 other) const { Dqn_V2 result(x * other, y * other); return result; }
|
||||
constexpr Dqn_V2 operator/ (Dqn_V2 other) const { Dqn_V2 result(x / other.x, y / other.y); return result; }
|
||||
constexpr Dqn_V2 operator/ (Dqn_f32 other) const { Dqn_V2 result(x / other, y / other); return result; }
|
||||
constexpr Dqn_V2 operator/ (Dqn_i32 other) const { Dqn_V2 result(x / other, y / other); return result; }
|
||||
constexpr Dqn_V2 &operator*=(Dqn_V2 other) { *this = *this * other; return *this; }
|
||||
constexpr Dqn_V2 &operator*=(Dqn_f32 other) { *this = *this * other; return *this; }
|
||||
constexpr Dqn_V2 &operator*=(Dqn_i32 other) { *this = *this * other; return *this; }
|
||||
constexpr Dqn_V2 &operator/=(Dqn_V2 other) { *this = *this / other; return *this; }
|
||||
constexpr Dqn_V2 &operator/=(Dqn_f32 other) { *this = *this / other; return *this; }
|
||||
constexpr Dqn_V2 &operator/=(Dqn_i32 other) { *this = *this / other; return *this; }
|
||||
constexpr Dqn_V2 &operator-=(Dqn_V2 other) { *this = *this - other; return *this; }
|
||||
constexpr Dqn_V2 &operator+=(Dqn_V2 other) { *this = *this + other; return *this; }
|
||||
};
|
||||
|
||||
union Dqn_V3
|
||||
{
|
||||
struct { Dqn_f32 x, y, z; };
|
||||
struct { Dqn_f32 r, g, b; };
|
||||
Dqn_V2 xy;
|
||||
Dqn_f32 e[3];
|
||||
|
||||
constexpr Dqn_V3() = default;
|
||||
constexpr Dqn_V3(Dqn_f32 a) : x(a), y(a), z(a) {}
|
||||
constexpr Dqn_V3(Dqn_i32 a) : x((Dqn_f32)a), y((Dqn_f32)a), z((Dqn_f32)a) {}
|
||||
constexpr Dqn_V3(Dqn_f32 x_, Dqn_f32 y_, Dqn_f32 z_): x(x_), y(y_), z(z_) {}
|
||||
constexpr Dqn_V3(Dqn_i32 x_, Dqn_i32 y_, Dqn_f32 z_): x((Dqn_f32)x_), y((Dqn_f32)y_), z((Dqn_f32)z_) {}
|
||||
constexpr Dqn_V3(Dqn_V2 xy, Dqn_f32 z_) : x(xy.x), y(xy.y), z(z_) {}
|
||||
|
||||
constexpr bool operator!= (Dqn_V3 other) const { return !(*this == other); }
|
||||
constexpr bool operator== (Dqn_V3 other) const { return (x == other.x) && (y == other.y) && (z == other.z); }
|
||||
constexpr bool operator>= (Dqn_V3 other) const { return (x >= other.x) && (y >= other.y) && (z >= other.z); }
|
||||
constexpr bool operator<= (Dqn_V3 other) const { return (x <= other.x) && (y <= other.y) && (z <= other.z); }
|
||||
constexpr bool operator< (Dqn_V3 other) const { return (x < other.x) && (y < other.y) && (z < other.z); }
|
||||
constexpr bool operator> (Dqn_V3 other) const { return (x > other.x) && (y > other.y) && (z > other.z); }
|
||||
constexpr Dqn_V3 operator- (Dqn_V3 other) const { Dqn_V3 result(x - other.x, y - other.y, z - other.z); return result; }
|
||||
constexpr Dqn_V3 operator+ (Dqn_V3 other) const { Dqn_V3 result(x + other.x, y + other.y, z + other.z); return result; }
|
||||
constexpr Dqn_V3 operator* (Dqn_V3 other) const { Dqn_V3 result(x * other.x, y * other.y, z * other.z); return result; }
|
||||
constexpr Dqn_V3 operator* (Dqn_f32 other) const { Dqn_V3 result(x * other, y * other, z * other); return result; }
|
||||
constexpr Dqn_V3 operator* (Dqn_i32 other) const { Dqn_V3 result(x * other, y * other, z * other); return result; }
|
||||
constexpr Dqn_V3 operator/ (Dqn_V3 other) const { Dqn_V3 result(x / other.x, y / other.y, z / other.z); return result; }
|
||||
constexpr Dqn_V3 operator/ (Dqn_f32 other) const { Dqn_V3 result(x / other, y / other, z / other); return result; }
|
||||
constexpr Dqn_V3 operator/ (Dqn_i32 other) const { Dqn_V3 result(x / other, y / other, z / other); return result; }
|
||||
constexpr Dqn_V3 &operator*=(Dqn_V3 other) { *this = *this * other; return *this; }
|
||||
constexpr Dqn_V3 &operator*=(Dqn_f32 other) { *this = *this * other; return *this; }
|
||||
constexpr Dqn_V3 &operator*=(Dqn_i32 other) { *this = *this * other; return *this; }
|
||||
constexpr Dqn_V3 &operator/=(Dqn_V3 other) { *this = *this / other; return *this; }
|
||||
constexpr Dqn_V3 &operator/=(Dqn_f32 other) { *this = *this / other; return *this; }
|
||||
constexpr Dqn_V3 &operator/=(Dqn_i32 other) { *this = *this / other; return *this; }
|
||||
constexpr Dqn_V3 &operator-=(Dqn_V3 other) { *this = *this - other; return *this; }
|
||||
constexpr Dqn_V3 &operator+=(Dqn_V3 other) { *this = *this + other; return *this; }
|
||||
};
|
||||
|
||||
union Dqn_V4
|
||||
{
|
||||
struct { Dqn_f32 x, y, z, w; };
|
||||
struct { Dqn_f32 r, g, b, a; };
|
||||
Dqn_V3 rgb;
|
||||
Dqn_f32 e[4];
|
||||
|
||||
constexpr Dqn_V4() = default;
|
||||
constexpr Dqn_V4(Dqn_f32 xyzw) : x(xyzw), y(xyzw), z(xyzw), w(xyzw) {}
|
||||
constexpr Dqn_V4(Dqn_f32 x_, Dqn_f32 y_, Dqn_f32 z_, Dqn_f32 w_): x(x_), y(y_), z(z_), w(w_) {}
|
||||
constexpr Dqn_V4(Dqn_i32 x_, Dqn_i32 y_, Dqn_i32 z_, Dqn_i32 w_): x((Dqn_f32)x_), y((Dqn_f32)y_), z((Dqn_f32)z_), w((Dqn_f32)w_) {}
|
||||
constexpr Dqn_V4(Dqn_V3 xyz, Dqn_f32 w_) : x(xyz.x), y(xyz.y), z(xyz.z), w(w_) {}
|
||||
|
||||
constexpr bool operator!=(Dqn_V4 other) const { return !(*this == other); }
|
||||
constexpr bool operator==(Dqn_V4 other) const { return (x == other.x) && (y == other.y) && (z == other.z) && (w == other.w); }
|
||||
constexpr bool operator>=(Dqn_V4 other) const { return (x >= other.x) && (y >= other.y) && (z >= other.z) && (w >= other.w); }
|
||||
constexpr bool operator<=(Dqn_V4 other) const { return (x <= other.x) && (y <= other.y) && (z <= other.z) && (w <= other.w); }
|
||||
constexpr bool operator< (Dqn_V4 other) const { return (x < other.x) && (y < other.y) && (z < other.z) && (w < other.w); }
|
||||
constexpr bool operator> (Dqn_V4 other) const { return (x > other.x) && (y > other.y) && (z > other.z) && (w > other.w); }
|
||||
constexpr Dqn_V4 operator- (Dqn_V4 other) const { Dqn_V4 result(x - other.x, y - other.y, z - other.z, w - other.w); return result; }
|
||||
constexpr Dqn_V4 operator+ (Dqn_V4 other) const { Dqn_V4 result(x + other.x, y + other.y, z + other.z, w + other.w); return result; }
|
||||
constexpr Dqn_V4 operator* (Dqn_V4 other) const { Dqn_V4 result(x * other.x, y * other.y, z * other.z, w * other.w); return result; }
|
||||
constexpr Dqn_V4 operator* (Dqn_f32 other) const { Dqn_V4 result(x * other, y * other, z * other, w * other); return result; }
|
||||
constexpr Dqn_V4 operator* (Dqn_i32 other) const { Dqn_V4 result(x * other, y * other, z * other, w * other); return result; }
|
||||
constexpr Dqn_V4 operator/ (Dqn_f32 other) const { Dqn_V4 result(x / other, y / other, z / other, w / other); return result; }
|
||||
constexpr Dqn_V4 &operator*=(Dqn_V4 other) { *this = *this * other; return *this; }
|
||||
constexpr Dqn_V4 &operator*=(Dqn_f32 other) { *this = *this * other; return *this; }
|
||||
constexpr Dqn_V4 &operator*=(Dqn_i32 other) { *this = *this * other; return *this; }
|
||||
constexpr Dqn_V4 &operator-=(Dqn_V4 other) { *this = *this - other; return *this; }
|
||||
constexpr Dqn_V4 &operator+=(Dqn_V4 other) { *this = *this + other; return *this; }
|
||||
};
|
||||
|
||||
struct Dqn_Rect
|
||||
{
|
||||
Dqn_V2 min, max;
|
||||
Dqn_Rect() = default;
|
||||
Dqn_Rect(Dqn_V2 min, Dqn_V2 max) : min(min), max(max) {}
|
||||
Dqn_Rect(Dqn_V2I min, Dqn_V2I max) : min(min), max(max) {}
|
||||
};
|
||||
|
||||
struct Dqn_RectI32
|
||||
{
|
||||
Dqn_V2I min, max;
|
||||
Dqn_RectI32() = default;
|
||||
Dqn_RectI32(Dqn_V2I min, Dqn_V2I max) : min(min), max(max) {}
|
||||
};
|
||||
|
||||
union Dqn_Mat4
|
||||
{
|
||||
Dqn_f32 e[16];
|
||||
Dqn_V4 row[4];
|
||||
Dqn_f32 row_major[4][4];
|
||||
Dqn_f32 operator[](Dqn_usize i) const { return e[i]; }
|
||||
};
|
||||
|
||||
template <typename T> int Dqn_MemCmpType(T const *ptr1, T const *ptr2);
|
||||
template <typename T> T * Dqn_MemZero(T *src);
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
//
|
||||
// NOTE: Dqn_MemArena
|
||||
//
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
using Dqn_MemSize = Dqn_usize;
|
||||
struct Dqn_MemBlock
|
||||
{
|
||||
// NOTE: Read only state
|
||||
Dqn_b32 allocated_by_user_or_fixed_mem;
|
||||
void *memory;
|
||||
Dqn_MemSize size;
|
||||
Dqn_MemSize used;
|
||||
Dqn_MemBlock *prev;
|
||||
Dqn_MemBlock *next;
|
||||
};
|
||||
|
||||
enum Dqn_MemArenaFlag
|
||||
{
|
||||
Dqn_MemArenaFlag_NoCRTAllocation = (1 << 0), // If my_calloc/my_free aren't null, it defaults to calloc and free, setting this flag disables that
|
||||
};
|
||||
|
||||
typedef void *(Dqn_MemArenaCallocFunction)(size_t bytes);
|
||||
typedef void (Dqn_MemArenaFreeFunction) (void *ptr, size_t bytes_to_free);
|
||||
struct Dqn_MemArena
|
||||
{
|
||||
// NOTE: Configuration (fill once)
|
||||
Dqn_MemArenaCallocFunction *my_calloc; // If nullptr, use CRT calloc unless disabled in flags
|
||||
Dqn_MemArenaFreeFunction *my_free; // If nullptr, use CRT free unless disabled in flags
|
||||
Dqn_u32 flags;
|
||||
|
||||
// NOTE: Read Only
|
||||
Dqn_u8 fixed_mem[DQN_KILOBYTES(16)];
|
||||
Dqn_MemBlock fixed_mem_block;
|
||||
Dqn_MemBlock *curr_mem_block;
|
||||
Dqn_MemBlock *top_mem_block;
|
||||
Dqn_MemSize highest_used_mark;
|
||||
int total_allocated_mem_blocks;
|
||||
};
|
||||
|
||||
struct Dqn_MemArenaScopedRegion
|
||||
{
|
||||
Dqn_MemArenaScopedRegion(Dqn_MemArena *arena);
|
||||
~Dqn_MemArenaScopedRegion();
|
||||
Dqn_MemArena *arena;
|
||||
Dqn_MemBlock *curr_mem_block;
|
||||
Dqn_usize curr_mem_block_used;
|
||||
Dqn_MemBlock *top_mem_block;
|
||||
};
|
||||
|
||||
#if defined(DQN_DEBUG_DQN_MEM_ARENA_LOGGING)
|
||||
#define DQN_DEBUG_ARGS , char const *file, Dqn_isize file_len, char const *func, Dqn_isize func_len, Dqn_isize line
|
||||
#define DQN_DEBUG_PARAMS , DQN_STR_AND_LEN(__FILE__), DQN_STR_AND_LEN(__func__), __LINE__
|
||||
#else
|
||||
#define DQN_DEBUG_ARGS
|
||||
#define DQN_DEBUG_PARAMS
|
||||
#endif
|
||||
|
||||
#define DQN_MEM_ARENA_ALLOC(arena, size) Dqn_MemArena_Alloc(arena, size DQN_DEBUG_PARAMS);
|
||||
#define DQN_MEM_ARENA_ALLOC_ARRAY(arena, T, num) (T *)Dqn_MemArena_Alloc(arena, sizeof(T) * num DQN_DEBUG_PARAMS);
|
||||
#define DQN_MEM_ARENA_ALLOC_STRUCT(arena, T) (T *)Dqn_MemArena_Alloc(arena, sizeof(T) DQN_DEBUG_PARAMS);
|
||||
#define DQN_MEM_ARENA_RESERVE(arena, size) Dqn_MemArena_Reserve(arena, size DQN_DEBUG_PARAMS);
|
||||
#define DQN_MEM_ARENA_RESERVE_FROM(arena, src, size) Dqn_MemArena_ReserveFrom(arena, src, size DQN_DEBUG_PARAMS);
|
||||
#define DQN_MEM_ARENA_CLEAR_USED(arena) Dqn_MemArena_ClearUsed(arena DQN_DEBUG_PARAMS);
|
||||
#define DQN_MEM_ARENA_FREE(arena) Dqn_MemArena_Free
|
||||
|
||||
// -----------------------------------------------------------------------------------------------
|
||||
//
|
||||
// NOTE: String Builder
|
||||
//
|
||||
// -----------------------------------------------------------------------------------------------
|
||||
// The necessary length to build the string, it returns the length including the null-terminator
|
||||
template <Dqn_usize N> Dqn_isize Dqn_StringBuilder_BuildLen(Dqn_StringBuilder<N> const *builder);
|
||||
template <Dqn_usize N> void Dqn_StringBuilder_BuildInBuffer(Dqn_StringBuilder<N> const *builder, char *dest, Dqn_usize dest_size);
|
||||
template <Dqn_usize N> char * Dqn_StringBuilder_BuildFromMalloc(Dqn_StringBuilder<N> *builder, Dqn_isize *len = nullptr);
|
||||
template <Dqn_usize N> char * Dqn_StringBuilder_BuildFromArena(Dqn_StringBuilder<N> *builder, Dqn_MemArena *arena, Dqn_isize *len = nullptr);
|
||||
template <Dqn_usize N> void Dqn_StringBuilder_VFmtAppend(Dqn_StringBuilder<N> *builder, char const *fmt, va_list va);
|
||||
template <Dqn_usize N> void Dqn_StringBuilder_FmtAppend(Dqn_StringBuilder<N> *builder, char const *fmt, ...);
|
||||
template <Dqn_usize N> void Dqn_StringBuilder_Append(Dqn_StringBuilder<N> *builder, char const *str, Dqn_isize len = -1);
|
||||
template <Dqn_usize N> void Dqn_StringBuilder_AppendChar(Dqn_StringBuilder<N> *builder, char ch);
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
//
|
||||
// NOTE: Dqn_Slices
|
||||
//
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
template <typename T> inline Dqn_Slice<T> Dqn_Slice_CopyNullTerminated(Dqn_MemArena *arena, T const *src, Dqn_isize len);
|
||||
template <typename T> inline Dqn_Slice<T> Dqn_Slice_CopyNullTerminated(Dqn_MemArena *arena, Dqn_Slice<T> const src);
|
||||
template <typename T> inline Dqn_Slice<T> Dqn_Slice_Copy(Dqn_MemArena *arena, T const *src, Dqn_isize len);
|
||||
template <typename T> inline Dqn_Slice<T> Dqn_Slice_Copy(Dqn_MemArena *arena, Dqn_Slice<T> const src);
|
||||
template <typename T> inline bool Dqn_Slice_Equals(Dqn_Slice<T> const a, Dqn_Slice<T> const b);
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
//
|
||||
// NOTE: Dqn_Asprintf (Allocate Sprintf)
|
||||
//
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
template <typename T> Dqn_Slice<char> Dqn_AsprintfSlice(T *arena, char const *fmt, va_list va);
|
||||
template <typename T> Dqn_Slice<char> Dqn_AsprintfSlice(T *arena, char const *fmt, ...);
|
||||
template <typename T> char * Dqn_Asprintf(T *arena, int *len, char const *fmt, ...);
|
||||
template <typename T> char * Dqn_Asprintf(T *arena, char const *fmt, ...);
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
//
|
||||
// NOTE: Dqn_FixedArray
|
||||
//
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
#define DQN_FIXED_ARRAY_TEMPLATE template <typename T, int MAX_>
|
||||
#define DQN_FIXED_ARRAY_TEMPLATE_DECL Dqn_FixedArray<T, MAX_>
|
||||
DQN_FIXED_ARRAY_TEMPLATE struct Dqn_FixedArray
|
||||
{
|
||||
T data[MAX_];
|
||||
Dqn_isize len;
|
||||
Dqn_isize Max() const { return MAX_; }
|
||||
|
||||
T &operator[] (Dqn_isize i) { DQN_ASSERT_MSG(i >= 0 && i < len, "%d >= 0 && %d < %d", i, len); return data[i]; }
|
||||
T *begin () { return data; }
|
||||
T *end () { return data + len; }
|
||||
T *operator+ (Dqn_isize i) { DQN_ASSERT_MSG(i >= 0 && i < len, "%d >= 0 && %d < %d", i, len); return data + i; }
|
||||
|
||||
T const &operator[] (Dqn_isize i) const { DQN_ASSERT_MSG(i >= 0 && i < len, "%d >= 0 && %d < %d", i, len); return data[i]; }
|
||||
T const *begin () const { return data; }
|
||||
T const *end () const { return data + len; }
|
||||
T const *operator+ (Dqn_isize i) const { DQN_ASSERT_MSG(i >= 0 && i < len, "%d >= 0 && %d < %d", i, len); return data + i; }
|
||||
};
|
||||
|
||||
DQN_FIXED_ARRAY_TEMPLATE_DECL Dqn_FixedArray_Init(T const *item, int num);
|
||||
T * Dqn_FixedArray_Add(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, T const *items, Dqn_isize num);
|
||||
T * Dqn_FixedArray_Add(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, T const item);
|
||||
T * Dqn_FixedArray_Make(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, Dqn_isize num);
|
||||
void Dqn_FixedArray_Clear(DQN_FIXED_ARRAY_TEMPLATE_DECL *a);
|
||||
void Dqn_FixedArray_EraseStable(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, Dqn_isize index);
|
||||
void Dqn_FixedArray_EraseUnstable(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, Dqn_isize index);
|
||||
void Dqn_FixedArray_Pop(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, Dqn_isize num);
|
||||
T * Dqn_FixedArray_Peek(DQN_FIXED_ARRAY_TEMPLATE_DECL *a);
|
||||
Dqn_isize Dqn_FixedArray_GetIndex(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, T const *entry);
|
||||
T * Dqn_FixedArray_Find(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, EqualityProc IsEqual);
|
||||
T * Dqn_FixedArray_Find(DQN_FIXED_ARRAY_TEMPLATE_DECL *a, T *entry);
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
//
|
||||
// NOTE: Dqn_FixedStack
|
||||
//
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
template <typename T, int MAX_> using Dqn_FixedStack = DQN_FIXED_ARRAY_TEMPLATE_DECL;
|
||||
template <typename T, int MAX_> T Dqn_FixedStack_Pop (Dqn_FixedStack<T, MAX_> *array) { T result = *Dqn_FixedArray_Peek(array); Dqn_FixedArray_Pop(array, 1); return result; }
|
||||
template <typename T, int MAX_> T *Dqn_FixedStack_Peek (Dqn_FixedStack<T, MAX_> *array) { return Dqn_FixedArray_Peek(array); }
|
||||
template <typename T, int MAX_> T *Dqn_FixedStack_Push (Dqn_FixedStack<T, MAX_> *array, T item) { return Dqn_FixedArray_Add(array, item); }
|
||||
template <typename T, int MAX_> void Dqn_FixedStack_Clear(Dqn_FixedStack<T, MAX_> *array) { Dqn_FixedArray_Clear(array); }
|
||||
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
//
|
||||
// NOTE: Dqn_StaticArray
|
||||
//
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
template <typename T> struct Dqn_StaticArray
|
||||
{
|
||||
T *data;
|
||||
Dqn_isize len;
|
||||
Dqn_isize max;
|
||||
T const operator[](Dqn_isize i) const { DQN_ASSERT_MSG(i >= 0 && i < len, "%d >= 0 && %d < %d", i, len); return data[i]; }
|
||||
T operator[](Dqn_isize i) { DQN_ASSERT_MSG(i >= 0 && i < len, "%d >= 0 && %d < %d", i, len); return data[i]; }
|
||||
T const *begin () const { return data; }
|
||||
T const *end () const { return data + len; }
|
||||
T *begin () { return data; }
|
||||
T *end () { return data + len; }
|
||||
T const *operator+(Dqn_isize i) const { DQN_ASSERT_MSG(i >= 0 && i < len, "%d >= 0 && %d < %d", i, len); return data + i; }
|
||||
T *operator+(Dqn_isize i) { DQN_ASSERT_MSG(i >= 0 && i < len, "%d >= 0 && %d < %d", i, len); return data + i; }
|
||||
};
|
||||
|
||||
template <typename T> Dqn_StaticArray<T> Dqn_StaticArray_InitMemory (T *memory, Dqn_isize max, Dqn_isize len = 0);
|
||||
template <typename T> T * Dqn_StaticArray_Add (Dqn_StaticArray<T> *a, T const *items, Dqn_isize num);
|
||||
template <typename T> T * Dqn_StaticArray_Add (Dqn_StaticArray<T> *a, T const item);
|
||||
template <typename T> T * Dqn_StaticArray_Make (Dqn_StaticArray<T> *a, Dqn_isize num);
|
||||
template <typename T> void Dqn_StaticArray_Clear (Dqn_StaticArray<T> *a);
|
||||
template <typename T> void Dqn_StaticArray_EraseStable (Dqn_StaticArray<T> *a, Dqn_isize index);
|
||||
template <typename T> void Dqn_StaticArray_EraseUnstable(Dqn_StaticArray<T> *a, Dqn_isize index);
|
||||
template <typename T> void Dqn_StaticArray_Pop (Dqn_StaticArray<T> *a, Dqn_isize num);
|
||||
template <typename T> T * Dqn_StaticArray_Peek (Dqn_StaticArray<T> *a);
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
//
|
||||
// NOTE: Dqn_FixedString
|
||||
//
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
template <Dqn_isize MAX_>
|
||||
struct Dqn_FixedString
|
||||
{
|
||||
union { char data[MAX_]; char str[MAX_]; char buf[MAX_]; };
|
||||
Dqn_isize len;
|
||||
Dqn_isize Max() const { return MAX_; }
|
||||
|
||||
Dqn_FixedString() { data[0] = 0; len = 0; }
|
||||
Dqn_FixedString(char const *fmt, ...)
|
||||
{
|
||||
*this = {};
|
||||
va_list va;
|
||||
va_start(va, fmt);
|
||||
Dqn_FixedString_AppendVFmt(this, fmt, va);
|
||||
va_end(va);
|
||||
}
|
||||
|
||||
char const &operator[] (Dqn_isize i) const { DQN_ASSERT_MSG(i >= 0 && i < len, "%d >= 0 && %d < %d", i, len); return data[i]; }
|
||||
char &operator[] (Dqn_isize i) { DQN_ASSERT_MSG(i >= 0 && i < len, "%d >= 0 && %d < %d", i, len); return data[i]; }
|
||||
char const *begin () const { return data; }
|
||||
char const *end () const { return data + len; }
|
||||
char *begin () { return data; }
|
||||
char *end () { return data + len; }
|
||||
};
|
||||
|
||||
template <Dqn_isize MAX_> void Dqn_FixedString_Clear(Dqn_FixedString<MAX_> *str);
|
||||
template <Dqn_isize MAX_> void Dqn_FixedString_AppendVFmt(Dqn_FixedString<MAX_> *str, char const *fmt, va_list va);
|
||||
template <Dqn_isize MAX_> void Dqn_FixedString_AppendFmt(Dqn_FixedString<MAX_> *str, char const *fmt, ...);
|
||||
template <Dqn_isize MAX_> void Dqn_FixedString_Append(Dqn_FixedString<MAX_> *str, char const *src, Dqn_isize len = -1);
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
//
|
||||
// NOTE: Dqn_Dqn_U64Str
|
||||
//
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
struct Dqn_U64Str
|
||||
{
|
||||
// Points to the start of the str in the buffer, not necessarily buf since
|
||||
// we write into the buffer in reverse
|
||||
char *start;
|
||||
char buf[27]; // NOTE(doyle): 27 is the maximum size of Dqn_u64 including commas
|
||||
int len;
|
||||
};
|
||||
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
//
|
||||
// NOTE: Helpers
|
||||
//
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
int Dqn_MemCmp(void const *ptr1, void const *ptr2, size_t num_bytes);
|
||||
void * Dqn_MemCopy(void *dest, void const *src, size_t num_bytes);
|
||||
void * Dqn_MemMove(void *dest, void const *src, size_t num_bytes);
|
||||
void * Dqn_MemSet(void *src, char ch, Dqn_usize num_bytes);
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
//
|
||||
// NOTE: Logging
|
||||
//
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
void Dqn_LogV(Dqn_LogType type, char const *file, Dqn_usize file_len, char const *func, Dqn_usize func_len, Dqn_usize line, char const *fmt, va_list va);
|
||||
void Dqn_Log(Dqn_LogType type, char const *file, Dqn_usize file_len, char const *func, Dqn_usize func_len, Dqn_usize line, char const *fmt, ...);
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
//
|
||||
// NOTE: Dqn_MemArena
|
||||
//
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
void * Dqn_MemArena_Alloc(Dqn_MemArena *arena, Dqn_usize size DQN_DEBUG_ARGS);
|
||||
void Dqn_MemArena_Free(Dqn_MemArena *arena DQN_DEBUG_ARGS);
|
||||
Dqn_b32 Dqn_MemArena_Reserve(Dqn_MemArena *arena, Dqn_usize size DQN_DEBUG_ARGS);
|
||||
void Dqn_MemArena_ReserveFrom(Dqn_MemArena *arena, void *memory, Dqn_usize size DQN_DEBUG_ARGS);
|
||||
void Dqn_MemArena_ClearUsed(Dqn_MemArena *arena DQN_DEBUG_ARGS);
|
||||
Dqn_MemArenaScopedRegion Dqn_MemArena_MakeScopedRegion(Dqn_MemArena *arena);
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
//
|
||||
// NOTE: Vectors
|
||||
//
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
Dqn_V2I Dqn_V2_ToV2I(Dqn_V2 a);
|
||||
Dqn_V2 Dqn_V2_Max(Dqn_V2 a, Dqn_V2 b);
|
||||
Dqn_V2 Dqn_V2_Abs(Dqn_V2 a);
|
||||
Dqn_f32 Dqn_V2_Dot(Dqn_V2 a, Dqn_V2 b);
|
||||
Dqn_f32 Dqn_V2_LengthSq(Dqn_V2 a, Dqn_V2 b);
|
||||
Dqn_V2 Dqn_V2_Normalise(Dqn_V2 a);
|
||||
Dqn_V2 Dqn_V2_Perpendicular(Dqn_V2 a);
|
||||
Dqn_f32 Dqn_V4_Dot(Dqn_V4 const *a, Dqn_V4 const *b);
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
//
|
||||
// NOTE: Rect
|
||||
//
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
Dqn_Rect Dqn_Rect_InitFromPosAndSize(Dqn_V2 pos, Dqn_V2 size);
|
||||
Dqn_V2 Dqn_Rect_Center(Dqn_Rect rect);
|
||||
Dqn_b32 Dqn_Rect_ContainsPoint(Dqn_Rect rect, Dqn_V2 p);
|
||||
Dqn_b32 Dqn_Rect_ContainsRect(Dqn_Rect a, Dqn_Rect b);
|
||||
Dqn_V2 Dqn_Rect_Size(Dqn_Rect rect);
|
||||
Dqn_Rect Dqn_Rect_Move(Dqn_Rect src, Dqn_V2 move_amount);
|
||||
Dqn_Rect Dqn_Rect_Union(Dqn_Rect a, Dqn_Rect b);
|
||||
Dqn_Rect Dqn_Rect_FromRectI32(Dqn_RectI32 a);
|
||||
Dqn_V2I Dqn_RectI32_Size(Dqn_RectI32 rect);
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
//
|
||||
// NOTE: Math Utils
|
||||
//
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
Dqn_V2 Dqn_LerpV2(Dqn_V2 a, Dqn_f32 t, Dqn_V2 b);
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
//
|
||||
// NOTE: Dqn_Mat4
|
||||
//
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
Dqn_Mat4 Dqn_Mat4_Identity();
|
||||
Dqn_Mat4 Dqn_Mat4_Scale3f(Dqn_f32 x, Dqn_f32 y, Dqn_f32 z);
|
||||
Dqn_Mat4 Dqn_Mat4_ScaleV3(Dqn_V3 vec);
|
||||
Dqn_Mat4 Dqn_Mat4_Translate3f(Dqn_f32 x, Dqn_f32 y, Dqn_f32 z);
|
||||
Dqn_Mat4 Dqn_Mat4_TranslateV3(Dqn_V3 vec);
|
||||
Dqn_Mat4 operator*(Dqn_Mat4 const &a, Dqn_Mat4 const &b);
|
||||
Dqn_V4 operator*(Dqn_Mat4 const &mat, Dqn_V4 const &vec);
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
//
|
||||
// NOTE: Helper Functions
|
||||
//
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
void Dqn_Bit_UnsetInplace(Dqn_u32 *flags, Dqn_u32 bitfield);
|
||||
void Dqn_Bit_SetInplace(Dqn_u32 *flags, Dqn_u32 bitfield);
|
||||
Dqn_b32 Dqn_Bit_IsSet(Dqn_u32 flags, Dqn_u32 bitfield);
|
||||
Dqn_b32 Dqn_Bit_IsNotSet(Dqn_u32 flags, Dqn_u32 bitfield);
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
//
|
||||
// NOTE: Safe Arithmetic
|
||||
//
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
Dqn_i64 Dqn_Safe_AddI64(Dqn_i64 a, Dqn_i64 b);
|
||||
Dqn_i64 Dqn_Safe_MulI64(Dqn_i64 a, Dqn_i64 b);
|
||||
Dqn_u64 Dqn_Safe_AddU64(Dqn_u64 a, Dqn_u64 b);
|
||||
Dqn_u64 Dqn_Safe_MulU64(Dqn_u64 a, Dqn_u64 b);
|
||||
int Dqn_Safe_TruncateISizeToInt(Dqn_isize val);
|
||||
Dqn_i32 Dqn_Safe_TruncateISizeToI32(Dqn_isize val);
|
||||
Dqn_i8 Dqn_Safe_TruncateISizeToI8(Dqn_isize val);
|
||||
Dqn_u32 Dqn_Safe_TruncateUSizeToU32(Dqn_u64 val);
|
||||
int Dqn_Safe_TruncateUSizeToI32(Dqn_usize val);
|
||||
int Dqn_Safe_TruncateUSizeToInt(Dqn_usize val);
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
//
|
||||
// NOTE: Char Helpers
|
||||
//
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
Dqn_b32 Dqn_Char_IsAlpha(char ch);
|
||||
Dqn_b32 Dqn_Char_IsDigit(char ch);
|
||||
Dqn_b32 Dqn_Char_IsAlphaNum(char ch);
|
||||
Dqn_b32 Dqn_Char_IsWhitespace(char ch);
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
//
|
||||
// NOTE: String Helpers
|
||||
//
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
Dqn_b32 Dqn_Str_Equals(char const *a, Dqn_isize a_len, char const *b, Dqn_isize b_len = -1);
|
||||
char const * Dqn_Str_FindMulti(char const *buf, char const *find_list[], Dqn_isize const *find_string_lens, Dqn_isize find_len, Dqn_isize *match_index, Dqn_isize buf_len = -1);
|
||||
char const * Dqn_Str_Find(char const *buf, char const *find, Dqn_isize buf_len = -1, Dqn_isize find_len = -1);
|
||||
Dqn_b32 Dqn_Str_Match(char const *src, char const *find, int find_len);
|
||||
char const * Dqn_Str_SkipToChar(char const *src, char ch);
|
||||
char const * Dqn_Str_SkipToNextAlphaNum(char const *src);
|
||||
char const * Dqn_Str_SkipToNextDigit(char const *src);
|
||||
char const * Dqn_Str_SkipToNextChar(char const *src);
|
||||
char const * Dqn_Str_SkipToNextWord(char const *src);
|
||||
char const * Dqn_Str_SkipToNextWhitespace(char const *src);
|
||||
char const * Dqn_Str_SkipWhitespace(char const *src);
|
||||
char const * Dqn_Str_SkipToCharInPlace(char const **src, char ch);
|
||||
char const * Dqn_Str_SkipToNextAlphaNumInPlace(char const **src);
|
||||
char const * Dqn_Str_SkipToNextCharInPlace(char const **src);
|
||||
char const * Dqn_Str_SkipToNextWhitespaceInPlace(char const **src);
|
||||
char const * Dqn_Str_SkipToNextWordInPlace(char const **src);
|
||||
char const * Dqn_Str_SkipWhitespaceInPlace(char const **src);
|
||||
Dqn_u64 Dqn_Str_ToU64(char const *buf, int len = -1);
|
||||
Dqn_i64 Dqn_Str_ToI64(char const *buf, int len = -1);
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
//
|
||||
// NOTE: File
|
||||
//
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
char * Dqn_File_ReadWithArena(Dqn_MemArena *arena, char const *file, Dqn_isize *file_size);
|
2533
Code/DqnInspect.h
2533
Code/DqnInspect.h
File diff suppressed because it is too large
Load Diff
@ -1,53 +0,0 @@
|
||||
struct V3 {
|
||||
V3(float a, float b, float c) { (void)a; (void)b; (void)c; }
|
||||
float a, b, c;
|
||||
};
|
||||
struct V4 { float test; };
|
||||
|
||||
template <typename T, int Size>
|
||||
struct Array { T data[Size]; };
|
||||
|
||||
enum struct OpenGLShader { Vertex, Count, };
|
||||
|
||||
DQN_INSPECT struct SampleStruct
|
||||
{
|
||||
int ebo DQN_INSPECT_META(char const *DisplayName = "Element Buffer Object"), vbo, vao DQN_INSPECT_META(char const *DisplayName = "Vertex Array Object", int OpenGLVersion = 330);
|
||||
const int *const a;
|
||||
int const *const b, c, *d, *e;
|
||||
V4 draw_color DQN_INSPECT_META(char const *DisplayName = "HelloWorld");
|
||||
// #if 0
|
||||
// #endif
|
||||
Array<V3, 32> lights;
|
||||
Array<V4, 32> camera_matrixes;
|
||||
char **bitmaps;
|
||||
int shaders[(int)OpenGLShader::Count];
|
||||
void *win32_handle;
|
||||
V3 lighting_ambient_coeff;
|
||||
int draw_call_count;
|
||||
|
||||
const int f;
|
||||
int const g;
|
||||
int *const h;
|
||||
int const* i;
|
||||
int ****const j, k, **l, *m;
|
||||
|
||||
};
|
||||
|
||||
DQN_INSPECT enum struct EnumWithMetadata
|
||||
{
|
||||
Rect DQN_INSPECT_META(char const *FilePath = "Rect.vert", V3 Coords = V3(1, 2, 3)),
|
||||
Square DQN_INSPECT_META(char const *FilePath = "Square.vert"),
|
||||
Count,
|
||||
};
|
||||
|
||||
DQN_INSPECT_FUNCTION(b = {}, c = nullptr, e = false, f = 1, g = "Hello world")
|
||||
void Function1(int a, float b, char const *c, bool e, int f, char *g)
|
||||
{
|
||||
(void)a; (void)b; (void)c; (void)e; (void)f; (void)g;
|
||||
}
|
||||
|
||||
DQN_INSPECT_FUNCTION(foo = V3(10, 20, 50), bar = {120, 150, 20})
|
||||
void *Function2(V3 foo, V3 bar, ...) { (void)foo; (void)bar; return nullptr; }
|
||||
|
||||
DQN_INSPECT_FUNCTION()
|
||||
Array<int const *, 3> const *const Function3(Array<int, 32> const *foobar) { (void)foobar; return {}; }
|
@ -1,425 +0,0 @@
|
||||
// This is an auto generated file using DqnInspect
|
||||
|
||||
// NOTE: These macros are undefined at the end of the file so to not pollute namespace
|
||||
#define ARRAY_COUNT(array) sizeof(array)/sizeof((array)[0])
|
||||
#define CHAR_COUNT(str) (ARRAY_COUNT(str) - 1)
|
||||
#define STR_AND_LEN(str) str, CHAR_COUNT(str)
|
||||
|
||||
enum struct DqnInspectMemberType
|
||||
{
|
||||
SampleStruct,
|
||||
SampleStruct_a,
|
||||
SampleStruct_b,
|
||||
SampleStruct_c,
|
||||
SampleStruct_d,
|
||||
SampleStruct_e,
|
||||
SampleStruct_f,
|
||||
SampleStruct_g,
|
||||
SampleStruct_h,
|
||||
SampleStruct_i,
|
||||
SampleStruct_j,
|
||||
SampleStruct_k,
|
||||
SampleStruct_l,
|
||||
SampleStruct_m,
|
||||
EnumWithMetadata,
|
||||
SampleStruct_ebo,
|
||||
SampleStruct_vao,
|
||||
SampleStruct_vbo,
|
||||
SampleStruct_lights,
|
||||
SampleStruct_bitmaps,
|
||||
SampleStruct_shaders,
|
||||
EnumWithMetadata_Rect,
|
||||
EnumWithMetadata_Count,
|
||||
EnumWithMetadata_Square,
|
||||
SampleStruct_draw_color,
|
||||
SampleStruct_win32_handle,
|
||||
SampleStruct_camera_matrixes,
|
||||
SampleStruct_draw_call_count,
|
||||
SampleStruct_lighting_ambient_coeff,
|
||||
};
|
||||
|
||||
enum struct DqnInspectDeclType
|
||||
{
|
||||
NotAvailable_,
|
||||
V3_,
|
||||
V4_,
|
||||
int_,
|
||||
Array_,
|
||||
int_Ptr_,
|
||||
V3,_32_,
|
||||
V4,_32_,
|
||||
int_Ptr_Ptr_,
|
||||
void_Ptr_,
|
||||
char_Ptr_Ptr_,
|
||||
int_const_,
|
||||
int_Ptr_const_,
|
||||
int_const_Ptr_,
|
||||
SampleStruct_,
|
||||
char_const_Ptr_,
|
||||
Array_V3,_32_,
|
||||
Array_V4,_32_,
|
||||
int_Ptr_Ptr_Ptr_Ptr_const_,
|
||||
EnumWithMetadata_,
|
||||
int_const_Ptr_const_,
|
||||
};
|
||||
|
||||
enum struct DqnInspectMetaType
|
||||
{
|
||||
DisplayName,
|
||||
OpenGLVersion,
|
||||
};
|
||||
|
||||
//
|
||||
// ..\Data\DqnInspect_TestData.h
|
||||
//
|
||||
|
||||
#ifndef DQN_INSPECT_DQNINSPECT_TESTDATA_H
|
||||
#define DQN_INSPECT_DQNINSPECT_TESTDATA_H
|
||||
|
||||
char const * DqnInspectMetadata_SampleStruct_ebo_DisplayName = "Element Buffer Object";
|
||||
char const * DqnInspectMetadata_SampleStruct_vao_DisplayName = "Vertex Array Object";
|
||||
int DqnInspectMetadata_SampleStruct_vao_OpenGLVersion = 330;
|
||||
char const * DqnInspectMetadata_SampleStruct_draw_color_DisplayName = "HelloWorld";
|
||||
|
||||
DqnInspectMetadata const DqnInspectMetadata_SampleStruct_ebo[] =
|
||||
{
|
||||
{ DqnInspectDeclType::char_const_Ptr_, DqnInspectMetaType::DisplayName, &DqnInspectMetadata_SampleStruct_ebo_DisplayName},
|
||||
};
|
||||
|
||||
DqnInspectMetadata const DqnInspectMetadata_SampleStruct_vao[] =
|
||||
{
|
||||
{ DqnInspectDeclType::char_const_Ptr_, DqnInspectMetaType::DisplayName, &DqnInspectMetadata_SampleStruct_vao_DisplayName},
|
||||
{ DqnInspectDeclType::int_, DqnInspectMetaType::OpenGLVersion, &DqnInspectMetadata_SampleStruct_vao_OpenGLVersion},
|
||||
};
|
||||
|
||||
DqnInspectMetadata const DqnInspectMetadata_SampleStruct_draw_color[] =
|
||||
{
|
||||
{ DqnInspectDeclType::char_const_Ptr_, DqnInspectMetaType::DisplayName, &DqnInspectMetadata_SampleStruct_draw_color_DisplayName},
|
||||
};
|
||||
|
||||
DqnInspectMember const DqnInspect_SampleStruct_Members[] =
|
||||
{
|
||||
{
|
||||
DqnInspectMemberType::SampleStruct_ebo, STR_AND_LEN("ebo"),
|
||||
offsetof(SampleStruct, ebo),
|
||||
DqnInspectDeclType::int_, STR_AND_LEN("int"),
|
||||
sizeof(((SampleStruct *)0)->ebo), // full_decl_type_sizeof
|
||||
DqnInspectDeclType::int_, DqnInspectDeclType::NotAvailable_,
|
||||
nullptr, 0, // template_child_expr and template_child_expr_len
|
||||
0, // array_dimensions
|
||||
{0, 0, 0, 0, 0, 0, 0, 0}, // array_compile_time_size 0, max 8 dimensions, 0 if unknown,
|
||||
DqnInspectMetadata_SampleStruct_ebo, ARRAY_COUNT(DqnInspectMetadata_SampleStruct_ebo), // metadata array
|
||||
},
|
||||
{
|
||||
DqnInspectMemberType::SampleStruct_vbo, STR_AND_LEN("vbo"),
|
||||
offsetof(SampleStruct, vbo),
|
||||
DqnInspectDeclType::int_, STR_AND_LEN("int"),
|
||||
sizeof(((SampleStruct *)0)->vbo), // full_decl_type_sizeof
|
||||
DqnInspectDeclType::int_, DqnInspectDeclType::NotAvailable_,
|
||||
nullptr, 0, // template_child_expr and template_child_expr_len
|
||||
0, // array_dimensions
|
||||
{0, 0, 0, 0, 0, 0, 0, 0}, // array_compile_time_size 0, max 8 dimensions, 0 if unknown,
|
||||
nullptr, 0, // metadata array
|
||||
},
|
||||
{
|
||||
DqnInspectMemberType::SampleStruct_vao, STR_AND_LEN("vao"),
|
||||
offsetof(SampleStruct, vao),
|
||||
DqnInspectDeclType::int_, STR_AND_LEN("int"),
|
||||
sizeof(((SampleStruct *)0)->vao), // full_decl_type_sizeof
|
||||
DqnInspectDeclType::int_, DqnInspectDeclType::NotAvailable_,
|
||||
nullptr, 0, // template_child_expr and template_child_expr_len
|
||||
0, // array_dimensions
|
||||
{0, 0, 0, 0, 0, 0, 0, 0}, // array_compile_time_size 0, max 8 dimensions, 0 if unknown,
|
||||
DqnInspectMetadata_SampleStruct_vao, ARRAY_COUNT(DqnInspectMetadata_SampleStruct_vao), // metadata array
|
||||
},
|
||||
{
|
||||
DqnInspectMemberType::SampleStruct_a, STR_AND_LEN("a"),
|
||||
offsetof(SampleStruct, a),
|
||||
DqnInspectDeclType::int_Ptr_const_, STR_AND_LEN("int *const"),
|
||||
sizeof(((SampleStruct *)0)->a), // full_decl_type_sizeof
|
||||
DqnInspectDeclType::int_Ptr_const_, DqnInspectDeclType::NotAvailable_,
|
||||
nullptr, 0, // template_child_expr and template_child_expr_len
|
||||
1, // array_dimensions
|
||||
{0, 0, 0, 0, 0, 0, 0, 0}, // array_compile_time_size 0, max 8 dimensions, 0 if unknown,
|
||||
nullptr, 0, // metadata array
|
||||
},
|
||||
{
|
||||
DqnInspectMemberType::SampleStruct_b, STR_AND_LEN("b"),
|
||||
offsetof(SampleStruct, b),
|
||||
DqnInspectDeclType::int_const_Ptr_const_, STR_AND_LEN("int const *const"),
|
||||
sizeof(((SampleStruct *)0)->b), // full_decl_type_sizeof
|
||||
DqnInspectDeclType::int_const_Ptr_const_, DqnInspectDeclType::NotAvailable_,
|
||||
nullptr, 0, // template_child_expr and template_child_expr_len
|
||||
1, // array_dimensions
|
||||
{0, 0, 0, 0, 0, 0, 0, 0}, // array_compile_time_size 0, max 8 dimensions, 0 if unknown,
|
||||
nullptr, 0, // metadata array
|
||||
},
|
||||
{
|
||||
DqnInspectMemberType::SampleStruct_c, STR_AND_LEN("c"),
|
||||
offsetof(SampleStruct, c),
|
||||
DqnInspectDeclType::int_, STR_AND_LEN("int"),
|
||||
sizeof(((SampleStruct *)0)->c), // full_decl_type_sizeof
|
||||
DqnInspectDeclType::int_, DqnInspectDeclType::NotAvailable_,
|
||||
nullptr, 0, // template_child_expr and template_child_expr_len
|
||||
0, // array_dimensions
|
||||
{0, 0, 0, 0, 0, 0, 0, 0}, // array_compile_time_size 0, max 8 dimensions, 0 if unknown,
|
||||
nullptr, 0, // metadata array
|
||||
},
|
||||
{
|
||||
DqnInspectMemberType::SampleStruct_d, STR_AND_LEN("d"),
|
||||
offsetof(SampleStruct, d),
|
||||
DqnInspectDeclType::int_Ptr_, STR_AND_LEN("int *"),
|
||||
sizeof(((SampleStruct *)0)->d), // full_decl_type_sizeof
|
||||
DqnInspectDeclType::int_Ptr_, DqnInspectDeclType::NotAvailable_,
|
||||
nullptr, 0, // template_child_expr and template_child_expr_len
|
||||
1, // array_dimensions
|
||||
{0, 0, 0, 0, 0, 0, 0, 0}, // array_compile_time_size 0, max 8 dimensions, 0 if unknown,
|
||||
nullptr, 0, // metadata array
|
||||
},
|
||||
{
|
||||
DqnInspectMemberType::SampleStruct_e, STR_AND_LEN("e"),
|
||||
offsetof(SampleStruct, e),
|
||||
DqnInspectDeclType::int_Ptr_, STR_AND_LEN("int *"),
|
||||
sizeof(((SampleStruct *)0)->e), // full_decl_type_sizeof
|
||||
DqnInspectDeclType::int_Ptr_, DqnInspectDeclType::NotAvailable_,
|
||||
nullptr, 0, // template_child_expr and template_child_expr_len
|
||||
1, // array_dimensions
|
||||
{0, 0, 0, 0, 0, 0, 0, 0}, // array_compile_time_size 0, max 8 dimensions, 0 if unknown,
|
||||
nullptr, 0, // metadata array
|
||||
},
|
||||
{
|
||||
DqnInspectMemberType::SampleStruct_draw_color, STR_AND_LEN("draw_color"),
|
||||
offsetof(SampleStruct, draw_color),
|
||||
DqnInspectDeclType::V4_, STR_AND_LEN("V4"),
|
||||
sizeof(((SampleStruct *)0)->draw_color), // full_decl_type_sizeof
|
||||
DqnInspectDeclType::V4_, DqnInspectDeclType::NotAvailable_,
|
||||
nullptr, 0, // template_child_expr and template_child_expr_len
|
||||
0, // array_dimensions
|
||||
{0, 0, 0, 0, 0, 0, 0, 0}, // array_compile_time_size 0, max 8 dimensions, 0 if unknown,
|
||||
DqnInspectMetadata_SampleStruct_draw_color, ARRAY_COUNT(DqnInspectMetadata_SampleStruct_draw_color), // metadata array
|
||||
},
|
||||
{
|
||||
DqnInspectMemberType::SampleStruct_lights, STR_AND_LEN("lights"),
|
||||
offsetof(SampleStruct, lights),
|
||||
DqnInspectDeclType::Array_V3,_32_, STR_AND_LEN("Array<V3, 32>"),
|
||||
sizeof(((SampleStruct *)0)->lights), // full_decl_type_sizeof
|
||||
DqnInspectDeclType::Array_, DqnInspectDeclType::V3,_32_,
|
||||
STR_AND_LEN("V3, 32"), // template_child_expr
|
||||
0, // array_dimensions
|
||||
{0, 0, 0, 0, 0, 0, 0, 0}, // array_compile_time_size 0, max 8 dimensions, 0 if unknown,
|
||||
nullptr, 0, // metadata array
|
||||
},
|
||||
{
|
||||
DqnInspectMemberType::SampleStruct_camera_matrixes, STR_AND_LEN("camera_matrixes"),
|
||||
offsetof(SampleStruct, camera_matrixes),
|
||||
DqnInspectDeclType::Array_V4,_32_, STR_AND_LEN("Array<V4, 32>"),
|
||||
sizeof(((SampleStruct *)0)->camera_matrixes), // full_decl_type_sizeof
|
||||
DqnInspectDeclType::Array_, DqnInspectDeclType::V4,_32_,
|
||||
STR_AND_LEN("V4, 32"), // template_child_expr
|
||||
0, // array_dimensions
|
||||
{0, 0, 0, 0, 0, 0, 0, 0}, // array_compile_time_size 0, max 8 dimensions, 0 if unknown,
|
||||
nullptr, 0, // metadata array
|
||||
},
|
||||
{
|
||||
DqnInspectMemberType::SampleStruct_bitmaps, STR_AND_LEN("bitmaps"),
|
||||
offsetof(SampleStruct, bitmaps),
|
||||
DqnInspectDeclType::char_Ptr_Ptr_, STR_AND_LEN("char **"),
|
||||
sizeof(((SampleStruct *)0)->bitmaps), // full_decl_type_sizeof
|
||||
DqnInspectDeclType::char_Ptr_Ptr_, DqnInspectDeclType::NotAvailable_,
|
||||
nullptr, 0, // template_child_expr and template_child_expr_len
|
||||
2, // array_dimensions
|
||||
{0, 0, 0, 0, 0, 0, 0, 0}, // array_compile_time_size 0, max 8 dimensions, 0 if unknown,
|
||||
nullptr, 0, // metadata array
|
||||
},
|
||||
{
|
||||
DqnInspectMemberType::SampleStruct_shaders, STR_AND_LEN("shaders"),
|
||||
offsetof(SampleStruct, shaders),
|
||||
DqnInspectDeclType::int_, STR_AND_LEN("int"),
|
||||
sizeof(((SampleStruct *)0)->shaders), // full_decl_type_sizeof
|
||||
DqnInspectDeclType::int_, DqnInspectDeclType::NotAvailable_,
|
||||
nullptr, 0, // template_child_expr and template_child_expr_len
|
||||
1, // array_dimensions
|
||||
{ARRAY_COUNT(((SampleStruct *)0)->shaders), 0, 0, 0, 0, 0, 0, 0}, // array_compile_time_size 0, max 8 dimensions, 0 if unknown,
|
||||
nullptr, 0, // metadata array
|
||||
},
|
||||
{
|
||||
DqnInspectMemberType::SampleStruct_win32_handle, STR_AND_LEN("win32_handle"),
|
||||
offsetof(SampleStruct, win32_handle),
|
||||
DqnInspectDeclType::void_Ptr_, STR_AND_LEN("void *"),
|
||||
sizeof(((SampleStruct *)0)->win32_handle), // full_decl_type_sizeof
|
||||
DqnInspectDeclType::void_Ptr_, DqnInspectDeclType::NotAvailable_,
|
||||
nullptr, 0, // template_child_expr and template_child_expr_len
|
||||
1, // array_dimensions
|
||||
{0, 0, 0, 0, 0, 0, 0, 0}, // array_compile_time_size 0, max 8 dimensions, 0 if unknown,
|
||||
nullptr, 0, // metadata array
|
||||
},
|
||||
{
|
||||
DqnInspectMemberType::SampleStruct_lighting_ambient_coeff, STR_AND_LEN("lighting_ambient_coeff"),
|
||||
offsetof(SampleStruct, lighting_ambient_coeff),
|
||||
DqnInspectDeclType::V3_, STR_AND_LEN("V3"),
|
||||
sizeof(((SampleStruct *)0)->lighting_ambient_coeff), // full_decl_type_sizeof
|
||||
DqnInspectDeclType::V3_, DqnInspectDeclType::NotAvailable_,
|
||||
nullptr, 0, // template_child_expr and template_child_expr_len
|
||||
0, // array_dimensions
|
||||
{0, 0, 0, 0, 0, 0, 0, 0}, // array_compile_time_size 0, max 8 dimensions, 0 if unknown,
|
||||
nullptr, 0, // metadata array
|
||||
},
|
||||
{
|
||||
DqnInspectMemberType::SampleStruct_draw_call_count, STR_AND_LEN("draw_call_count"),
|
||||
offsetof(SampleStruct, draw_call_count),
|
||||
DqnInspectDeclType::int_, STR_AND_LEN("int"),
|
||||
sizeof(((SampleStruct *)0)->draw_call_count), // full_decl_type_sizeof
|
||||
DqnInspectDeclType::int_, DqnInspectDeclType::NotAvailable_,
|
||||
nullptr, 0, // template_child_expr and template_child_expr_len
|
||||
0, // array_dimensions
|
||||
{0, 0, 0, 0, 0, 0, 0, 0}, // array_compile_time_size 0, max 8 dimensions, 0 if unknown,
|
||||
nullptr, 0, // metadata array
|
||||
},
|
||||
{
|
||||
DqnInspectMemberType::SampleStruct_f, STR_AND_LEN("f"),
|
||||
offsetof(SampleStruct, f),
|
||||
DqnInspectDeclType::int_, STR_AND_LEN("int"),
|
||||
sizeof(((SampleStruct *)0)->f), // full_decl_type_sizeof
|
||||
DqnInspectDeclType::int_, DqnInspectDeclType::NotAvailable_,
|
||||
nullptr, 0, // template_child_expr and template_child_expr_len
|
||||
0, // array_dimensions
|
||||
{0, 0, 0, 0, 0, 0, 0, 0}, // array_compile_time_size 0, max 8 dimensions, 0 if unknown,
|
||||
nullptr, 0, // metadata array
|
||||
},
|
||||
{
|
||||
DqnInspectMemberType::SampleStruct_g, STR_AND_LEN("g"),
|
||||
offsetof(SampleStruct, g),
|
||||
DqnInspectDeclType::int_const_, STR_AND_LEN("int const"),
|
||||
sizeof(((SampleStruct *)0)->g), // full_decl_type_sizeof
|
||||
DqnInspectDeclType::int_const_, DqnInspectDeclType::NotAvailable_,
|
||||
nullptr, 0, // template_child_expr and template_child_expr_len
|
||||
0, // array_dimensions
|
||||
{0, 0, 0, 0, 0, 0, 0, 0}, // array_compile_time_size 0, max 8 dimensions, 0 if unknown,
|
||||
nullptr, 0, // metadata array
|
||||
},
|
||||
{
|
||||
DqnInspectMemberType::SampleStruct_h, STR_AND_LEN("h"),
|
||||
offsetof(SampleStruct, h),
|
||||
DqnInspectDeclType::int_Ptr_const_, STR_AND_LEN("int *const"),
|
||||
sizeof(((SampleStruct *)0)->h), // full_decl_type_sizeof
|
||||
DqnInspectDeclType::int_Ptr_const_, DqnInspectDeclType::NotAvailable_,
|
||||
nullptr, 0, // template_child_expr and template_child_expr_len
|
||||
1, // array_dimensions
|
||||
{0, 0, 0, 0, 0, 0, 0, 0}, // array_compile_time_size 0, max 8 dimensions, 0 if unknown,
|
||||
nullptr, 0, // metadata array
|
||||
},
|
||||
{
|
||||
DqnInspectMemberType::SampleStruct_i, STR_AND_LEN("i"),
|
||||
offsetof(SampleStruct, i),
|
||||
DqnInspectDeclType::int_const_Ptr_, STR_AND_LEN("int const*"),
|
||||
sizeof(((SampleStruct *)0)->i), // full_decl_type_sizeof
|
||||
DqnInspectDeclType::int_const_Ptr_, DqnInspectDeclType::NotAvailable_,
|
||||
nullptr, 0, // template_child_expr and template_child_expr_len
|
||||
1, // array_dimensions
|
||||
{0, 0, 0, 0, 0, 0, 0, 0}, // array_compile_time_size 0, max 8 dimensions, 0 if unknown,
|
||||
nullptr, 0, // metadata array
|
||||
},
|
||||
{
|
||||
DqnInspectMemberType::SampleStruct_j, STR_AND_LEN("j"),
|
||||
offsetof(SampleStruct, j),
|
||||
DqnInspectDeclType::int_Ptr_Ptr_Ptr_Ptr_const_, STR_AND_LEN("int ****const"),
|
||||
sizeof(((SampleStruct *)0)->j), // full_decl_type_sizeof
|
||||
DqnInspectDeclType::int_Ptr_Ptr_Ptr_Ptr_const_, DqnInspectDeclType::NotAvailable_,
|
||||
nullptr, 0, // template_child_expr and template_child_expr_len
|
||||
4, // array_dimensions
|
||||
{0, 0, 0, 0, 0, 0, 0, 0}, // array_compile_time_size 0, max 8 dimensions, 0 if unknown,
|
||||
nullptr, 0, // metadata array
|
||||
},
|
||||
{
|
||||
DqnInspectMemberType::SampleStruct_k, STR_AND_LEN("k"),
|
||||
offsetof(SampleStruct, k),
|
||||
DqnInspectDeclType::int_, STR_AND_LEN("int"),
|
||||
sizeof(((SampleStruct *)0)->k), // full_decl_type_sizeof
|
||||
DqnInspectDeclType::int_, DqnInspectDeclType::NotAvailable_,
|
||||
nullptr, 0, // template_child_expr and template_child_expr_len
|
||||
0, // array_dimensions
|
||||
{0, 0, 0, 0, 0, 0, 0, 0}, // array_compile_time_size 0, max 8 dimensions, 0 if unknown,
|
||||
nullptr, 0, // metadata array
|
||||
},
|
||||
{
|
||||
DqnInspectMemberType::SampleStruct_l, STR_AND_LEN("l"),
|
||||
offsetof(SampleStruct, l),
|
||||
DqnInspectDeclType::int_Ptr_Ptr_, STR_AND_LEN("int **"),
|
||||
sizeof(((SampleStruct *)0)->l), // full_decl_type_sizeof
|
||||
DqnInspectDeclType::int_Ptr_Ptr_, DqnInspectDeclType::NotAvailable_,
|
||||
nullptr, 0, // template_child_expr and template_child_expr_len
|
||||
2, // array_dimensions
|
||||
{0, 0, 0, 0, 0, 0, 0, 0}, // array_compile_time_size 0, max 8 dimensions, 0 if unknown,
|
||||
nullptr, 0, // metadata array
|
||||
},
|
||||
{
|
||||
DqnInspectMemberType::SampleStruct_m, STR_AND_LEN("m"),
|
||||
offsetof(SampleStruct, m),
|
||||
DqnInspectDeclType::int_Ptr_, STR_AND_LEN("int *"),
|
||||
sizeof(((SampleStruct *)0)->m), // full_decl_type_sizeof
|
||||
DqnInspectDeclType::int_Ptr_, DqnInspectDeclType::NotAvailable_,
|
||||
nullptr, 0, // template_child_expr and template_child_expr_len
|
||||
1, // array_dimensions
|
||||
{0, 0, 0, 0, 0, 0, 0, 0}, // array_compile_time_size 0, max 8 dimensions, 0 if unknown,
|
||||
nullptr, 0, // metadata array
|
||||
},
|
||||
};
|
||||
|
||||
DqnInspectStruct const DqnInspect_SampleStruct_Struct =
|
||||
{
|
||||
STR_AND_LEN("SampleStruct"),
|
||||
DqnInspect_SampleStruct_Members, // members
|
||||
ARRAY_COUNT(DqnInspect_SampleStruct_Members) // members_len
|
||||
};
|
||||
|
||||
DqnInspectStruct const *DqnInspect_Struct(SampleStruct const *)
|
||||
{
|
||||
DqnInspectStruct const *result = &DqnInspect_SampleStruct_Struct;
|
||||
return result;
|
||||
}
|
||||
|
||||
char const *DqnInspect_EnumWithMetadata_Strings[] = {"Rect", "Square", "Count", };
|
||||
|
||||
char const *DqnInspectEnum_Stringify(EnumWithMetadata val, int *len = nullptr)
|
||||
{
|
||||
if (val == EnumWithMetadata::Rect) { if (len) *len = CHAR_COUNT("Rect"); return DqnInspect_EnumWithMetadata_Strings[0]; }
|
||||
if (val == EnumWithMetadata::Square) { if (len) *len = CHAR_COUNT("Square"); return DqnInspect_EnumWithMetadata_Strings[1]; }
|
||||
if (val == EnumWithMetadata::Count) { if (len) *len = CHAR_COUNT("Count"); return DqnInspect_EnumWithMetadata_Strings[2]; }
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
int DqnInspectEnum_Count(EnumWithMetadata) { return 3; }
|
||||
|
||||
char const * DqnInspectMetadata_FilePath(EnumWithMetadata val)
|
||||
{
|
||||
if (val == EnumWithMetadata::Rect) { return "Rect.vert"; }
|
||||
if (val == EnumWithMetadata::Square) { return "Square.vert"; }
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool DqnInspectMetadata_Coords(EnumWithMetadata val, V3 *value = nullptr)
|
||||
{
|
||||
if (val == EnumWithMetadata::Rect) { *value = V3(1, 2, 3); return true; }
|
||||
return false;
|
||||
}
|
||||
|
||||
void Function1(int a, float b = {}, char const * c = nullptr, bool e = false, int f = 1, char * g = "Hello world");
|
||||
void * Function2(V3 foo = V3(10, 20, 50), V3 bar = {120, 150, 20}, ...);
|
||||
Array<int const *, 3> const *const Function3(Array<int, 32> const * foobar);
|
||||
|
||||
#endif // DQN_INSPECT_DQNINSPECT_TESTDATA_H
|
||||
|
||||
DqnInspectStruct const *DqnInspect_Struct(DqnInspectDeclType type)
|
||||
{
|
||||
(void)type;
|
||||
#ifdef DQN_INSPECT_DQNINSPECT_TESTDATA_H
|
||||
if (type == DqnInspectDeclType::SampleStruct_) return &DqnInspect_SampleStruct_Struct;
|
||||
#endif // DQN_INSPECT_DQNINSPECT_TESTDATA_H
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
#undef ARRAY_COUNT
|
||||
#undef CHAR_COUNT
|
||||
#undef STR_AND_LEN
|
@ -1,33 +0,0 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 15
|
||||
VisualStudioVersion = 15.0.28307.168
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{911E67C6-3D85-4FCE-B560-20A9C3E3FF48}") = "DqnInspect", "..\..\Bin\DqnInspect.exe", "{52E81ACE-0533-48AA-878A-78CAFC30857B}"
|
||||
ProjectSection(DebuggerProjectSystem) = preProject
|
||||
PortSupplier = 00000000-0000-0000-0000-000000000000
|
||||
Executable = F:\Home\Code\dqn\Bin\DqnInspect.exe
|
||||
RemoteMachine = THAI-XPS13
|
||||
StartingDirectory = F:\Home\Code\dqn\Data\
|
||||
Arguments = DqnInspect_TestData.h
|
||||
Environment = Default
|
||||
LaunchingEngine = 00000000-0000-0000-0000-000000000000
|
||||
UseLegacyDebugEngines = No
|
||||
LaunchSQLEngine = No
|
||||
AttachLaunchAction = No
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Release|x64 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{52E81ACE-0533-48AA-878A-78CAFC30857B}.Release|x64.ActiveCfg = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {38BBCDD2-0DF9-4BD5-B72B-50926B5827FE}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
62
readme.md
62
readme.md
@ -1,43 +1,53 @@
|
||||
# Dqn
|
||||
Personal utility library.
|
||||
|
||||
## DqnInspect
|
||||
A simple C++ introspection metaprogram designed as a prebuild step and generates type information for the inspected types. It is a minimal single header file licensed in the public domain with only CRT dependencies. It is only able to parse C-like C++, i.e. Plain Old Data types only.
|
||||
## DqnHeader
|
||||
A simple C++ introspection metaprogram designed as a prebuild step and generates a summary of function prototypes and comments in a header file based on annotations. It is not designed to be used as a header file for compilation and will most likely fail syntax rules if tried.
|
||||
|
||||
The generated file is written to stdout.
|
||||
|
||||
### Build
|
||||
Build DqnHeader by defining `DQN_HEADER_IMPLEMENTATION` before compiling and execute it as follows
|
||||
|
||||
`DqnHeader.exe SourceCode.h > GeneratedFile.h`
|
||||
|
||||
### Usage
|
||||
Annotate the C++ code using `DQN_INSPECT`, i.e.
|
||||
Include `DqnHeader.h` in a file and use the macros, annotations as described.
|
||||
* Extract function prototypes using the `DQN_HEADER_COPY_PROTOTYPE` macro
|
||||
* Copy comments by writing comments with `// @` as the prefix
|
||||
* Copy many lines of code by enclosing it in `DQN_HEADER_COPY_BEGIN` and `DQN_HEADER_COPY_END` macros
|
||||
|
||||
```
|
||||
DQN_INSPECT struct Entity
|
||||
#include "DqnHeader.h"
|
||||
|
||||
// @ ptr1: Pointer to the first block of memory
|
||||
// @ ptr2: Pointer to the second block of memory
|
||||
// @ num_bytes: The number of bytes to compare in both blocks of memory
|
||||
DQN_HEADER_COPY_PROTOTYPE(int, Dqn_MemCmp(void const *ptr1, void const *ptr2, size_t num_bytes))
|
||||
{
|
||||
V2 pos;
|
||||
V2 size;
|
||||
int result = memcmp(ptr1, ptr2, num_bytes);
|
||||
return result;
|
||||
}
|
||||
|
||||
DQN_INSPECT enum struct SomeEnum
|
||||
DQN_HEADER_COPY_BEGIN
|
||||
struct HelloWorld
|
||||
{
|
||||
Hello,
|
||||
Foo
|
||||
}
|
||||
```
|
||||
|
||||
And then build DqnInspect by defining `DQN_INSPECT_EXECUTABLE_IMPLEMENTATION` before compiling and execute it as follows
|
||||
|
||||
`DqnInspect.exe SourceCode.h > SourceCodeInspected.h`
|
||||
|
||||
Include and use the file in code
|
||||
int foo, bar;
|
||||
};
|
||||
DQN_HEADER_COPY_END
|
||||
|
||||
```
|
||||
#include "DqnReflect.h"
|
||||
#include "SourceCode.h"
|
||||
#include "SourceCodeInspected.h"
|
||||
SomeEnum enum = SomeEnum::Hello;
|
||||
printf("%s\n", DqnInspect_EnumString(enum)); // prints Hello
|
||||
|
||||
Entity entity = {};
|
||||
DqnInspect_Struct const *inspector = DqnInspect_GetStruct(&entity);
|
||||
for (int i = 0; i < inspector->members_len; ++i)
|
||||
printf("%s\n", inspector->members[i].name);
|
||||
Which generates the following output
|
||||
|
||||
```
|
||||
// @ ptr1: Pointer to the first block of memory
|
||||
// @ ptr2: Pointer to the second block of memory
|
||||
// @ num_bytes: The number of bytes to compare in both blocks of memory
|
||||
int Dqn_MemCmp(void const *ptr1, void const *ptr2, size_t num_bytes);
|
||||
struct HelloWorld
|
||||
{
|
||||
int foo, bar;
|
||||
};
|
||||
```
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user