Skip to content

Commit 90b5b62

Browse files
committed
lib: lazily initialize model and type registries.
Model and type registries are now lazily initialized on first use, so callers no longer need to remember setup functions before using the public API. Remove the remaining internal consumer calls and move the setup routines into implementation-only helpers, leaving no model/type initialization functions declared on the public classes.
1 parent b0d5acc commit 90b5b62

10 files changed

Lines changed: 80 additions & 31 deletions

File tree

cli/cli.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,6 @@ string lowercase(string value);
3030

3131
int main(int argc, char** argv)
3232
{
33-
TIModels::initTIModelsArray();
34-
TIVarTypes::initTIVarTypesArray();
35-
3633
cxxopts::Options options("tivars_lib_cpp", "A program to interact with TI-z80 calculator files");
3734
options.add_options()
3835
("i,input", "Input file", cxxopts::value<string>())

fuzz/tivars_file_fuzzer.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,6 @@ namespace
4747
std::call_once(initFlag, []()
4848
{
4949
std::setlocale(LC_ALL, ".UTF-8");
50-
tivars::TIModels::initTIModelsArray();
51-
tivars::TIVarTypes::initTIVarTypesArray();
5250
tivars::TypeHandlers::TH_Tokenized::initTokensFromXMLFilePath(TIVARS_TOKENS_XML_PATH);
5351
});
5452
}

