ALib C++ Framework
by
Library Version: 2511 R0
Documentation generated by doxygen
Loading...
Searching...
No Matches
app.cpp
1//##################################################################################################
2// ALib C++ Framework
3//
4// Copyright 2013-2025 A-Worx GmbH, Germany
5// Published under 'Boost Software License' (a free software license, see LICENSE.txt)
6//##################################################################################################
7#include "alib_precompile.hpp"
8#if !defined(ALIB_C20_MODULES) || ((ALIB_C20_MODULES != 0) && (ALIB_C20_MODULES != 1))
9# error "Configuration MACRO ALIB_C20_MODULES has to be given to the compiler as either 0 or 1"
10#endif
11#if ALIB_C20_MODULES
12 module;
13#endif
14
15//========================================= Global Fragment ========================================
19//============================================== Module ============================================
20#if ALIB_C20_MODULES
21 module ALib.App;
22 import ALib.App.Impl;
23 import ALib.Lang;
24 import ALib.Strings;
25 import ALib.Boxing;
26 import ALib.EnumRecords;
27 import ALib.EnumRecords.Bootstrap;
28 import ALib.Variables;
29#else
30# include "ALib.App.H"
31# include "ALib.Camp.Base.H"
32# include "ALib.Bootstrap.H"
33# include "ALib.ALox.Impl.H"
34# include "ALib.Resources.H"
35#endif
36//========================================== Implementation ========================================
37
38namespace alib::app {
39
41
42
44: appCamp(camp) {
45 stopWatch.Reset();
46
48 "A second instance of the App-singleton was created, which is forbidden.")
49 APP_SINGLETON= this;
50
51 machine.Program.reserve( size_t(States::CNTD_BUILTIN_STATES) + 10 );
52
53 machine.Program.insert( machine.Program.end(), {
54 { States::SetCamps , &App::onBsSetCamps },
55 { States::PrepareResources , &App::onBsPrepareResources },
56 { States::SetNameVersionAndInfo , &App::onBsSetNameVersionAndInfo },
57 { States::PrepareConfig , &App::onBsPrepareConfig },
58 { States::PreloadVariables , &App::onBsPreloadVariables },
59 { States::ImportConfig , &App::onBsImportConfig },
60 { States::FinalizeBootstrap , &App::onBsFinalizeBootstrap },
61 { States::SetupALox , &App::onBsSetupALox },
62 { States::RunStart , &App::onRunStart },
63 { States::Run , &App::onRun },
64 { States::RunEnd , &App::onRunEnd },
65 { States::AnnounceShutdown , &App::onSdAnnounceShutdown },
66 { States::CleanALox , &App::onSdCleanALox },
67 { States::ExportConfig , &App::onSdExportConfig },
68 { States::Output , &App::onSdOutput },
69 { States::FinalizeShutdown , &App::onSdFinalizeShutdown },
70 });
71}
72
74
75int App::Main( int argc, const char** argv, const wchar_t** argvw ) {
76 ARG_C= argc;
77 ARG_VN= argv;
78 ARG_VW= argvw;
79
80 for (StateMachine::Command& cmd : machine.Program )
81 try {
82 // transition the state machine "State"
83 machine.State= cmd.State;
84
85 // built-in step?
86 if ( cmd.State.IsEnumType<App::States>() ) {
87 // transition the state machine "BuiltInState"
88 machine.BuiltInState= cmd.State.Get<States>();
89 (this->*cmd.Method.BuiltIn)();
90 } else {
91 (*cmd.Method.Custom)(*this);
92 }
93
94 // with emergencies, we stop processing
95 if ( machine.EmergencyStop )
96 break;
97
98 // exceptions are converted to exit codes and displayed. A custom conversion implementation
99 // may take the current app-state into account to determine the right exit code.
100 } catch( Exception& e ) {
102 ALIB_ASSERT_ERROR(machine.BuiltInState == States::Run, "APP",
103 "Exceptions::ControlledEarlyExit thrown while not in States::Run")
104 ALIB_ASSERT_ERROR(machine.GetExitCode().Integral() != 0, "APP",
105 "Exceptions::ControlledEarlyExit thrown without having exit code set")
106 }
107 else
108 machine.SetExitCode( exceptionToExitCode(e) );
109 exceptionDisplay(e, cErr->Buffer);
110 }
111
112 // System exceptions should be handled by the descendant.
113 catch( std::runtime_error& e ) {
114 cErr->Add("Unhandled system exception: ", e.what());
116 #if ALIB_DEBUG
117 onSdOutput();
118 ALIB_WARNING("APP", "System exception not handled. "
119 "This should be done by the user of class ALib App.")
120 #endif
121 }
122
123 if (machine.EmergencyStop) {
124 // finish bootstrapping of ALib, to be able to duly shutdown.
125 if ( machine.BuiltInState < States::FinalizeBootstrap )
126 Bootstrap();
127
128 // shutdown ALib
129 if ( machine.BuiltInState < States::FinalizeShutdown)
130 Shutdown();
131 }
132
133 return machine.GetExitCode().Integral<int>();
134}
135
136
137//##################################################################################################
138// Helpers
139//##################################################################################################
140
142
143 // Exceptions from ALib module Variables -> either read or write of INI-files failed.
145 auto element= e.Type().Get<variables::Exceptions>();
146
147 if ( machine.BuiltInState==States::ImportConfig
150
151 if ( machine.BuiltInState==States::ImportConfig
154 }
155
157}
158
159void App::exceptionDisplay( alib::Exception& exception, AString& target ) {
160 if (exception.Type()== Exceptions::ControlledEarlyExit) {
161 #if ALIB_DEBUG
162 alib::assert::Raise( exception.Back().CI, 1, "APP",
163 "<- Exceptions::ControlledEarlyExit was trown here!" );
164 machine.DbgDumpFurtherExitCodes(target);
165 #endif
166 return;
167 }
168
169 // print unhandled exceptions
170 String512 cmdLine(ProcessInfo::Current().ExecFileName);
171 for( int i= 0; i < alib::ARG_C ; ++i )
172 cmdLine << ' ' << alib::ARG_VN[i];
174 cErr->Add( "Exception occurred when executing command:\n"
175 " {}\n"
176 "Exception details ({} item{}):",
177 cmdLine, exception.Size(), (exception.Size() > 1 ? "s" : "") )
178 .PushIndent(" ")
179 .Add( exception.Format() )
180 .PopIndent();
181
182 #if ALIB_DEBUG
183 cErr->Add( "Application exit-code will be: ", machine.GetExitCode() );
184 #endif
185
186 machine.DbgDumpFurtherExitCodes(target);
187}
188
190 LocalAllocator2K cfgFilePathAllocator;
191 StdVectorMA<ConfigFileDescriptor> files(cfgFilePathAllocator);
193
194 if ( !files.size() ) {
195 p.Add("None");
196 return;
197 }
198
199 for (ConfigFileDescriptor& fileInfo : files) {
200 p.Add( "Configuration file: {!ATab}:1\n", fileInfo.Pathname );
201 p.Add( " Existed: {!ATab}\n", fileInfo.WasEmpty ? "no" : "yes" );
202
203 if ( fileInfo.Exports.IsNotEmpty() ) {
204 Tokenizer tok(fileInfo.Exports, ',');
205 while ( tok.HasNext() )
206 p.Add(" Exports: {!ATab}\n" , tok.Next() );
207} } }
208
209
211 size_t cnt= 0;
212
213 // read file-names from resource, only if not set, yet.
214 if ( !files.size() )
215 for (;;) {
216 String128 resourceName("CFGF_NAME_"); resourceName << (cnt+1);
217 String name= appCamp->TryResource( resourceName );
218 if (name.IsEmpty())
219 break;
220 files.emplace_back();
221 files.at(cnt).Pathname= name;
222 ++cnt;
223 }
224
225 // read comments from resources
226 cnt= 0;
227 for (ConfigFileDescriptor& fInfo : files ) {
228 if ( fInfo.Comment.IsEmpty() ) {
229 String128 resourceName("CFGF_CMT_"); resourceName << (cnt+1);
230 fInfo.Comment= appCamp->TryResource( resourceName );
231 }
232 ++cnt;
233 }
234
235 // read exports
236 cnt= 0;
237 for (ConfigFileDescriptor& fInfo : files ) {
238 String128 resourceName("CFGF_EXP_"); resourceName << (cnt+1);
239 fInfo.Exports= appCamp->TryResource( resourceName );
240 ++cnt;
241 }
242
243 // read additional exports: if more export values in resources exists than,
244 // the number of created config-files, the last ones are added to the last file.
245 String1K additionalExports;
246 for (;;) {
247 String128 resourceName("CFGF_EXP_"); resourceName << (cnt+1);
248 String exports= appCamp->TryResource( resourceName );
249 if (exports.IsNull() )
250 break;
251 additionalExports << ',' << exports;
252 ++cnt;
253 }
254
255 if ( additionalExports.IsNotEmpty() ) {
256 ALIB_ASSERT_ERROR(!files.empty(), "APP",
257 "Config-exports {!Q} found, but no config-file is created by the application",
258 additionalExports)
259 ConfigFileDescriptor& last= files.back();
260 if ( last.Exports.IsNotEmpty() ) additionalExports.InsertAt(last.Exports, 0);
261 else additionalExports.DeleteStart(1);
262
263 last.Exports.Allocate(files.get_allocator().GetAllocator(), additionalExports );
264
265 }
266
267 return;
268}
269
271 for (ConfigFileDescriptor& fileInfo : files) {
272 if (fileInfo.Pathname.IsEmpty() || fileInfo.Pathname.IsAbsolute())
273 continue;
274
275 Path backup(fileInfo.Pathname);
276 if (fileInfo.Pathname.CharAtStart() == '.') // some relative adressing
277 fileInfo.Pathname.Change( SystemFolders::Current, backup );
278 else
279 fileInfo.Pathname.Change( SystemFolders::HomeConfig, backup );
280} }
281
283 getConfigFilePathsFromResources (files); if (machine.EmergencyStop) return;
284 getConfigFilePathsMakeAbsolutePaths(files); if (machine.EmergencyStop) return;
285 while (files.size() && files.back().Pathname.IsEmpty())
286 files.pop_back();
287}
288
289
291 if ( CAMPS.empty() )
293
294 if ( appCamp )
295 CAMPS.push_back(appCamp);
296 else
297 appCamp= CAMPS.back();
298}
299
301 #if ALIB_DEBUG_RESOURCES
303 #endif
304
306
309
310 if( cOut->LineWidth == 0) {
311 cOut->LineWidth=
312 cErr->LineWidth= Console::GetWidth(false, 120);
313 }
314}
315
317 // get app name (if not set)
318 if (appName.IsEmpty())
319 appName= appCamp->TryResource( "AppName" );
320
321 if (appVersion.IsEmpty())
322 appVersion= appCamp->TryResource( "AppVersion" );
323
324 if (appInfo.IsEmpty()) {
325 String infoFmtString= appCamp->TryResource("AppInfo");
326 if ( infoFmtString.IsNotEmpty() ) {
327 StringLengthResetter resetter(cOut->Buffer);
328 cOut->AddMarked(infoFmtString, appName, appVersion, CalendarDateTime(DateTime()).Year);
329 appInfo= String(monomem::GLOBAL_ALLOCATOR, cOut->Buffer.Substring(resetter.OriginalLength()));
330 } }
331}
332
334
335void App::onBsPreloadVariables() { appCamp->GetConfig()->PreloadVariables<lox::Variables>(); }
336
338 LocalAllocator2K cfgFilePathAllocator;
339 StdVectorMA<ConfigFileDescriptor> files(cfgFilePathAllocator);
341
342 // loop over cfg files (if opening fails, nothing is imported)
343 for ( size_t fileNo= 0; fileNo < files.size() ; ++fileNo ) {
344 ConfigFileDescriptor& fileInfo= files.at(fileNo);
345 if (fileInfo.Pathname.IsEmpty())
346 continue;
347
348 // import variables
349 IniFileFeeder iniFileFeeder(*appCamp->GetConfig());
350 try { iniFileFeeder.ImportStart( fileInfo.Pathname ); }
351 catch (Exception& e) {
353 throw e;
354 fileInfo.WasEmpty= true;
355 continue;
356 }
357 iniFileFeeder.ImportAll();
358 iniFileFeeder.ImportEnd();
359} }
360
362
363
366 "DEBUG_LOGGER already created. Obviously logging was used "
367 "prior to the invocation of bs30SetupALox. This can cause issues" )
368
369 // Create release lox
370 if ( HasBits(flags, Flags::CreateReleaseLox ) ) {
374 Lox_SetVerbosity( releaseLogger, Verbosity::Info , "/" )
375
376 // Set the debug-lox to our release lox
381 } }
382
383 // todo: create text-file logger
384
385}
386
387//==================================================================================================
388// Shutdown
389//==================================================================================================
391
392
394 #if ALOX_DBG_LOG
396 Log_GetLogger( pacl, "DEBUG_LOGGER" )
397 if (pacl)
398 pacl->SetVerbosityExport(&LOG_LOX, true );
399 }
400 #endif
401
402 // set ExportAll and writeback with ALox verbosity-variables which were not in the
403 // INI-file before. We do this regardless if there is a INI-file or not. It might benefit
404 // for custom configurations systems likewise.
406 && releaseLogger ) {
407 releaseLogger->SetVerbosityExport(releaseLox, true );
409 Log_Prune( Log::DEBUG_LOGGER= nullptr; )
412 Lox_Prune(delete releaseLogger );
413
414} }
415
417 LocalAllocator2K cfgFilePathAllocator;
418 StdVectorMA<ConfigFileDescriptor> files(cfgFilePathAllocator);
420
421 // loop over two (possible) files
422 for ( ConfigFileDescriptor& fileInfo : files ) {
423 if (fileInfo.Pathname.IsEmpty())
424 continue;
425
426 // Open INI-file
427 IniFileFeeder iniFileFeeder(*appCamp->GetConfig());
428 iniFileFeeder.ExportStart( fileInfo.Pathname );
429
430 // export variables that are not existing in the INI-file yet
431 int cntChanges= 0;
432 Tokenizer tknzr(fileInfo.Exports, ',');
433 while (tknzr.HasNext()) {
434 auto& tok= tknzr.Next(); // for root, just the direct children
435 int changes= iniFileFeeder.ExportSubTree( tok, tok.Equals("/") );
436 if ( changes > 0)
437 cntChanges+= changes;
438 }
439
440 auto& iniFile= iniFileFeeder.GetIniFile();
441 // If INI-file was empty, set comment
442 if( iniFileFeeder.DidNotExistOrWasEmpty
443 && fileInfo.Comment.IsNotEmpty() ) {
444 String4K buf;
445 Paragraphs p(buf);
446 p.LineWidth= iniFileFeeder.LineWidth;
447 p.AddMarked( fileInfo.Comment )
448 .RemoveLastNewLine();
449 iniFile.FileComments.Allocate(iniFile.Allocator, buf);
450 cntChanges++;
451 }
452
453 // add section comments (if not existing)
454 cntChanges+= iniFileFeeder.AddResourcedSectionComments(BASECAMP , "CFG_SECT_CMT_" );
455 cntChanges+= iniFileFeeder.AddResourcedSectionComments(ALOX , "CFG_SECT_CMT_" );
456 cntChanges+= iniFileFeeder.AddResourcedSectionComments(*appCamp , "CFG_SECT_CMT_" );
457
458 // write INI-file, if changed.
459 if( cntChanges > 0 ) iniFileFeeder.ExportEnd( fileInfo.Pathname );
460 else iniFileFeeder.ExportEnd();
461
462 } // loop over 2 files
463}
464
466 machine.DbgDumpFurtherExitCodes(cOut->Buffer);
467 if ( cOut->Buffer.IsNotEmpty() ) {
468 std::cout << cOut->Buffer;
469 if (!cOut->Buffer.EndsWith(NEW_LINE))
470 std::cout << std::endl;
471 cOut->Buffer.Reset();
472 }
473 std::cout.flush();
474
475 if ( cErr->Buffer.IsNotEmpty() ) {
476 std::cerr << cErr->Buffer;
477 if (!cErr->Buffer.EndsWith(NEW_LINE))
478 std::cerr << std::endl;
479 cErr->Buffer.Reset();
480 }
481 std::cerr.flush();
482}
484 // Check that no code used debug logging
486 || Log::DEBUG_LOGGER == nullptr, "APP",
487 "Debug logging used somewhere, although the flag UseReleaseLoggerForDebugLogging is set." )
488
489
490 // Dump resources
491 #if ALIB_DEBUG_RESOURCES
492 std::cout << std::endl;
493 std::cout << "---------------- Resource Pool Dump ----------------" << std::endl;
494 auto resourceList= mainCamp->GetResourcePool().DbgGetList();
495 std::cout << resources::DbgDump( resourceList ) << std::endl;
496 std::cout << "---------------- Resource Pool Dump (end) ----------" << std::endl;
497 #endif
498
499 // Dump Boxing Info
500 #if ALIB_DEBUG_BOXING
501 std::cout << std::endl;
502 std::cout << "---------------- Debug Boxing ----------------" << std::endl;
503 std::cout << alib::boxing::debug::DumpVTables(false);
505 std::cout << alib::boxing::debug::DumpAll();
506 std::cout << "---------------- Debug Boxing (end) ----------" << std::endl;
507 #endif
508
509 if (cOut) cOut->~Paragraphs();
510 if (cErr) cErr->~Paragraphs();
511
512 // finalize ALib shutdown
514}
515
516
517
518} // namespace [alib::app]
#define ALIB_WARNING(domain,...)
Definition alib.inl:1141
#define ALIB_LOCK_RECURSIVE_WITH(lock)
Definition alib.inl:1414
#define ALIB_ASSERT_ERROR(cond, domain,...)
Definition alib.inl:1144
#define Log_GetLogger(identifier, name)
#define Lox_RemoveLogger(logger)
#define Lox_Prune(...)
#define Lox_SetVerbosity(...)
#define LOG_LOX
#define Log_Prune(...)
virtual void onBsImportConfig()
Definition app.cpp:337
virtual void onBsPreloadVariables()
Definition app.cpp:335
virtual void onBsSetNameVersionAndInfo()
Definition app.cpp:316
camp::Camp * appCamp
Definition app.inl:379
@ FinalizeBootstrap
Invokes the virtual method onBsFinalizeBootstrap.
Definition app.inl:126
@ FinalizeShutdown
Invokes the virtual method onSdFinalizeShutdown.
Definition app.inl:141
@ Run
Invokes the virtual method onRun.
Definition app.inl:132
@ ImportConfig
Invokes the virtual method onBsImportConfig.
Definition app.inl:122
virtual void onSdFinalizeShutdown()
Definition app.cpp:483
String appName
Definition app.inl:384
String appVersion
Definition app.inl:389
virtual void onBsSetCamps()
Definition app.cpp:290
String releaseLoggerName
Definition app.inl:416
StateMachine machine
The state-machine singleton.
Definition app.inl:371
virtual int Main(int argc, const char **argv, const wchar_t **argvw=nullptr)
Definition app.cpp:75
Paragraphs * cOut
Definition app.inl:401
String appInfo
Definition app.inl:394
String releaseLoxName
Definition app.inl:411
virtual void onSdOutput()
Definition app.cpp:465
virtual void getConfigFilePathsFromResources(StdVectorMA< ConfigFileDescriptor > &files)
Definition app.cpp:210
virtual void onBsPrepareConfig()
Definition app.cpp:333
virtual ~App()
Virtual destructor.
Definition app.cpp:73
virtual Enum exceptionToExitCode(alib::Exception &exception)
Definition app.cpp:141
@ UseReleaseLoggerForDebugLogging
Definition app.inl:70
@ ALoxVerbosityExportAllAndWriteBackDbgLogger
Definition app.inl:80
@ ALoxVerbosityExportAllAndWriteBackRelLogger
Definition app.inl:75
virtual void onSdCleanALox()
Definition app.cpp:393
virtual void onBsPrepareResources()
Definition app.cpp:300
virtual void printConfigFileInfo(Paragraphs &target)
Definition app.cpp:189
lox::Lox * releaseLox
Definition app.inl:420
virtual void exceptionDisplay(Exception &exception, AString &target)
Definition app.cpp:159
App(camp::Camp *appCamp)
Definition app.cpp:43
virtual void onBsSetupALox()
Definition app.cpp:364
Flags flags
Various boolean flags used to configure the application.
Definition app.inl:427
virtual void onSdAnnounceShutdown()
Definition app.cpp:390
virtual void getConfigFilePaths(StdVectorMA< ConfigFileDescriptor > &files)
Definition app.cpp:282
virtual void getConfigFilePathsMakeAbsolutePaths(StdVectorMA< ConfigFileDescriptor > &files)
Definition app.cpp:270
lox::textlogger::TextLogger * releaseLogger
Definition app.inl:424
StopWatch stopWatch
Definition app.inl:375
@ ErrUnknown
An unknown exception occurred.
Definition app.inl:52
@ ErrConfigFileNotWritable
The configuration file(s) could not be written.
Definition app.inl:51
virtual void onBsFinalizeBootstrap()
Definition app.cpp:361
Paragraphs * cErr
Same as cOut, but used for stream std::err.
Definition app.inl:404
virtual void onSdExportConfig()
Definition app.cpp:416
AString & Format(AString &target) const
const Enum & Type() const
static threads::RecursiveLock DEFAULT_LOCK
void Add(boxing::TBoxes< TAllocatorArgs > &args)
void AddMarked(boxing::TBoxes< TAllocatorArgs > &args)
integer LineWidth
Used as parameter lineWidth of static method invocations.
static textlogger::TextLogger * DEBUG_LOGGER
The debug logger created by AddDebugLogger.
Definition log.inl:40
static void SetALibAssertionPlugin(Lox *lox)
Definition alox.cpp:314
static textlogger::TextLogger * CreateConsoleLogger(const NString &name=nullptr)
Definition alox.cpp:146
static std::ostream * DbgResourceLoadObserver
TAString & InsertAt(const TString< TChar > &src, integer pos)
TAString & DeleteStart(integer regionLength)
constexpr bool IsEmpty() const
Definition string.inl:353
void Allocate(TAllocator &allocator, const TString< TChar > &copy)
Definition string.inl:1734
constexpr bool IsNotEmpty() const
Definition string.inl:357
TSubstring< TChar > & Next(lang::Whitespaces trimming=lang::Whitespaces::Trim, TChar newDelim='\0')
Definition tokenizer.cpp:26
static int GetWidth(bool forceRedetect=false, int defaultWidth=80)
Definition console.cpp:43
static const ProcessInfo & Current()
void ExportEnd()
Closes and deletes the internal iniFile instance without writing an opened INI-file.
int AddResourcedSectionComments(ResourcePool &resourcePool, const NString &resourceCategory, const NString &resourceNamePrefix)
int ExportSubTree(Configuration::Cursor cursor, bool directChildrenOnly=false)
int ImportStart(const system::Path &path)
void ImportEnd()
Closes and deletes the internal iniFile instance.
int ExportStart(const system::Path &path)
App * APP_SINGLETON
Definition app.cpp:40
void Raise(const lang::CallerInfo &ci, int type, std::string_view domain, TArgs &&... args)
Definition assert.inl:181
std::vector< std::pair< const std::type_info *, uinteger > > GetKnownFunctionTypes()
Definition vtable.cpp:180
AString DumpFunctions(const std::vector< std::pair< const std::type_info *, uinteger > > &input, const String &headline, const String &indent)
AString DumpVTables(bool staticVtables, bool includeFunctions)
Lox * DEBUG_LOX
RecursiveLock GLOBAL_ALLOCATOR_LOCK
TMonoAllocator< lang::HeapAllocator > GLOBAL_ALLOCATOR
AString DbgDump(std::vector< std::tuple< NString, NString, String, integer > > &list, const NString &catFilter, const String &format)
@ ErrorWritingFile
An error occurred writing the file .
Definition inifile.inl:385
@ ErrorOpeningFile
File not found when reading.
Definition inifile.inl:382
ListMA< camp::Camp * > CAMPS
void BootstrapAddDefaultCamps()
void Bootstrap(BootstrapPhases targetPhase, camp::Camp *targetCamp, int alibVersion, int alibRevision, TCompilationFlags compilationFlags)
strings::util::TTokenizer< character > Tokenizer
Type alias in namespace alib.
constexpr CString NEW_LINE
A zero-terminated string containing the new-line character sequence.
Definition cstring.inl:540
lox::ALoxCamp ALOX
The singleton instance of ALib Camp class #"ALoxCamp".
Definition aloxcamp.cpp:54
const wchar_t ** ARG_VW
Definition mainargs.cpp:25
monomem::TLocalAllocator< 2 > LocalAllocator2K
Type alias in namespace alib. Allocates 2kB of stack memory.
LocalString< 4096 > String4K
Type alias name for #"TLocalString;TLocalString<character,4096>".
strings::TString< character > String
Type alias in namespace alib.
Definition string.inl:2172
system::Path Path
Type alias in namespace alib.
Definition path.inl:375
camp::Basecamp BASECAMP
The singleton instance of ALib Camp class #"Basecamp".
Definition basecamp.cpp:80
LocalString< 1024 > String1K
Type alias name for #"TLocalString;TLocalString<character,1024>".
exceptions::Exception Exception
Type alias in namespace alib.
strings::util::CalendarDateTime CalendarDateTime
Type alias in namespace alib.
Definition calendar.inl:512
void Shutdown()
LocalString< 128 > String128
Type alias name for #"TLocalString;TLocalString<character,128>".
strings::TAString< character, lang::HeapAllocator > AString
Type alias in namespace alib.
format::Paragraphs Paragraphs
Type alias in namespace alib.
int ARG_C
Definition mainargs.cpp:23
std::vector< T, StdMA< T > > StdVectorMA
Type alias in namespace alib.
strings::TStringLengthResetter< character,lang::HeapAllocator > StringLengthResetter
Type alias in namespace alib.
const char ** ARG_VN
Definition mainargs.cpp:24
time::DateTime DateTime
Type alias in namespace alib.
Definition datetime.inl:185
boxing::Enum Enum
Type alias in namespace alib.
Definition enum.inl:211
LocalString< 512 > String512
Type alias name for #"TLocalString;TLocalString<character,512>".
variables::IniFileFeeder IniFileFeeder
Type alias in namespace alib.
Path Pathname
The resolved full path to the file.
Definition app.inl:349
bool WasEmpty
If set, the file did not exist or was empty at the start of the application.
Definition app.inl:362
A struct denoting the next state and the corresponding method to execute.
Definition app.inl:155
bool IsEnumType() const
Definition enum.inl:142
TEnum Get() const
Definition enum.inl:75
CallerInfo CI
The source code location that this message relates to.
Definition message.inl:25
void(* Custom)(App &)
A pointer to a method of a custom derived type.
Definition app.inl:163
void(App::* BuiltIn)()
A pointer to a virtual method of class App.
Definition app.inl:160