ALib C++ Library
Library Version: 2510 R0
Documentation generated by doxygen
Loading...
Searching...
No Matches
vmeta.cpp
1// #################################################################################################
2// ALib C++ Library
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 "Symbol 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// ====================================== Global Fragment ======================================
16#include "ALib.Strings.Vector.H"
17// =========================================== Module ==========================================
18#if ALIB_C20_MODULES
19 module ALib.Variables;
21#else
23# include "ALib.Variables.H"
24#endif
25// ====================================== Implementation =======================================
26
27namespace alib::variables {
28DOX_MARKER([DOX_ENUMS_RECORD_PARSER])
30{
31 enumrecords::bootstrap::EnumRecordParser::Get( ERSerializable::EnumElementName ); // field from parent class
32 ERSerializable::MinimumRecognitionLength= 0; // omit reading, but fix to zero
34}
35DOX_MARKER([DOX_ENUMS_RECORD_PARSER])
36}
37
38#if !DOXYGEN
40
41void VMeta_Bool ::imPort(VDATA* data, Configuration& cfg, const StringEscaper& , const String& src ) { auto result= cfg.ParseBooleanToken(src); data->As<Bool>()= result.first; data->As<Bool>().TokenIndex= result.second; }
42void VMeta_integer ::imPort(VDATA* data, Configuration& cfg, const StringEscaper& , const String& src ) { data->As<integer>()= integer(Substring(src).TrimStart().ParseInt (0, &cfg.NumberFormat)); }
43void VMeta_float ::imPort(VDATA* data, Configuration& cfg, const StringEscaper& , const String& src ) { data->As<double >()= Substring(src).TrimStart().ParseFloat(0, &cfg.NumberFormat) ; }
44void VMeta_String ::imPort(VDATA* data, Configuration& , const StringEscaper& esc, const String& src ) { String2K buf; esc.Unescape(src, buf); data->As<AStringPA>().Reset(buf); }
45
46void VMeta_Bool ::exPort(VDATA* data, Configuration& cfg, const StringEscaper& esc, AString& dest) { String64 buf; esc.Escape(cfg.WriteBooleanToken( data->As<Bool>().Value, data->As<Bool>().TokenIndex, buf ), dest, A_CHAR("\0")); }
47void VMeta_integer ::exPort(VDATA* data, Configuration& , const StringEscaper& , AString& dest) { dest << data->As<integer>(); }
48void VMeta_float ::exPort(VDATA* data, Configuration& , const StringEscaper& , AString& dest) { dest << data->As<double >(); }
49void VMeta_String ::exPort(VDATA* data, Configuration& , const StringEscaper& esc, AString& dest) { esc.Escape(data->As<AStringPA>() , dest, A_CHAR("\0")); }
50void VMeta_Box ::exPort(VDATA* data, Configuration& , const StringEscaper& esc, AString& dest) { esc.Escape(String1K() << data->As<Box>(), dest, A_CHAR("\0")); }
51void VMeta_Box ::imPort(VDATA* data, Configuration& , const StringEscaper& esc, const String& src )
52{
53 Substring parser;
54 String2K buf;
55 esc.Unescape(src, buf );
56 parser= buf;
57
58 // try integral
59 {
60 integer val;
61 if(parser.ConsumeInt(val) && parser.Trim().IsEmpty())
62 {
63 data->As<Box>()= val;
64 return;
65 }
66 parser= src;
67 }
68
69 // try float
70 {
71 double val;
72 if(parser.ConsumeFloat(val) && parser.Trim().IsEmpty())
73 {
74 data->As<Box>()= val;
75 return;
76 }
77 parser= src;
78 }
79
80 // we just store the source string
81 data->As<Box>()= src;
82}
83
84namespace {
85void imPortStringVector(VDATA* data, const StringEscaper& esc, const String& src, const String& delimiter )
86{
88 StringVectorMA results(la);
89 esc.UnescapeTokens(results, src, delimiter);
90 auto& dataSA= data->As<StringVectorPA>();
91 dataSA.clear();
92 for( auto& it : results )
93 {
94 Substring value= it;
95 value.ConsumeChar('\r');
96 value.ConsumeChar('\n');
97 value.ConsumeCharFromEnd('\n');
98 value.ConsumeCharFromEnd('\r');
99 dataSA.Add( value );
100 }
101}
102
103void exPortStringVector(VDATA* data, const StringEscaper& esc, AString& dest, const String& delimiter )
104{
105 auto& dataSA= data->As<StringVectorPA>();
106 if( !dataSA.empty())
107 for( auto it= dataSA.begin() ;; )
108 {
109 esc.Escape(*it, dest, delimiter);
110
111 if( ++it == dataSA.end() )
112 break;
113
114 dest << delimiter;
115 dest << NEW_LINE;
116 }
117}
118
119}
120void VMeta_StringVectorComma::imPort(VDATA* data, Configuration& , const StringEscaper& esc, const String& src )
121{
122 imPortStringVector(data, esc, src, A_CHAR(","));
123}
124
125void VMeta_StringVectorComma::exPort(VDATA* data, Configuration& , const StringEscaper& esc, AString& dest)
126{
127 exPortStringVector(data, esc, dest, A_CHAR(","));
128}
129
130void VMeta_StringVectorSemicolon::imPort(VDATA* data, Configuration&, const StringEscaper& esc, const String& src )
131{
132 imPortStringVector(data, esc, src, A_CHAR(";"));
133}
134
135void VMeta_StringVectorSemicolon::exPort(VDATA* data, Configuration&, const StringEscaper& esc, AString& dest)
136{
137 exPortStringVector(data, esc, dest,A_CHAR(";"));
138}
139
140} // namespace [alib::variables]
141#endif // if !DOXYGEN
ALIB_DLL double ParseFloat(integer startIdx=0, TNumberFormat< TChar > *numberFormat=nullptr, integer *newIdx=nullptr) const
TSubstring & TrimStart(const TCString< TChar > &whiteSpaces=CStringConstantsTraits< TChar >::DefaultWhitespaces())
Definition substring.inl:76
ALIB_DLL std::pair< bool, int8_t > ParseBooleanToken(const String &src)
Declaration()=default
Default constructor.
ALIB_DLL void Parse()
Definition vmeta.cpp:29
#define A_CHAR(STR)
VData< void * > VDATA
Definition vmeta.inl:45
strings::util::StringEscaper StringEscaper
Type alias in namespace alib.
Definition escaper.inl:199
strings::TAString< character, lang::HeapAllocator > AString
Type alias in namespace alib.
strings::util::TStringVector< character, MonoAllocator > StringVectorMA
Type alias in namespace alib.
LocalString< 64 > String64
Type alias name for TLocalString<character,64>.
constexpr CString NEW_LINE
A zero-terminated string containing the new-line character sequence.
Definition cstring.inl:644
variables::Configuration Configuration
Type alias in namespace alib.
lang::integer integer
Type alias in namespace alib.
Definition integers.inl:149
strings::util::TStringVector< character, PoolAllocator > StringVectorPA
Type alias in namespace alib.
boxing::Box Box
Type alias in namespace alib.
Definition box.inl:1216
LocalString< 1024 > String1K
Type alias name for TLocalString<character,1024>.
strings::TString< character > String
Type alias in namespace alib.
Definition string.inl:2381
strings::TAString< character, PoolAllocator > AStringPA
Type alias in namespace alib.
LocalString< 2048 > String2K
Type alias name for TLocalString<character,2048>.
monomem::TLocalAllocator< 4 > LocalAllocator4K
Type alias in namespace alib. Allocates 4kB of stack memory.
strings::TSubstring< character > Substring
Type alias in namespace alib.
static ALIB_DLL void Get(String &result, bool isLastField=false)