quicklook/TIVarsQuickLookSupport.mm

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -693,8 +693,6 @@ void initialize_library()
693693
{
694694
std::call_once(initFlag, []() {
695695
std::setlocale(LC_ALL, ".UTF-8");
696-
tivars::TIModels::initTIModelsArray();
697-
tivars::TIVarTypes::initTIVarTypesArray();
698696
NSString* xmlPath = [NSBundle.mainBundle pathForResource:@"ti-toolkit-8x-tokens" ofType:@"xml"];
699697
if (xmlPath)
700698
{

scripts/api_smoke_tests.sh

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
5+
TMP_DIR="${TMPDIR:-/tmp}/tivars_api_smoke_tests"
6+
mkdir -p "$TMP_DIR"
7+
8+
cat > "$TMP_DIR/api_init_smoke.cpp" <<'CPP'
9+
#include "src/TIModel.h"
10+
#include "src/TIVarFile.h"
11+
#include "src/TIVarType.h"
12+
13+
#include <cassert>
14+
15+
using namespace tivars;
16+
17+
int main()
18+
{
19+
TIVarType realType{"Real"};
20+
TIModel ceModel{"84+CE"};
21+
TIVarFile realFile = TIVarFile::createNew("Real");
22+
23+
assert(realType.getId() == 0x00);
24+
assert(ceModel.getName() == "84+CE");
25+
assert(realFile.getVarEntries()[0]._type.getName() == "Real");
26+
return 0;
27+
}
28+
CPP
29+
30+
COMMON_SOURCES=("$ROOT_DIR"/src/*.cpp "$ROOT_DIR"/src/TypeHandlers/*.cpp "$ROOT_DIR"/vendor/pugixml/pugixml.cpp)
31+
c++ -std=c++2a -DTH_GDB_SUPPORT=1 -I"$ROOT_DIR" -I"$ROOT_DIR/vendor/pugixml" "${COMMON_SOURCES[@]}" "$TMP_DIR/api_init_smoke.cpp" -o "$TMP_DIR/api_init_smoke"
32+
"$TMP_DIR/api_init_smoke"

src/TIModels.cpp

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,11 @@ namespace tivars
1414
{
1515
std::unordered_map<std::string, TIModel> models;
1616
const TIModel unknownModel{};
17+
bool modelsInitialized = false;
1718
}
1819

20+
void init_models();
21+
1922
TIModel TIModels::fromName(const std::string& name)
2023
{
2124
return isValidName(name) ? models[name] : unknownModel;
@@ -32,7 +35,7 @@ namespace tivars
3235
}
3336

3437
// orderID is for the extensions association
35-
void TIModels::insertModel(int orderID, uint32_t flags, const std::string& name, const std::string& sig, uint8_t productId, TIVarFileMinVersionByte minVersion)
38+
void insertModel(int orderID, uint32_t flags, const std::string& name, const std::string& sig, uint8_t productId, TIVarFileMinVersionByte minVersion)
3639
{
3740
const TIModel model(orderID, name, flags, sig, productId, minVersion);
3841

@@ -47,8 +50,22 @@ namespace tivars
4750
models[sig] = model;
4851
}
4952

50-
void TIModels::initTIModelsArray()
53+
void ensure_models_initialized()
54+
{
55+
if (!modelsInitialized)
56+
{
57+
init_models();
58+
}
59+
}
60+
61+
void init_models()
5162
{
63+
if (modelsInitialized)
64+
{
65+
return;
66+
}
67+
modelsInitialized = true;
68+
5269
const uint32_t flags82 = 0 | has82things;
5370
const uint32_t flags83 = flags82 | hasComplex;
5471
const uint32_t flags83p = flags83 | hasFlash | hasApps;
@@ -81,24 +98,26 @@ namespace tivars
8198

8299
const std::unordered_map<std::string, TIModel>& TIModels::all()
83100
{
101+
ensure_models_initialized();
84102
return models;
85103
}
86104

87105
bool TIModels::isValidPID(uint8_t pid)
88106
{
107+
ensure_models_initialized();
89108
return (pid > 0 && models.contains(std::to_string(pid)));
90109
}
91110

92111
bool TIModels::isValidName(const std::string& name)
93112
{
113+
ensure_models_initialized();
94114
return (!name.empty() && models.contains(name));
95115
}
96116

97117
bool TIModels::isValidSignature(const std::string& sig)
98118
{
119+
ensure_models_initialized();
99120
return (!sig.empty() && models.contains(sig));
100121
}
101122

102123
};
103-
104-
// TIModels::initTIModelsArray();

src/TIModels.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,12 @@ namespace tivars
3636
static TIModel fromSignature(const std::string& sig);
3737
static TIModel fromPID(uint8_t pid);
3838

39-
static void initTIModelsArray();
4039
static const std::unordered_map<std::string, TIModel>& all();
4140

4241
static bool isValidPID(uint8_t pid);
4342
static bool isValidName(const std::string& name);
4443
static bool isValidSignature(const std::string& sig);
4544

46-
private:
47-
static void insertModel(int orderID, uint32_t flags, const std::string& name, const std::string& sig, uint8_t productId, TIVarFileMinVersionByte minVersion);
48-
4945
};
5046

5147
}

src/TIVarTypes.cpp

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,15 @@ namespace tivars
1616
{
1717
std::unordered_map<std::string, TIVarType> types;
1818
const TIVarType unknownVarType{};
19+
bool typesInitialized = false;
1920
}
2021

22+
void ensure_types_initialized();
23+
void initTIVarTypesArray();
24+
2125
const std::unordered_map<std::string, TIVarType>& TIVarTypes::all()
2226
{
27+
ensure_types_initialized();
2328
return types;
2429
}
2530

@@ -63,7 +68,7 @@ namespace tivars
6368
&(TypeHandlers::TH_StructuredAppVar::getMinVersionFromData), \
6469
}
6570

66-
void TIVarTypes::insertType(const std::string& name, int id, const std::vector<std::string>& exts, const TypeHandlersTuple& handlers)
71+
void insertType(const std::string& name, int id, const std::vector<std::string>& exts, const TypeHandlersTuple& handlers = { &TypeHandlers::DummyHandler::makeDataFromString, &TypeHandlers::DummyHandler::makeStringFromData, &TypeHandlers::DummyHandler::getMinVersionFromData })
6772
{
6873
const TIVarType varType(id, name, exts, handlers);
6974
types[name] = varType;
@@ -81,11 +86,25 @@ namespace tivars
8186
}
8287
}
8388

89+
void ensure_types_initialized()
90+
{
91+
if (!typesInitialized)
92+
{
93+
initTIVarTypesArray();
94+
}
95+
}
96+
8497
// 82+/83+/84+ are grouped since only the clock is the difference, and it doesn't have an actual varType.
8598
// For number vartypes, Real and Complex are the generic handlers we use, they'll dispatch to specific ones.
86-
void TIVarTypes::initTIVarTypesArray() // order: 82 83 82A 84+T 82+/83+ 84+C 84+CE 83PCE 82AEP
87-
// 84+ 84+CE-T
99+
void initTIVarTypesArray() // order: 82 83 82A 84+T 82+/83+ 84+C 84+CE 83PCE 82AEP
100+
// 84+ 84+CE-T
88101
{
102+
if (typesInitialized)
103+
{
104+
return;
105+
}
106+
typesInitialized = true;
107+
89108
const std::string _;
90109

91110
/* Standard types */
@@ -150,13 +169,13 @@ namespace tivars
150169

151170
bool TIVarTypes::isValidID(uint8_t id)
152171
{
172+
ensure_types_initialized();
153173
return types.contains(std::to_string(id));
154174
}
155175

156176
bool TIVarTypes::isValidName(const std::string& name)
157177
{
178+
ensure_types_initialized();
158179
return (!name.empty() && types.contains(name));
159180
}
160181
}
161-
162-
//TIVarTypes::initTIVarTypesArray();

src/TIVarTypes.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,11 @@ namespace tivars
2121
static TIVarType fromName(const std::string& name);
2222
static TIVarType fromId(uint8_t id);
2323

24-
static void initTIVarTypesArray();
2524
static const std::unordered_map<std::string, TIVarType>& all();
2625

2726
static bool isValidName(const std::string& name);
2827
static bool isValidID(uint8_t id);
2928

30-
private:
31-
static void insertType(const std::string& name, int id, const std::vector<std::string>& exts, const TypeHandlers::TypeHandlersTuple& handlers = { &TypeHandlers::DummyHandler::makeDataFromString, &TypeHandlers::DummyHandler::makeStringFromData, &TypeHandlers::DummyHandler::getMinVersionFromData });
32-
3329
};
3430
}
3531

src/main_emscripten.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,11 @@ extern "C" int EMSCRIPTEN_KEEPALIVE main(int, char**)
2020
{
2121
setlocale(LC_ALL, ".UTF-8");
2222

23-
TIModels::initTIModelsArray();
24-
TIVarTypes::initTIVarTypesArray();
2523
TypeHandlers::TH_Tokenized::initTokens();
2624

2725
puts("tivars_lib ready!");
2826

2927
return 0;
3028
}
3129

32-
#endif
30+
#endif

tests.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -201,10 +201,6 @@ int main(int argc, char** argv)
201201

202202
setlocale(LC_ALL, ".UTF-8");
203203

204-
/* Init Stuff */
205-
206-
TIModels::initTIModelsArray();
207-
TIVarTypes::initTIVarTypesArray();
208204
TH_Tokenized::initTokens();
209205

210206
/* Tests */

0 commit comments

Comments
 (0)