C client: make MenuInputValidator smaller by using a VTABLE

This commit is contained in:
UnknownShadow200 2018-08-31 23:29:31 +10:00
parent 1ddd9419e2
commit 5b36da921c
5 changed files with 97 additions and 92 deletions

View File

@ -14,7 +14,7 @@ typedef signed __int8 Int8;
typedef signed __int16 Int16;
typedef signed __int32 Int32;
typedef signed __int64 Int64;
#define FUNC_ATTRIB(args) __declspec(args)
#define FUNC_NOINLINE __declspec(noinline)
#elif __GNUC__
#include <stdint.h>
typedef uint8_t UInt8;
@ -26,7 +26,7 @@ typedef int8_t Int8;
typedef int16_t Int16;
typedef int32_t Int32;
typedef int64_t Int64;
#define FUNC_ATTRIB(args) __attribute__((args))
#define FUNC_NOINLINE __attribute__((noinline))
#else
#error "I don't recognise this compiler. You'll need to add required definitions in Core.h!"
#endif

View File

@ -993,7 +993,8 @@ Int32 GenLevelScreen_GetInt(struct GenLevelScreen* s, Int32 index) {
struct MenuInputWidget* input = &s->Inputs[index];
String text = input->Base.Text;
if (!input->Validator.IsValidValue(&input->Validator, &text)) return 0;
struct MenuInputValidator* v = &input->Validator;
if (!v->VTABLE->IsValidValue(v, &text)) return 0;
Int32 value; Convert_TryParseInt32(&text, &value); return value;
}
@ -1006,7 +1007,8 @@ Int32 GenLevelScreen_GetSeedInt(struct GenLevelScreen* s, Int32 index) {
return Random_Next(&rnd, Int32_MaxValue);
}
if (!input->Validator.IsValidValue(&input->Validator, &text)) return 0;
struct MenuInputValidator* v = &input->Validator;
if (!v->VTABLE->IsValidValue(v, &text)) return 0;
Int32 value; Convert_TryParseInt32(&text, &value); return value;
}
@ -1961,9 +1963,9 @@ static void MenuOptionsScreen_FreeInput(struct MenuOptionsScreen* s) {
static void MenuOptionsScreen_EnterInput(struct MenuOptionsScreen* s) {
String text = s->Input.Base.Text;
struct MenuInputValidator* validator = &s->Input.Validator;
struct MenuInputValidator* v = &s->Input.Validator;
if (validator->IsValidValue(validator, &text)) {
if (v->VTABLE->IsValidValue(v, &text)) {
MenuOptionsScreen_Set(s, s->ActiveI, &text);
}

View File

@ -35,10 +35,10 @@ void Platform_Exit(ReturnCode code);
STRING_PURE String Platform_GetCommandLineArgs(void);
ReturnCode Platform_StartShell(STRING_PURE String* args);
FUNC_ATTRIB(noinline) void* Mem_Alloc(UInt32 numElems, UInt32 elemsSize, const char* place);
FUNC_ATTRIB(noinline) void* Mem_AllocCleared(UInt32 numElems, UInt32 elemsSize, const char* place);
FUNC_ATTRIB(noinline) void* Mem_Realloc(void* mem, UInt32 numElems, UInt32 elemsSize, const char* place);
FUNC_ATTRIB(noinline) void Mem_Free(void* mem);
FUNC_NOINLINE void* Mem_Alloc(UInt32 numElems, UInt32 elemsSize, const char* place);
FUNC_NOINLINE void* Mem_AllocCleared(UInt32 numElems, UInt32 elemsSize, const char* place);
FUNC_NOINLINE void* Mem_Realloc(void* mem, UInt32 numElems, UInt32 elemsSize, const char* place);
FUNC_NOINLINE void Mem_Free(void* mem);
void Mem_Set(void* dst, UInt8 value, UInt32 numBytes);
void Mem_Copy(void* dst, void* src, UInt32 numBytes);
@ -123,7 +123,6 @@ void Audio_Init(AudioHandle* handle, Int32 buffers);
void Audio_Free(AudioHandle handle);
struct AudioFormat* Audio_GetFormat(AudioHandle handle);
void Audio_SetFormat(AudioHandle handle, struct AudioFormat* format);
void Audio_SetVolume(AudioHandle handle, Real32 volume);
void Audio_BufferData(AudioHandle handle, Int32 idx, void* data, UInt32 dataSize);
void Audio_Play(AudioHandle handle);
bool Audio_IsCompleted(AudioHandle handle, Int32 idx);

View File

@ -1297,49 +1297,47 @@ void InputWidget_Create(struct InputWidget* w, struct FontDesc* font, STRING_REF
/*########################################################################################################################*
*---------------------------------------------------MenuInputValidator----------------------------------------------------*
*#########################################################################################################################*/
static bool MenuInputValidator_AlwaysValidString(struct MenuInputValidator* v, STRING_PURE String* s) { return true; }
static void HexColValidator_GetRange(struct MenuInputValidator* v, STRING_TRANSIENT String* range) {
static void Hex_Range(struct MenuInputValidator* v, STRING_TRANSIENT String* range) {
String_AppendConst(range, "&7(#000000 - #FFFFFF)");
}
static bool HexColValidator_IsValidChar(struct MenuInputValidator* v, char c) {
static bool Hex_ValidChar(struct MenuInputValidator* v, char c) {
return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f');
}
static bool HexColValidator_IsValidString(struct MenuInputValidator* v, STRING_PURE String* s) {
static bool Hex_ValidString(struct MenuInputValidator* v, STRING_PURE String* s) {
return s->length <= 6;
}
static bool HexColValidator_IsValidValue(struct MenuInputValidator* v, STRING_PURE String* s) {
static bool Hex_ValidValue(struct MenuInputValidator* v, STRING_PURE String* s) {
PackedCol col;
return PackedCol_TryParseHex(s, &col);
}
struct MenuInputValidatorVTABLE HexInputValidator_VTABLE = {
Hex_Range, Hex_ValidChar, Hex_ValidString, Hex_ValidValue,
};
struct MenuInputValidator MenuInputValidator_Hex(void) {
struct MenuInputValidator v;
v.GetRange = HexColValidator_GetRange;
v.IsValidChar = HexColValidator_IsValidChar;
v.IsValidString = HexColValidator_IsValidString;
v.IsValidValue = HexColValidator_IsValidValue;
v.VTABLE = &HexInputValidator_VTABLE;
return v;
}
static void IntegerValidator_GetRange(struct MenuInputValidator* v, STRING_TRANSIENT String* range) {
static void Integer_Range(struct MenuInputValidator* v, STRING_TRANSIENT String* range) {
String_Format2(range, "&7(%i - %i)", &v->Meta_Int[0], &v->Meta_Int[1]);
}
static bool IntegerValidator_IsValidChar(struct MenuInputValidator* v, char c) {
static bool Integer_ValidChar(struct MenuInputValidator* v, char c) {
return (c >= '0' && c <= '9') || c == '-';
}
static bool IntegerValidator_IsValidString(struct MenuInputValidator* v, STRING_PURE String* s) {
static bool Integer_ValidString(struct MenuInputValidator* v, STRING_PURE String* s) {
Int32 value;
if (s->length == 1 && s->buffer[0] == '-') return true; /* input is just a minus sign */
return Convert_TryParseInt32(s, &value);
}
static bool IntegerValidator_IsValidValue(struct MenuInputValidator* v, STRING_PURE String* s) {
static bool Integer_ValidValue(struct MenuInputValidator* v, STRING_PURE String* s) {
Int32 value;
if (!Convert_TryParseInt32(s, &value)) return false;
@ -1347,75 +1345,78 @@ static bool IntegerValidator_IsValidValue(struct MenuInputValidator* v, STRING_P
return min <= value && value <= max;
}
struct MenuInputValidatorVTABLE IntegerInputValidator_VTABLE = {
Integer_Range, Integer_ValidChar, Integer_ValidString, Integer_ValidValue,
};
struct MenuInputValidator MenuInputValidator_Integer(Int32 min, Int32 max) {
struct MenuInputValidator v;
v.GetRange = IntegerValidator_GetRange;
v.IsValidChar = IntegerValidator_IsValidChar;
v.IsValidString = IntegerValidator_IsValidString;
v.IsValidValue = IntegerValidator_IsValidValue;
v.VTABLE = &IntegerInputValidator_VTABLE;
v.Meta_Int[0] = min;
v.Meta_Int[1] = max;
return v;
}
static void SeedValidator_GetRange(struct MenuInputValidator* v, STRING_TRANSIENT String* range) {
static void Seed_Range(struct MenuInputValidator* v, STRING_TRANSIENT String* range) {
String_AppendConst(range, "&7(an integer)");
}
struct MenuInputValidatorVTABLE SeedInputValidator_VTABLE = {
Seed_Range, Integer_ValidChar, Integer_ValidString, Integer_ValidValue,
};
struct MenuInputValidator MenuInputValidator_Seed(void) {
struct MenuInputValidator v = MenuInputValidator_Integer(Int32_MinValue, Int32_MaxValue);
v.GetRange = SeedValidator_GetRange;
v.VTABLE = &SeedInputValidator_VTABLE;
return v;
}
static void RealValidator_GetRange(struct MenuInputValidator* v, STRING_TRANSIENT String* range) {
static void Real_Range(struct MenuInputValidator* v, STRING_TRANSIENT String* range) {
String_Format2(range, "&7(%f2 - %f2)", &v->Meta_Real[0], &v->Meta_Real[1]);
}
static bool RealValidator_IsValidChar(struct MenuInputValidator* v, char c) {
static bool Real_ValidChar(struct MenuInputValidator* v, char c) {
return (c >= '0' && c <= '9') || c == '-' || c == '.' || c == ',';
}
static bool RealValidator_IsValidString(struct MenuInputValidator* v, STRING_PURE String* s) {
static bool Real_ValidString(struct MenuInputValidator* v, STRING_PURE String* s) {
Real32 value;
if (s->length == 1 && RealValidator_IsValidChar(v, s->buffer[0])) return true;
if (s->length == 1 && Real_ValidChar(v, s->buffer[0])) return true;
return Convert_TryParseReal32(s, &value);
}
static bool RealValidator_IsValidValue(struct MenuInputValidator* v, STRING_PURE String* s) {
static bool Real_ValidValue(struct MenuInputValidator* v, STRING_PURE String* s) {
Real32 value;
if (!Convert_TryParseReal32(s, &value)) return false;
Real32 min = v->Meta_Real[0], max = v->Meta_Real[1];
return min <= value && value <= max;
}
struct MenuInputValidatorVTABLE RealInputValidator_VTABLE = {
Real_Range, Real_ValidChar, Real_ValidString, Real_ValidValue,
};
struct MenuInputValidator MenuInputValidator_Real(Real32 min, Real32 max) {
struct MenuInputValidator v;
v.GetRange = RealValidator_GetRange;
v.IsValidChar = RealValidator_IsValidChar;
v.IsValidString = RealValidator_IsValidString;
v.IsValidValue = RealValidator_IsValidValue;
v.VTABLE = &RealInputValidator_VTABLE;
v.Meta_Real[0] = min;
v.Meta_Real[1] = max;
return v;
}
static void PathValidator_GetRange(struct MenuInputValidator* v, STRING_TRANSIENT String* range) {
static void Path_Range(struct MenuInputValidator* v, STRING_TRANSIENT String* range) {
String_AppendConst(range, "&7(Enter name)");
}
static bool PathValidator_IsValidChar(struct MenuInputValidator* v, char c) {
static bool Path_ValidChar(struct MenuInputValidator* v, char c) {
return !(c == '/' || c == '\\' || c == '?' || c == '*' || c == ':'
|| c == '<' || c == '>' || c == '|' || c == '"' || c == '.');
}
static bool Path_ValidString(struct MenuInputValidator* v, STRING_PURE String* s) { return true; }
struct MenuInputValidatorVTABLE PathInputValidator_VTABLE = {
Path_Range, Path_ValidChar, Path_ValidString, Path_ValidString,
};
struct MenuInputValidator MenuInputValidator_Path(void) {
struct MenuInputValidator v;
v.GetRange = PathValidator_GetRange;
v.IsValidChar = PathValidator_IsValidChar;
v.IsValidString = MenuInputValidator_AlwaysValidString;
v.IsValidValue = MenuInputValidator_AlwaysValidString;
v.VTABLE = &PathInputValidator_VTABLE;
return v;
}
@ -1426,24 +1427,24 @@ struct MenuInputValidator MenuInputValidator_Enum(const char** names, UInt32 nam
return v;
}
static void StringValidator_GetRange(struct MenuInputValidator* v, STRING_TRANSIENT String* range) {
static void String_Range(struct MenuInputValidator* v, STRING_TRANSIENT String* range) {
String_AppendConst(range, "&7(Enter text)");
}
static bool StringValidator_IsValidChar(struct MenuInputValidator* v, char c) {
static bool String_ValidChar(struct MenuInputValidator* v, char c) {
return c != '&' && Utils_IsValidInputChar(c, true);
}
static bool StringValidator_IsValidString(struct MenuInputValidator* v, STRING_PURE String* s) {
static bool String_ValidString(struct MenuInputValidator* v, STRING_PURE String* s) {
return s->length <= STRING_SIZE;
}
struct MenuInputValidatorVTABLE StringInputValidator_VTABLE = {
String_Range, String_ValidChar, String_ValidString, String_ValidString,
};
struct MenuInputValidator MenuInputValidator_String(void) {
struct MenuInputValidator v;
v.GetRange = StringValidator_GetRange;
v.IsValidChar = StringValidator_IsValidChar;
v.IsValidString = StringValidator_IsValidString;
v.IsValidValue = StringValidator_IsValidString;
v.VTABLE = &StringInputValidator_VTABLE;
return v;
}
@ -1472,8 +1473,8 @@ static void MenuInputWidget_RemakeTexture(void* widget) {
char rangeBuffer[STRING_SIZE];
String range = String_FromArray(rangeBuffer);
struct MenuInputValidator* validator = &w->Validator;
validator->GetRange(validator, &range);
struct MenuInputValidator* v = &w->Validator;
v->VTABLE->GetRange(v, &range);
/* Ensure we don't have 0 text height */
if (size.Height == 0) {
@ -1516,13 +1517,13 @@ static bool MenuInputWidget_AllowedChar(void* widget, char c) {
if (c == '&' || !Utils_IsValidInputChar(c, true)) return false;
struct MenuInputValidator* v = &((struct MenuInputWidget*)w)->Validator;
if (!v->IsValidChar(v, c)) return false;
if (!v->VTABLE->IsValidChar(v, c)) return false;
Int32 maxChars = w->GetMaxLines() * INPUTWIDGET_LEN;
if (w->Text.length == maxChars) return false;
/* See if the new string is in valid format */
InputWidget_AppendChar(w, c);
bool valid = v->IsValidString(v, &w->Text);
bool valid = v->VTABLE->IsValidString(v, &w->Text);
InputWidget_DeleteChar(w);
return valid;
}

View File

@ -16,9 +16,9 @@ struct TextWidget {
bool ReducePadding;
PackedCol Col;
};
void TextWidget_Make(struct TextWidget* widget);
void TextWidget_Create(struct TextWidget* widget, STRING_PURE String* text, struct FontDesc* font);
void TextWidget_Set(struct TextWidget* widget, STRING_PURE String* text, struct FontDesc* font);
void TextWidget_Make(struct TextWidget* w);
void TextWidget_Create(struct TextWidget* w, STRING_PURE String* text, struct FontDesc* font);
void TextWidget_Set(struct TextWidget* w, STRING_PURE String* text, struct FontDesc* font);
typedef void (*Button_Get)(STRING_TRANSIENT String* raw);
@ -32,8 +32,8 @@ struct ButtonWidget {
Button_Get GetValue;
Button_Set SetValue;
};
void ButtonWidget_Create(struct ButtonWidget* widget, Int32 minWidth, STRING_PURE String* text, struct FontDesc* font, Widget_LeftClick onClick);
void ButtonWidget_Set(struct ButtonWidget* widget, STRING_PURE String* text, struct FontDesc* font);
void ButtonWidget_Create(struct ButtonWidget* w, Int32 minWidth, STRING_PURE String* text, struct FontDesc* font, Widget_LeftClick onClick);
void ButtonWidget_Set(struct ButtonWidget* w, STRING_PURE String* text, struct FontDesc* font);
struct ScrollbarWidget {
@ -43,7 +43,7 @@ struct ScrollbarWidget {
Int32 MouseOffset;
bool DraggingMouse;
};
void ScrollbarWidget_Create(struct ScrollbarWidget* widget);
void ScrollbarWidget_Create(struct ScrollbarWidget* w);
struct HotbarWidget {
@ -54,7 +54,7 @@ struct HotbarWidget {
Real32 ScrollAcc;
bool AltHandled;
};
void HotbarWidget_Create(struct HotbarWidget* widget);
void HotbarWidget_Create(struct HotbarWidget* w);
struct TableWidget {
@ -73,10 +73,10 @@ struct TableWidget {
Int32 LastX, LastY;
};
void TableWidget_Create(struct TableWidget* widget);
void TableWidget_SetBlockTo(struct TableWidget* widget, BlockID block);
void TableWidget_OnInventoryChanged(struct TableWidget* widget);
void TableWidget_MakeDescTex(struct TableWidget* widget, BlockID block);
void TableWidget_Create(struct TableWidget* w);
void TableWidget_SetBlockTo(struct TableWidget* w, BlockID block);
void TableWidget_OnInventoryChanged(struct TableWidget* w);
void TableWidget_MakeDescTex(struct TableWidget* w, BlockID block);
#define INPUTWIDGET_MAX_LINES 3
@ -107,22 +107,25 @@ struct InputWidget {
Real64 CaretAccumulator;
};
void InputWidget_Create(struct InputWidget* widget, struct FontDesc* font, STRING_REF String* prefix);
void InputWidget_Create(struct InputWidget* w, struct FontDesc* font, STRING_REF String* prefix);
/* Clears all the characters from the text buffer. Deletes the native texture. */
void InputWidget_Clear(struct InputWidget* widget);
void InputWidget_Clear(struct InputWidget* w);
/* Appends a sequence of characters to current text buffer. May recreate the native texture. */
void InputWidget_AppendString(struct InputWidget* widget, STRING_PURE String* text);
void InputWidget_AppendString(struct InputWidget* w, STRING_PURE String* text);
/* Appends a single character to current text buffer. May recreate the native texture. */
void InputWidget_Append(struct InputWidget* widget, char c);
void InputWidget_Append(struct InputWidget* w, char c);
struct MenuInputValidator;
struct MenuInputValidator {
void (*GetRange)(struct MenuInputValidator* validator, STRING_TRANSIENT String* range);
bool (*IsValidChar)(struct MenuInputValidator* validator, char c);
bool (*IsValidString)(struct MenuInputValidator* validator, STRING_PURE String* s);
bool (*IsValidValue)(struct MenuInputValidator* validator, STRING_PURE String* s);
struct MenuInputValidatorVTABLE {
void (*GetRange)(struct MenuInputValidator* v, STRING_TRANSIENT String* range);
bool (*IsValidChar)(struct MenuInputValidator* v, char c);
bool (*IsValidString)(struct MenuInputValidator* v, STRING_PURE String* s);
bool (*IsValidValue)(struct MenuInputValidator* v, STRING_PURE String* s);
};
struct MenuInputValidator {
struct MenuInputValidatorVTABLE* VTABLE;
union {
void* Meta_Ptr[2];
Int32 Meta_Int[2];
@ -144,7 +147,7 @@ struct MenuInputWidget {
struct MenuInputValidator Validator;
char __TextBuffer[INPUTWIDGET_LEN];
};
void MenuInputWidget_Create(struct MenuInputWidget* widget, Int32 width, Int32 height, STRING_PURE String* text, struct FontDesc* font, struct MenuInputValidator* validator);
void MenuInputWidget_Create(struct MenuInputWidget* w, Int32 width, Int32 height, STRING_PURE String* text, struct FontDesc* font, struct MenuInputValidator* validator);
struct ChatInputWidget {
@ -155,7 +158,7 @@ struct ChatInputWidget {
String OrigStr;
};
void ChatInputWidget_Create(struct ChatInputWidget* widget, struct FontDesc* font);
void ChatInputWidget_Create(struct ChatInputWidget* w, struct FontDesc* font);
#define TEXTGROUPWIDGET_MAX_LINES 30
@ -170,13 +173,13 @@ struct TextGroupWidget {
char* Buffer;
};
void TextGroupWidget_Create(struct TextGroupWidget* widget, Int32 linesCount, struct FontDesc* font, struct FontDesc* underlineFont, STRING_REF struct Texture* textures, STRING_REF char* buffer);
void TextGroupWidget_SetUsePlaceHolder(struct TextGroupWidget* widget, Int32 index, bool placeHolder);
void TextGroupWidget_PushUpAndReplaceLast(struct TextGroupWidget* widget, STRING_PURE String* text);
Int32 TextGroupWidget_UsedHeight(struct TextGroupWidget* widget);
void TextGroupWidget_GetSelected(struct TextGroupWidget* widget, STRING_TRANSIENT String* text, Int32 mouseX, Int32 mouseY);
void TextGroupWidget_GetText(struct TextGroupWidget* widget, Int32 index, STRING_TRANSIENT String* text);
void TextGroupWidget_SetText(struct TextGroupWidget* widget, Int32 index, STRING_PURE String* text);
void TextGroupWidget_Create(struct TextGroupWidget* w, Int32 linesCount, struct FontDesc* font, struct FontDesc* underlineFont, STRING_REF struct Texture* textures, STRING_REF char* buffer);
void TextGroupWidget_SetUsePlaceHolder(struct TextGroupWidget* w, Int32 index, bool placeHolder);
void TextGroupWidget_PushUpAndReplaceLast(struct TextGroupWidget* w, STRING_PURE String* text);
Int32 TextGroupWidget_UsedHeight(struct TextGroupWidget* w);
void TextGroupWidget_GetSelected(struct TextGroupWidget* w, STRING_TRANSIENT String* text, Int32 mouseX, Int32 mouseY);
void TextGroupWidget_GetText(struct TextGroupWidget* w, Int32 index, STRING_TRANSIENT String* text);
void TextGroupWidget_SetText(struct TextGroupWidget* w, Int32 index, STRING_PURE String* text);
struct PlayerListWidget {
@ -189,8 +192,8 @@ struct PlayerListWidget {
UInt16 IDs[TABLIST_MAX_NAMES * 2];
struct Texture Textures[TABLIST_MAX_NAMES * 2];
};
void PlayerListWidget_Create(struct PlayerListWidget* widget, struct FontDesc* font, bool classic);
void PlayerListWidget_GetNameUnder(struct PlayerListWidget* widget, Int32 mouseX, Int32 mouseY, STRING_TRANSIENT String* name);
void PlayerListWidget_Create(struct PlayerListWidget* w, struct FontDesc* font, bool classic);
void PlayerListWidget_GetNameUnder(struct PlayerListWidget* w, Int32 mouseX, Int32 mouseY, STRING_TRANSIENT String* name);
typedef void (*SpecialInputAppendFunc)(void* userData, char c);
@ -212,7 +215,7 @@ struct SpecialInputWidget {
char __ColBuffer[DRAWER2D_MAX_COLS * 4];
};
void SpecialInputWidget_Create(struct SpecialInputWidget* widget, struct FontDesc* font, struct InputWidget* appendObj);
void SpecialInputWidget_UpdateCols(struct SpecialInputWidget* widget);
void SpecialInputWidget_SetActive(struct SpecialInputWidget* widget, bool active);
void SpecialInputWidget_Create(struct SpecialInputWidget* w, struct FontDesc* font, struct InputWidget* appendObj);
void SpecialInputWidget_UpdateCols(struct SpecialInputWidget* w);
void SpecialInputWidget_SetActive(struct SpecialInputWidget* w, bool active);
#endif