ALib C++ Library
Library Version: 2510 R0
Documentation generated by doxygen
Loading...
Searching...
No Matches
dateandtime.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 ======================================
17
18// =========================================== Module ==========================================
19#if ALIB_C20_MODULES
22 import ALib.Time;
23 import ALib.Strings;
25#else
27# include "ALib.Time.H"
28# include "ALib.Strings.H"
31#endif
32// ====================================== Implementation =======================================
33//! @cond NO_DOX
34
35#define ARG0 (*args)
36#define ARG1 (*(args+1))
37#define INT(box) (box).Unbox<integer >()
38#define FLT(box) (box).Unbox<double >()
39#define DT(box) (box).Unbox<DateTime >()
40#define DUR(box) (box).Unbox<DateTime::Duration>()
41#define FUNC( name,...) Box name( Scope& scope, \
42 ArgIterator args, \
43 ArgIterator end ) \
44 { (void) scope; (void) args; (void) end; __VA_ARGS__ }
45
46#if !ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS
47# define TOINT(arg) arg
48#else
49# define TOINT(arg) integer(arg)
50#endif
51
52namespace alib { namespace expressions { namespace plugins {
53
54
55namespace {
56
57// #################################################################################################
58// ### Reverse generation: convert program constants to expression strings
59// #################################################################################################
60DOX_MARKER([DOX_EXPR_FToLiteral_3])
61void FToLiteral_Duration( const Box& constantValue, AString& expressionString )
62{
63 // Unbox the time span and convert to nanoseconds
64 auto value= constantValue.Unbox<DateTime::Duration>().InNanoseconds();
65
66 // Find the best matching magnitude
67 NString result;
68 if( value == 0 )
69 result= "Milliseconds";
70 else
71 {
72 result= "Nanoseconds";
73
74 if( (value % 1000) == 0 )
75 {
76 value/= 1000;
77 result= "Microseconds";
78 if( (value % 1000) == 0 )
79 {
80 value/= 1000;
81 result= "Milliseconds";
82 if( (value % 1000) == 0 )
83 {
84 value/= 1000;
85 result= "Seconds";
86 if( (value % 60) == 0 )
87 {
88 value/= 60;
89 result= "Minutes";
90 if( (value % 60) == 0 )
91 {
92 value/= 60;
93 result= "Hours";
94 if( (value % 24) == 0 )
95 {
96 value/= 24;
97 result= "Days";
98 }
99 }
100 }
101 }
102 }
103 }
104 }
105
106 // wWite the function argument
107 expressionString << result << '(' << value << ')' ;
108}
109DOX_MARKER([DOX_EXPR_FToLiteral_3])
110
111void FToLiteral_DateTime( const Box& constantValue, AString& expressionString )
112{
113 CalendarDateTime ct( constantValue.Unbox<DateTime>(), lang::Timezone::UTC );
114
115 expressionString << "UTCDateTime( " << ct.Year << ','
116 << ct.Month << ','
117 << ct.Day << ','
118 << ct.Hour << ','
119 << ct.Minute << ','
120 << ct.Second << ','
121 << ct.Millisecond << ')' ;
122}
123
124
125// #################################################################################################
126// ### DateTime
127// #################################################################################################
128FUNC( dateTime , auto qtyArgs= end-args;
129 return CalendarDateTime( int( INT(ARG0) ) , // year
130 ( qtyArgs> 1 ) ? int( INT(*(args+1)) ) : 1, // month
131 ( qtyArgs> 2 ) ? int( INT(*(args+2)) ) : 1, // day
132 ( qtyArgs> 3 ) ? int( INT(*(args+3)) ) : 0, // hour
133 ( qtyArgs> 4 ) ? int( INT(*(args+4)) ) : 0, // minute
134 ( qtyArgs> 5 ) ? int( INT(*(args+5)) ) : 0, // second
135 ( qtyArgs> 6 ) ? int( INT(*(args+6)) ) : 0 // millisecond
136 )
138 )
139
140FUNC( utcDateTime , auto qtyArgs= end-args;
141 return CalendarDateTime( int( INT(ARG0) ) , // year
142 ( qtyArgs> 1 ) ? int( INT(*(args+1)) ) : 1, // month
143 ( qtyArgs> 2 ) ? int( INT(*(args+2)) ) : 1, // day
144 ( qtyArgs> 3 ) ? int( INT(*(args+3)) ) : 0, // hour
145 ( qtyArgs> 4 ) ? int( INT(*(args+4)) ) : 0, // minute
146 ( qtyArgs> 5 ) ? int( INT(*(args+5)) ) : 0, // second
147 ( qtyArgs> 6 ) ? int( INT(*(args+6)) ) : 0 // millisecond
148 )
150 )
151
153 ct.Hour= ct.Minute= ct.Second= ct.Millisecond= 0;
154 return ct.Get(lang::Timezone::Local); )
155FUNC( utcToday , CalendarDateTime ct(DateTime(), lang::Timezone::UTC);
156 ct.Hour= ct.Minute= ct.Second= ct.Millisecond= 0;
157 return ct.Get(lang::Timezone::UTC); )
158FUNC( now , return DateTime(); )
159FUNC( age , return DT(ARG0).Age(); )
160FUNC( isOlderThan , return DT(ARG0).IsOlderThan( DUR(ARG1) ); )
161FUNC( year , return TOINT(CalendarDateTime(DT(ARG0), lang::Timezone::Local).Year ); )
162FUNC( month , return TOINT(CalendarDateTime(DT(ARG0), lang::Timezone::Local).Month ); )
163FUNC( day , return TOINT(CalendarDateTime(DT(ARG0), lang::Timezone::Local).Day ); )
164FUNC( dayOfWeek , return TOINT(CalendarDateTime(DT(ARG0), lang::Timezone::Local).DayOfWeek ); )
165FUNC( hour , return TOINT(CalendarDateTime(DT(ARG0), lang::Timezone::Local).Hour ); )
166FUNC( minute , return TOINT(CalendarDateTime(DT(ARG0), lang::Timezone::Local).Minute ); )
167FUNC( millisecond , return TOINT(CalendarDateTime(DT(ARG0), lang::Timezone::Local).Millisecond); )
168FUNC( utcYear , return TOINT(CalendarDateTime(DT(ARG0), lang::Timezone::UTC ).Year ); )
169FUNC( utcMonth , return TOINT(CalendarDateTime(DT(ARG0), lang::Timezone::UTC ).Month ); )
170FUNC( utcDay , return TOINT(CalendarDateTime(DT(ARG0), lang::Timezone::UTC ).Day ); )
171FUNC( utcDayOfWeek , return TOINT(CalendarDateTime(DT(ARG0), lang::Timezone::UTC ).DayOfWeek ); )
172FUNC( utcHour , return TOINT(CalendarDateTime(DT(ARG0), lang::Timezone::UTC ).Hour ); )
173FUNC( utcMinute , return TOINT(CalendarDateTime(DT(ARG0), lang::Timezone::UTC ).Minute ); )
174FUNC( utcMillisecond , return TOINT(CalendarDateTime(DT(ARG0), lang::Timezone::UTC ).Millisecond); )
175
176
177// #################################################################################################
178// ### Duration
179// #################################################################################################
180
181
182// constructor functions
183FUNC( nanosecondsInt , return DateTime::Duration::FromNanoseconds ( INT(ARG0) ); )
184
185FUNC( microsecondsInt , return DateTime::Duration::FromAbsoluteMicroseconds ( INT(ARG0) ); )
186FUNC( millisecondsInt , return DateTime::Duration::FromAbsoluteMilliseconds ( INT(ARG0) ); )
187FUNC( secondsInt , return DateTime::Duration::FromAbsoluteSeconds ( INT(ARG0) ); )
188FUNC( minutesInt , return DateTime::Duration::FromAbsoluteMinutes ( INT(ARG0) ); )
189FUNC( hoursInt , return DateTime::Duration::FromAbsoluteHours ( INT(ARG0) ); )
190FUNC( daysInt , return DateTime::Duration::FromAbsoluteDays ( INT(ARG0) ); )
191FUNC( weeksInt , return DateTime::Duration::FromAbsoluteDays ( INT(ARG0) * 7 ); )
192FUNC( monthsInt , return DateTime::Duration::FromAbsoluteDays ( INT(ARG0) * 30 ); )
193FUNC( yearsInt , return DateTime::Duration::FromAbsoluteDays ( INT(ARG0) * 365 ); )
194
195FUNC( microsecondsFlt , return DateTime::Duration::FromMicroseconds ( FLT(ARG0) ); )
196FUNC( millisecondsFlt , return DateTime::Duration::FromMilliseconds ( FLT(ARG0) ); )
197FUNC( secondsFlt , return DateTime::Duration::FromSeconds ( FLT(ARG0) ); )
198FUNC( minutesFlt , return DateTime::Duration::FromMinutes ( FLT(ARG0) ); )
199FUNC( hoursFlt , return DateTime::Duration::FromHours ( FLT(ARG0) ); )
200FUNC( daysFlt , return DateTime::Duration::FromDays ( FLT(ARG0) ); )
201FUNC( weeksFlt , return DateTime::Duration::FromDays ( FLT(ARG0) * 7.0 ); )
202FUNC( monthsFlt , return DateTime::Duration::FromDays ( FLT(ARG0) * 30.0 ); )
203FUNC( yearsFlt , return DateTime::Duration::FromDays ( FLT(ARG0) * 365.0 ); )
204
205
206// conversion
207FUNC( inDays , return DUR(ARG0).InDays (); )
208FUNC( inHours , return DUR(ARG0).InHours (); )
209FUNC( inMinutes , return DUR(ARG0).InMinutes (); )
210FUNC( inSeconds , return DUR(ARG0).InSeconds (); )
211FUNC( inMilliseconds , return DUR(ARG0).InMilliseconds(); )
212FUNC( inMicroseconds , return DUR(ARG0).InMicroseconds(); )
213FUNC( inNanoseconds , return DUR(ARG0).InNanoseconds (); )
214FUNC( inHertz , return DUR(ARG0).InHertz(2); )
215
216// binary operators time stamp
217FUNC( add_DTDUR , return DT(ARG0) + DUR(ARG1); )
218FUNC( add_DURDT , return DT(ARG1) + DUR(ARG0); )
219FUNC( sub_DTDUR , return DT(ARG0) - DUR(ARG1); )
220FUNC( sub_DTDT , return DT(ARG0) - DT(ARG1); )
221FUNC( eqDT , return DT(ARG0) == DT(ARG1); )
222FUNC( neqDT , return DT(ARG0) != DT(ARG1); )
223FUNC( gtDT , return DT(ARG0) > DT(ARG1); )
224FUNC( gteqDT , return DT(ARG0) >= DT(ARG1); )
225FUNC( smDT , return DT(ARG0) < DT(ARG1); )
226FUNC( smeqDT , return DT(ARG0) <= DT(ARG1); )
227
228
229// binary operators time span
230FUNC( add_DURDUR , return DUR(ARG0) + DUR(ARG1); )
231FUNC( sub_DURDUR , return DUR(ARG0) - DUR(ARG1); )
232FUNC( mul_DURF , return DUR(ARG0) * FLT(ARG1); )
233FUNC( mul_FDUR , return DUR(ARG1) * FLT(ARG0); )
234FUNC( mul_DURI , return DUR(ARG0) * int64_t( INT(ARG1) ); )
235FUNC( mul_IDUR , return DUR(ARG1) * int64_t( INT(ARG0) ); )
236FUNC( div_DURF , return DUR(ARG0) / FLT(ARG1); )
237FUNC( div_DURI , return DUR(ARG0) / int64_t( INT(ARG1) ); )
238
239FUNC( eqDUR , return DUR(ARG0) == DUR(ARG1); )
240FUNC( neqDUR , return DUR(ARG0) != DUR(ARG1); )
241FUNC( gtDUR , return DUR(ARG0) > DUR(ARG1); )
242FUNC( gteqDUR , return DUR(ARG0) >= DUR(ARG1); )
243FUNC( smDUR , return DUR(ARG0) < DUR(ARG1); )
244FUNC( smeqDUR , return DUR(ARG0) <= DUR(ARG1); )
245
246
247// #################################################################################################
248// ### Duration
249// #################################################################################################
250Calculus::OperatorTableEntry binaryOpTableDateTime[] =
251{
262
271
278};
279
280} // anonymous namespace
281
282
283// #################################################################################################
284// ### DateAndTime - Constructor. Creates the hash map
285// #################################################################################################
287{
288DOX_MARKER([DOX_EXPR_FToLiteral_2])
289// register ToLiteral interface for class DateTime::Duration with boxing
291DOX_MARKER([DOX_EXPR_FToLiteral_2])
293}
294
296: Calculus( "ALib DateAndTime", compiler, CompilePriorities::DateAndTime )
297{
298 // load identifier/function names from resources
299 constexpr int tableSize= 58;
300 Token functionNames[tableSize];
301 strings::util::LoadResourcedTokens( EXPRESSIONS, "CPD", functionNames
302 ALIB_DBG(,tableSize) );
303 Token* descriptor= functionNames;
304
305 // Constant identifiers
306 ConstantIdentifiers=
307 {
308 // January to december
309 { *descriptor++, TOINT(1) }, { *descriptor++, TOINT( 2) }, { *descriptor++, TOINT( 3) }, { *descriptor++, TOINT( 4) },
310 { *descriptor++, TOINT(5) }, { *descriptor++, TOINT( 6) }, { *descriptor++, TOINT( 7) }, { *descriptor++, TOINT( 8) },
311 { *descriptor++, TOINT(9) }, { *descriptor++, TOINT(10) }, { *descriptor++, TOINT(11) }, { *descriptor++, TOINT(12) },
312
313 // Sunday to saturday
314 { *descriptor++, TOINT(0) }, { *descriptor++, TOINT(1) }, { *descriptor++, TOINT(2) }, { *descriptor++, TOINT( 3) },
315 { *descriptor++, TOINT(4) }, { *descriptor++, TOINT(5) }, { *descriptor++, TOINT(6) },
316 };
317
318 // functions
319 Functions=
320 {
321DOX_MARKER([DOX_EXPR_FToLiteral_1])
322 { *descriptor++, CALCULUS_SIGNATURE(Signatures::I ), CALCULUS_CALLBACK(nanosecondsInt ), &Types::Duration , CTI },
323DOX_MARKER([DOX_EXPR_FToLiteral_1])
324 { *descriptor , CALCULUS_SIGNATURE(Signatures::I ), CALCULUS_CALLBACK(microsecondsInt ), &Types::Duration , CTI },
325 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(microsecondsFlt ), &Types::Duration , CTI },
326 { *descriptor , CALCULUS_SIGNATURE(Signatures::I ), CALCULUS_CALLBACK(millisecondsInt ), &Types::Duration , CTI },
327 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(millisecondsFlt ), &Types::Duration , CTI },
328 { *descriptor , CALCULUS_SIGNATURE(Signatures::I ), CALCULUS_CALLBACK(secondsInt ), &Types::Duration , CTI },
329 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(secondsFlt ), &Types::Duration , CTI },
330 { *descriptor , CALCULUS_SIGNATURE(Signatures::I ), CALCULUS_CALLBACK(minutesInt ), &Types::Duration , CTI },
331 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(minutesFlt ), &Types::Duration , CTI },
332 { *descriptor , CALCULUS_SIGNATURE(Signatures::I ), CALCULUS_CALLBACK(hoursInt ), &Types::Duration , CTI },
333 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(hoursFlt ), &Types::Duration , CTI },
334 { *descriptor , CALCULUS_SIGNATURE(Signatures::I ), CALCULUS_CALLBACK(daysInt ), &Types::Duration , CTI },
335 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(daysFlt ), &Types::Duration , CTI },
336 { *descriptor , CALCULUS_SIGNATURE(Signatures::I ), CALCULUS_CALLBACK(weeksInt ), &Types::Duration , CTI },
337 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(weeksFlt ), &Types::Duration , CTI },
338 { *descriptor , CALCULUS_SIGNATURE(Signatures::I ), CALCULUS_CALLBACK(monthsInt ), &Types::Duration , CTI },
339 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(monthsFlt ), &Types::Duration , CTI },
340 { *descriptor , CALCULUS_SIGNATURE(Signatures::I ), CALCULUS_CALLBACK(yearsInt ), &Types::Duration , CTI },
341 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(yearsFlt ), &Types::Duration , CTI },
342
343 { *descriptor++, CALCULUS_SIGNATURE(Signatures::Dur ), CALCULUS_CALLBACK(inDays ), &Types::Float , CTI },
344 { *descriptor++, CALCULUS_SIGNATURE(Signatures::Dur ), CALCULUS_CALLBACK(inHours ), &Types::Float , CTI },
345 { *descriptor++, CALCULUS_SIGNATURE(Signatures::Dur ), CALCULUS_CALLBACK(inMinutes ), &Types::Float , CTI },
346 { *descriptor++, CALCULUS_SIGNATURE(Signatures::Dur ), CALCULUS_CALLBACK(inSeconds ), &Types::Float , CTI },
347 { *descriptor++, CALCULUS_SIGNATURE(Signatures::Dur ), CALCULUS_CALLBACK(inMilliseconds ), &Types::Float , CTI },
348 { *descriptor++, CALCULUS_SIGNATURE(Signatures::Dur ), CALCULUS_CALLBACK(inMicroseconds ), &Types::Float , CTI },
349 { *descriptor++, CALCULUS_SIGNATURE(Signatures::Dur ), CALCULUS_CALLBACK(inNanoseconds ), &Types::Float , CTI },
350 { *descriptor++, CALCULUS_SIGNATURE(Signatures::Dur ), CALCULUS_CALLBACK(inHertz ), &Types::Float , CTI },
351 { *descriptor++, CALCULUS_SIGNATURE(Signatures::IVar), CALCULUS_CALLBACK(dateTime ), &Types::DateTime , CTI },
352 { *descriptor++, CALCULUS_SIGNATURE(Signatures::IVar), CALCULUS_CALLBACK(utcDateTime ), &Types::DateTime , CTI },
353 { *descriptor++, CALCULUS_SIGNATURE(nullptr ), CALCULUS_CALLBACK(now ), &Types::DateTime , ETI },
354 { *descriptor++, CALCULUS_SIGNATURE(nullptr ), CALCULUS_CALLBACK(today ), &Types::DateTime , ETI },
355 { *descriptor++, CALCULUS_SIGNATURE(nullptr ), CALCULUS_CALLBACK(utcToday ), &Types::DateTime , ETI },
356 { *descriptor++, CALCULUS_SIGNATURE(Signatures::D ), CALCULUS_CALLBACK(age ), &Types::Duration , ETI },
357 { *descriptor++, CALCULUS_SIGNATURE(Signatures::DDur), CALCULUS_CALLBACK(isOlderThan ), &Types::Boolean , ETI },
358 { *descriptor++, CALCULUS_SIGNATURE(Signatures::D ), CALCULUS_CALLBACK(year ), &Types::Integer , CTI },
359 { *descriptor++, CALCULUS_SIGNATURE(Signatures::D ), CALCULUS_CALLBACK(month ), &Types::Integer , CTI },
360 { *descriptor++, CALCULUS_SIGNATURE(Signatures::D ), CALCULUS_CALLBACK(day ), &Types::Integer , CTI },
361 { *descriptor++, CALCULUS_SIGNATURE(Signatures::D ), CALCULUS_CALLBACK(dayOfWeek ), &Types::Integer , CTI },
362 { *descriptor++, CALCULUS_SIGNATURE(Signatures::D ), CALCULUS_CALLBACK(hour ), &Types::Integer , CTI },
363 { *descriptor++, CALCULUS_SIGNATURE(Signatures::D ), CALCULUS_CALLBACK(minute ), &Types::Integer , CTI },
364 { *descriptor++, CALCULUS_SIGNATURE(Signatures::D ), CALCULUS_CALLBACK(millisecond ), &Types::Integer , CTI },
365 { *descriptor++, CALCULUS_SIGNATURE(Signatures::D ), CALCULUS_CALLBACK(utcYear ), &Types::Integer , CTI },
366 { *descriptor++, CALCULUS_SIGNATURE(Signatures::D ), CALCULUS_CALLBACK(utcMonth ), &Types::Integer , CTI },
367 { *descriptor++, CALCULUS_SIGNATURE(Signatures::D ), CALCULUS_CALLBACK(utcDay ), &Types::Integer , CTI },
368 { *descriptor++, CALCULUS_SIGNATURE(Signatures::D ), CALCULUS_CALLBACK(utcDayOfWeek ), &Types::Integer , CTI },
369 { *descriptor++, CALCULUS_SIGNATURE(Signatures::D ), CALCULUS_CALLBACK(utcHour ), &Types::Integer , CTI },
370 { *descriptor++, CALCULUS_SIGNATURE(Signatures::D ), CALCULUS_CALLBACK(utcMinute ), &Types::Integer , CTI },
371 { *descriptor++, CALCULUS_SIGNATURE(Signatures::D ), CALCULUS_CALLBACK(utcMillisecond ), &Types::Integer , CTI },
372 };
373
374 // binary operators
375 AddOperators( binaryOpTableDateTime );
376
377 ALIB_ASSERT_ERROR( descriptor - functionNames == tableSize, "EXPR",
378 "Descriptor table size mismatch: Consumed {} descriptors, {} available.",
379 descriptor - functionNames, tableSize )
380}
381
382
383}}} // namespace [alib::expressions::detail]
384
385#undef BOL
386#undef INT
387#undef FLT
388#undef FUNC
389#undef FUNC
390#undef UN_MAP_ENTRY
391#undef BIN_MAP_ENTRY
392#undef BIN_ALIAS_ENTRY
393
394
395//! @endcond
int Hour
The calendar hour (0..23).
Definition calendar.inl:59
ALIB_DLL DateTime Get(lang::Timezone timezone=lang::Timezone::Local) const
Definition calendar.cpp:117
#define A_CHAR(STR)
#define CALCULUS_CALLBACK(func)
#define CALCULUS_SIGNATURE(BoxPointerArray)
#define ALIB_DBG(...)
Definition alib.inl:836
#define ALIB_ASSERT_ERROR(cond, domain,...)
Definition alib.inl:1049
void BootstrapRegister(typename TFDecl::Signature function)
Definition box.inl:1254
@ Local
Denotes local time.
@ UTC
Denotes UTC (coordinated universal time).
strings::util::Token Token
Type alias in namespace alib.
Definition token.inl:401
strings::TAString< character, lang::HeapAllocator > AString
Type alias in namespace alib.
time::DateTime DateTime
Type alias in namespace alib.
Definition datetime.inl:224
strings::TString< nchar > NString
Type alias in namespace alib.
Definition string.inl:2390
strings::util::CalendarDateTime CalendarDateTime
Type alias in namespace alib.
Definition calendar.inl:647
boxing::Box Box
Type alias in namespace alib.
Definition box.inl:1216
expressions::Compiler Compiler
Type alias in namespace alib.
Definition compiler.inl:574
static ALIB_DLL Box Duration
Sample type-box for values of type DateTime::Duration).
static ALIB_DLL Box Integer
Sample type-box for integer types. (Precisely for type integer.)
static ALIB_DLL Box Boolean
Sample type-box for C++ type bool.
static ALIB_DLL Box Float
Sample type-box for C++ type double.
static ALIB_DLL Box DateTime
Sample type-box for date and time values of type DateTime).
static constexpr CTInvokable CTI
Definition calculus.inl:234
const std::tuple< String, Type, Type, CallbackDecl, Type, CTInvokable > OperatorTableEntry
Definition calculus.inl:458
ALIB_DLL DateAndTime(Compiler &compiler)