ALib C++ Library
Library Version: 2511 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;
20 import ALib.EnumRecords.Bootstrap;
21#else
23# include "ALib.Variables.H"
24#endif
25//========================================== Implementation ========================================
26
27namespace alib::variables {
28DOX_MARKER([DOX_ENUMS_RECORD_PARSER])
30 enumrecords::bootstrap::EnumRecordParser::Get( ERSerializable::EnumElementName ); // field from parent class
31 ERSerializable::MinimumRecognitionLength= 0; // omit reading, but fix to zero
33}
34DOX_MARKER([DOX_ENUMS_RECORD_PARSER])
35}
36
37#if !DOXYGEN
39
40void 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; }
41void VMeta_integer ::imPort(VDATA* data, Configuration& cfg, const StringEscaper& , const String& src ) { data->As<integer>()= integer(Substring(src).TrimStart().ParseInt (0, &cfg.NumberFormat)); }
42void VMeta_float ::imPort(VDATA* data, Configuration& cfg, const StringEscaper& , const String& src ) { data->As<double >()= Substring(src).TrimStart().ParseFloat(0, &cfg.NumberFormat) ; }
43void VMeta_String ::imPort(VDATA* data, Configuration& , const StringEscaper& esc, const String& src ) { String2K buf; esc.Unescape(src, buf); data->As<AStringPA>().Reset(buf); }
44
45void 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")); }
46void VMeta_integer ::exPort(VDATA* data, Configuration& , const StringEscaper& , AString& dest) { dest << data->As<integer>(); }
47void VMeta_float ::exPort(VDATA* data, Configuration& , const StringEscaper& , AString& dest) { dest << data->As<double >(); }
48void VMeta_String ::exPort(VDATA* data, Configuration& , const StringEscaper& esc, AString& dest) { esc.Escape(data->As<AStringPA>() , dest, A_CHAR("\0")); }
49void VMeta_Box ::exPort(VDATA* data, Configuration& , const StringEscaper& esc, AString& dest) { esc.Escape(String1K() << data->As<Box>(), dest, A_CHAR("\0")); }
50void VMeta_Box ::imPort(VDATA* data, Configuration& , const StringEscaper& esc, const String& src ) {
51 Substring parser;
52 String2K buf;
53 esc.Unescape(src, buf );
54 parser= buf;
55
56 // try integral
57 {
58 integer val;
59 if(parser.ConsumeInt(val) && parser.Trim().IsEmpty()) {
60 data->As<Box>()= val;
61 return;
62 }
63 parser= src;
64 }
65
66 // try float
67 {
68 double val;
69 if(parser.ConsumeFloat(val) && parser.Trim().IsEmpty()) {
70 data->As<Box>()= val;
71 return;
72 }
73 parser= src;
74 }
75
76 // we just store the source string
77 data->As<Box>()= src;
78}
79
80namespace {
81void imPortStringVector( VDATA* data, const StringEscaper& esc,
82 const String& src , const String& delimiter ) {
84 StringVectorMA results(la);
85 esc.UnescapeTokens(results, src, delimiter);
86 auto& dataSA= data->As<StringVectorPA>();
87 dataSA.clear();
88 for( auto& it : results ) {
89 Substring value= it;
90 value.ConsumeChar('\r');
91 value.ConsumeChar('\n');
92 value.ConsumeCharFromEnd('\n');
93 value.ConsumeCharFromEnd('\r');
94 dataSA.Add( value );
95} }
96
97void exPortStringVector( VDATA* data, const StringEscaper& esc,
98 AString& dest, const String& delimiter ) {
99 auto& dataSA= data->As<StringVectorPA>();
100 if( !dataSA.empty())
101 for( auto it= dataSA.begin() ;; ) {
102 esc.Escape(*it, dest, delimiter);
103
104 if( ++it == dataSA.end() )
105 break;
106
107 dest << delimiter;
108 dest << NEW_LINE;
109} }
110
111}
112void VMeta_StringVectorComma::imPort(VDATA* data, Configuration& , const StringEscaper& esc, const String& src )
113{ imPortStringVector(data, esc, src, A_CHAR(",")); }
114
115void VMeta_StringVectorComma::exPort(VDATA* data, Configuration& , const StringEscaper& esc, AString& dest)
116{ exPortStringVector(data, esc, dest, A_CHAR(",")); }
117
118void VMeta_StringVectorSemicolon::imPort(VDATA* data, Configuration&, const StringEscaper& esc, const String& src )
119{ imPortStringVector(data, esc, src, A_CHAR(";")); }
120
121void VMeta_StringVectorSemicolon::exPort(VDATA* data, Configuration&, const StringEscaper& esc, AString& dest)
122{ exPortStringVector(data, esc, dest,A_CHAR(";")); }
123
124} // namespace [alib::variables]
125#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:70
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:183
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:616
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:1149
LocalString< 1024 > String1K
Type alias name for TLocalString<character,1024>.
strings::TString< character > String
Type alias in namespace alib.
Definition string.inl:2189
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)