ALib C++ Library
Library Version: 2402 R1
Documentation generated by doxygen
Loading...
Searching...
No Matches
strings.hpp
Go to the documentation of this file.
1/** ************************************************************************************************
2 * \file
3 * This header file is part of module \alib_expressions of the \aliblong.
4 *
5 * \emoji :copyright: 2013-2024 A-Worx GmbH, Germany.
6 * Published under \ref mainpage_license "Boost Software License".
7 **************************************************************************************************/
8#ifndef HPP_ALIB_EXPRESSIONS_PLUGINS_STRINGS
9#define HPP_ALIB_EXPRESSIONS_PLUGINS_STRINGS
10
11#ifndef HPP_ALIB_EXPRESSIONS_PLUGINS_CALCULUS
13#endif
14
15
16namespace alib { namespace expressions { namespace plugins {
17
18
19/** ************************************************************************************************
20 * This built-in \alib{expressions;CompilerPlugin} of \alib_expressions_nl
21 * compiles identifiers, functions and operators with character string type operands or return
22 * types.
23 *
24 * By default, this plug-in is \alib{expressions;Compiler::CfgBuiltInPlugins;automatically created}
25 * and inserted into each instance of class \alib{expressions;Compiler} with the invocation of
26 * \alib{expressions::Compiler;SetupDefaults}.
27 *
28 * <b>Constants:</b><br>
29 *
30 * Type | Name | Min. Abbreviation | Description
31 * --------|-------------|-------------------|--------------
32 * String |\b NewLine | nl | System dependent new line character combination ( <c>"\n"</c> or <c>"\r\n"</c>).
33 * String |\b Tabulator | tab | String with single tabulator character (<c>"\t"</c>).
34 *
35 * <br>
36 * <b>Functions:</b><br>
37 *
38 * Note: All identifier and function names are defined case insensitive.
39 *
40 * Return Type | Name | Min. Abbreviation| Signature | Description
41 * ---------------|-----------|------------------|-----------|-------------
42 * String | \b String | str | ... | Creates and returns a string representation of the arguments, concatenated from left to right.
43 * String | \b ToUpper | tu | String | Converts all appropriate characters of a string to upper case letters. This function is aliased by unary operator <c>'+'</c>.
44 * String | \b ToLower | tl | String | Converts all appropriate characters of a string to lower case letters. This function is aliased by unary operator <c>'-'</c>.
45 * Boolean | \b Compare | comp | String, String | Returns \c 0 if strings are equal, a negative value if the first string is "smaller" than the second and a positive otherwise.
46 * Boolean | \b Compare | comp | String, String, Boolean | Same as Compare(String,String) if third parameter is \c false. If it is \c true letter case is ignored.
47 * Boolean | \b StartsWith | sw | String, String | Tests if the first given string starts with the second. Comparison is case sensitive.
48 * Boolean | \b StartsWith | sw | String, String, Boolean | Tests if the first given string starts with the second. The third parameter is \c true, letter case is ignored.
49 * Boolean | \b EndsWith | ew | String, String | Tests if the first given string ends with the second. Comparison is case sensitive.
50 * Boolean | \b EndsWith | ew | String, String, Boolean | Tests if the first given string ends with the second. The third parameter is \c true, letter case is ignored.
51 * String | \b Substring | subs | String, Integer | Returns the sub-string, starting at given position (2nd argument) to the end of the string..
52 * String | \b Substring | subs | String, Integer, Integer| Returns the sub-string, starting at given position (2nd argument) with the given length (3rd argument).
53 * Integer | \b IndexOf | indo | String, String | Searches the first occurrence of the second string in the first. Returns the position if found, otherwise \c -1.
54 * Integer | \b Count | count | String, String | Counts the number of occurrences of the second string in the first.
55 * String | \b Replace | repl | String, String, String | Returns a copy of the 1st argument, with occurrences of 2nd argument replaced by 3rd argument.
56 * String | \b Repeat | repeat | String, Integer | Returns 1st argument concatenated \e N times (2nd argument).
57 * String | \b Token | tok | String, String, Integer | Parses tokens separated by character (2nd argument) in string (1st argument) an returns the n-th (3rd argument).
58 * String | \b Trim | trim | String | Trims the string at both sides by removing the following whitespace characters: <c>' '</c>, <c>'\\n'</c>, <c>'\\r'</c> and <c>'\\t'</c>.
59 * String | \b Trim | trim | String, String | Trims the string at both sides by removing the whitespace characters listed in the second string.
60 * String | \b TrimStart | trims | String | Trims the string at the start by removing the following whitespace characters: <c>' '</c>, <c>'\\n'</c>, <c>'\\r'</c> and <c>'\\t'</c>.
61 * String | \b TrimStart | trims | String, String | Trims the string at the start by removing the whitespace characters listed in the second string.
62 * String | \b TrimEnd | trime | String | Trims the string at the end by removing the following whitespace characters: <c>' '</c>, <c>'\\n'</c>, <c>'\\r'</c> and <c>'\\t'</c>.
63 * String | \b TrimEnd | trime | String, String | Trims the string at the end by removing the whitespace characters listed in the second string.
64 * Integer | \b Integer | int | String | Parses an integral value from the string. Allows decimal, hexadecimal, octal and binary formats. Literal prefixes default to <c>'0x'</c>, <c>'0o'</c> and <c>'0b'</c>, which can be changed by configuring object \alib{lang::format::Formatter;DefaultNumberFormat} of field \doxlinkproblem{structalib_1_1expressions_1_1Scope.html;aebf2cd4ff8a2611de06368fccfd3ef5b;Scope::Formatter;expressions::Scope::Formatter}.
65 * Float | \b Float | float | String | Parses a floating point value from the string. Allows scientific format and change of decimal point character by configuring object \alib{lang::format::Formatter;DefaultNumberFormat} of field \doxlinkproblem{structalib_1_1expressions_1_1Scope.html;aebf2cd4ff8a2611de06368fccfd3ef5b;Scope::Formatter;expressions::Scope::Formatter}.
66 * String | \b Hexadecimal | hex | Integer | Converts an integral value to a hexadecimal string representation. Format options are available with object \alib{lang::format::Formatter;DefaultNumberFormat} of field \doxlinkproblem{structalib_1_1expressions_1_1Scope.html;aebf2cd4ff8a2611de06368fccfd3ef5b;Scope::Formatter;expressions::Scope::Formatter}. The literal prefix (e.g. \c "0x") is not written.
67 * String | \b Hexadecimal | hex | Integer, Integer | Converts an integral value to a hexadecimal string representation of the given output width (2nd argument). Format options are available with object \alib{lang::format::Formatter;DefaultNumberFormat} of field \doxlinkproblem{structalib_1_1expressions_1_1Scope.html;aebf2cd4ff8a2611de06368fccfd3ef5b;Scope::Formatter;expressions::Scope::Formatter}. The literal prefix (e.g. \c "0x") is not written.
68 * String | \b Octal | oct | Integer | Converts an integral value to a binary string representation. Format options are available with object \alib{lang::format::Formatter;DefaultNumberFormat} of field \doxlinkproblem{structalib_1_1expressions_1_1Scope.html;aebf2cd4ff8a2611de06368fccfd3ef5b;Scope::Formatter;expressions::Scope::Formatter}. The literal prefix (e.g. \c "0x") is not written.
69 * String | \b Octal | oct | Integer, Integer | Converts an integral value to a binary string representation of the given output width (2nd argument). Format options are available with object \alib{lang::format::Formatter;DefaultNumberFormat} of field \doxlinkproblem{structalib_1_1expressions_1_1Scope.html;aebf2cd4ff8a2611de06368fccfd3ef5b;Scope::Formatter;expressions::Scope::Formatter}. The literal prefix (e.g. \c "0x") is not written.
70 * String | \b Binary | bin | Integer | Converts an integral value to an octal string representation. Format options are available with object \alib{lang::format::Formatter;DefaultNumberFormat} of field \doxlinkproblem{structalib_1_1expressions_1_1Scope.html;aebf2cd4ff8a2611de06368fccfd3ef5b;Scope::Formatter;expressions::Scope::Formatter}. The literal prefix (e.g. \c "0x") is not written.
71 * String | \b Binary | bin | Integer, Integer | Converts an integral value to an octal string representation of the given output width (2nd argument). Format options are available with object \alib{lang::format::Formatter;DefaultNumberFormat} of field \doxlinkproblem{structalib_1_1expressions_1_1Scope.html;aebf2cd4ff8a2611de06368fccfd3ef5b;Scope::Formatter;expressions::Scope::Formatter}. The literal prefix (e.g. \c "0x") is not written.
72 * String | \b Format | format | String, ... | Formats the given variadic parameters according to the given format string. See notes below, for further information.
73 * Boolean | \b WildCardMatch | wcm | String, String | Matches a string against a wildcard pattern. See notes below, for further information.
74 * Boolean | \b RegExMatch | rem | String, String | Matches a string against a regex pattern. See notes below, for further information.
75 *
76 * <br>
77 * <b>Unary Operators:</b><br>
78 *
79 * | Return Type | Operator| Argument Type | Description|
80 * |-------------|---------|---------------|---------------------
81 * | String |<b>+</b> | String | Alias to function \b %ToUpper.
82 * | String |<b>-</b> | String | Alias to function \b %ToLower.
83 * | Boolean |<b>!</b> | String | Tests a string for emptiness. See notes below.
84 *
85 * <br>
86 * <b>Binary Operators:</b><br>
87 *
88 * | Return Type | Lhs Type | Operator | Rhs Type | Description
89 * |-------------|----------|------------|----------|--------------------
90 * |String | String |<b>+</b> | Integer | Concatenates an integral value to a string. The number conversion is performed using object \alib{lang::format::Formatter;DefaultNumberFormat} of field \doxlinkproblem{structalib_1_1expressions_1_1Scope.html;aebf2cd4ff8a2611de06368fccfd3ef5b;Scope::Formatter;expressions::Scope::Formatter}.
91 * |String | String |<b>+</b> | Float | Concatenates a floating point value to a string. The number conversion is performed using object \alib{lang::format::Formatter;DefaultNumberFormat} of field \doxlinkproblem{structalib_1_1expressions_1_1Scope.html;aebf2cd4ff8a2611de06368fccfd3ef5b;Scope::Formatter;expressions::Scope::Formatter}.
92 * |String | String |<b>+</b> | <any> | Converts a boxed value of arbitrary type to a string and appends the result to another string. The conversion of the boxed value is performed by invoking box-function \alib{boxing;FAppend}.
93 * |String | Integer |<b>+</b> | String | Converts an integral value to a string and concatenates another string. The number conversion is performed using object \alib{lang::format::Formatter;DefaultNumberFormat} of field \doxlinkproblem{structalib_1_1expressions_1_1Scope.html;aebf2cd4ff8a2611de06368fccfd3ef5b;Scope::Formatter;expressions::Scope::Formatter}.
94 * |String | Float |<b>+</b> | String | Converts a floating point value to a string and concatenates another string. The number conversion is performed using object \alib{lang::format::Formatter;DefaultNumberFormat} of field \doxlinkproblem{structalib_1_1expressions_1_1Scope.html;aebf2cd4ff8a2611de06368fccfd3ef5b;Scope::Formatter;expressions::Scope::Formatter}.
95 * |String | <any> |<b>+</b> | String | Converts a boxed value of arbitrary type to a string and appends another string. The conversion of the boxed value is performed by invoking box-function \alib{boxing;FAppend}.
96 * |String | String |<b>+</b> | String | Concatenates two strings.
97 * |Boolean | String |<b><</b> | String | Compares two strings using method \alib{strings;TString::CompareTo;String::CompareTo}.
98 * |Boolean | String |<b><=</b> | String | Compares two strings using method \alib{strings;TString::CompareTo;String::CompareTo}.
99 * |Boolean | String |<b>></b> | String | Compares two strings using method \alib{strings;TString::CompareTo;String::CompareTo}.
100 * |Boolean | String |<b>>=</b> | String | Compares two strings using method \alib{strings;TString::CompareTo;String::CompareTo}.
101 * |Boolean | String |<b>==</b> | String | Compares two strings using method \alib{strings;TString::Equals;String::Equals}.
102 * |Boolean | String |<b>!=</b> | String | Compares two strings using method \alib{strings;TString::Equals;String::Equals}.
103 * |Boolean | String |<b>*</b> | String | Alias to expression function \b %WildCardMatch. See notes below, for further information.
104 * |Boolean | String |<b>\%</b> | String | Alias to expression function \b %RegexMatch. See notes below, for further information.
105 * |Boolean | String |<b>[]</b> | Integer | Returns the sub-string of length \c 1 at index \e rhs in string \e lhs.
106 *
107 *
108 \I{################################################################################################}
109 * # Notes And Hints #
110 *
111 \par Compile-Time Invokable:
112 * All callback functions are defined compile-time invokable. This means that redundancies in
113 * string expressions emerging from operations on constant strings are optimized (pruned) by the
114 * compiler.
115 *
116 \par Underlying %String %Types:
117 * While all string manipulation is based on \alib classes \alib{strings;TString;String},
118 * \alib{strings;TAString;AString} and \alib{strings;TSubstring;Substring}, due to the
119 * "harmonizing" way that string classes become boxed, none of these types appears as an expression
120 * result type. This means that custom expression functions can unbox strings that have been created
121 * by callback functions of this plug-in to their own custom string type (e.g. \c std::string,
122 * \c QString, or whatever), and, the other way round, results of custom callback functions that
123 * returned custom strings objects, can seamlessly be used by functions and operators defined here.
124 *
125 * Details of this are explained in chapters
126 * \ref alib_boxing_bijective "3. Non-Bijective Type Relationships" and
127 * \ref alib_boxing_strings "10. Boxing Character Strings" of the
128 * \ref alib_mod_boxing "Programmer's Manual" of module \alib_boxing_nl.
129 *
130 *
131 \par Determine A String's Length
132 * The length of the string can be determined with function \b %Length, which is defined with
133 * compiler plugin \alib{expressions::plugins;Arithmetics} (because it works on all arrays).
134 *
135 \par Test For Empty %Strings:
136 * Unary operator \alib{expressions::DefaultUnaryOperators;BoolNot} (<c>'!'</c>) may be used to check if a
137 * string is not empty. The operator returns \c true if the string is empty and \c false otherwise.
138 *
139 * \par
140 * Consequently, to test for non-empty strings, <c>'!!'</c> may be written. The outer
141 * <em>not-</em>operator is then a <em>not-</em>operator on the boolean result of the inner.<br>
142 * Alternatively, binary operators (see below) against an emtpy string can be used:
143 *
144 * myIndentifier == ""
145 * myIndentifier != ""
146 *
147 * As a result, this expressions is a tautology:
148 *
149 * !myIdentifier == (myIndentifier == "")
150 *
151 * Finally with strings, the built-in implementation of the
152 * \alib{expressions;plugins::ElvisOperator;elvis operator} is quite useful to avoid empty
153 * strings. The expression:
154 *
155 * myIdentifier ?: "Default"
156 *
157 * returns "Default" if \e myIdentifier evaluates to an empty string.
158 *
159 *
160 \par Case conversion:
161 * Unary operators \alib{expressions::DefaultUnaryOperators;Positive} <c>'+'</c> and
162 * \alib{expressions::DefaultUnaryOperators;Negative} <c>'-'</c> are alias to functions \b %ToUpper and
163 * \b %ToLower.
164 * Hence, the expressions
165 *
166 * ToUpper( "Hello " ) + ToLower( "World" )
167 * +"Hello " + -"World"
168 * are equivalent.
169 *
170 *
171 \par Concatenation:
172 * Binary operator <c>'+'</c> is compiled by this plug-in if one of the arguments (or both) is of
173 * string type. If one argument is not of string type, it becomes converted. For the conversion,
174 * the following rules apply:
175 *
176 * - Types \alib{expressions::Types;Integer} and \alib{expressions::Types;Float} are converted
177 * to string types using object \alib{lang::format::Formatter;DefaultNumberFormat} of
178 * field \doxlinkproblem{structalib_1_1expressions_1_1Scope.html;aebf2cd4ff8a2611de06368fccfd3ef5b;Scope::Formatter;expressions::Scope::Formatter}.
179 * With this, detailed options for the number output format is available.
180 * Even more options are available when using expression function \b %Format instead of
181 * the <c>'+'</c> operator.
182 *
183 * <p>
184 * - Any other type is converted to a string representation by using box-function
185 * \alib{boxing;FAppend}. For information on how to implement this for custom
186 * types, consult the documentation of module \alib_boxing.
187 * The following provides a quick sample snippet, taken from the unit tests:
188 *
189 * 1. The custom type:
190 * \snippet "ut_alib_expr.cpp" DOX_ALIB_EXPRESSIONS_STRINGOPS_IAPPEND_1
191 *
192 * 2. Definition of functor \alib{strings;T_Append} type <b>MyType</b>.
193 * Because the type will be boxed as a pointer, we also define the functor for the pointer type:
194 * \snippet "ut_alib_expr.cpp" DOX_ALIB_EXPRESSIONS_STRINGOPS_IAPPEND_2
195 *
196 * 3. In the bootstrap section of an application, an implementation of the templated interface
197 * function has be registered with \alib_boxing_nl:
198 * \snippet "ut_alib_expr.cpp" DOX_ALIB_EXPRESSIONS_STRINGOPS_IAPPEND_3
199 *
200 * With this short setup code, objects of type \e MyType, which might be returned by custom
201 * identifiers, can be added to strings in expressions!
202 *
203 * <p>
204 * - With type \alib{expressions::Types;Boolean}, the \alib{lang::resources;ResourcePool;resourced}
205 * string values generally used with box-function \alib{boxing;FAppend} defined for
206 * C++ type \c bool are used.
207 * These string resources default to \b "true" and \b "false". While resources can be customized,
208 * such customization has process-wide effect.<br>
209 * To express other values, \ref alib_expressions_builtin_ternary "conditional operator"
210 * (<c>Q ? T : F</c>) can be used by the end-user:
211 *
212 * "Is true: " + {boolean expression} // Uses the global resourced strings
213 * "Is true: " + ( {boolean expression} ? "Yes" : "No" ) // Custom conversion per expression.
214 *
215 \par Comparison:
216 * Operators <c>'=='</c>, <c>'!='</c>, <c>'<'</c>, <c>'<='</c>, <c>'>'</c> and <c>'>='</c>
217 * perform comparisons between two string operands.
218 * Internally, to perform the comparison, methods \alib{strings;TString::Equals;String::Equals} and
219 * \alib{strings;TString::CompareTo;String::CompareTo} are used.
220 *
221 * Case insensitive comparison can be performed by converting the operand(s) to upper case
222 * using expression function \b %ToUpper or its "alias operator", unary <c>'+'</c>.
223 * A more effective way is to use overloaded function \b %Compare that accepts an optional
224 * third operator of type \b %Boolean, which if \c true is given performs a case insensitive
225 * search without performing string conversions.
226 *
227 * \anchor alib_expressions_Strings_Formatting
228 \par Formatting:
229 * Function <b>Format(String, ...)</b> offers full featured string formatting in expressions.
230 * Being based on classes of underlying module \alib_basecamp, there is a choice between
231 * \alib{lang::format;FormatterPythonStyle;python style} or
232 * \alib{lang::format;FormatterJavaStyle;Java/printf style} format strings. It is even possible
233 * to allow both formats, of-course not within the same string, but within different
234 * evaluations of the same expression!
235 *
236 * \par
237 * Please consult the documentation of classes
238 * - \alib{lang::format;Formatter},
239 * - \alib{lang::format;FormatterPythonStyle;FormatterPythonStyle} and
240 * - \alib{lang::format;FormatterJavaStyle;FormatterJavaStyle} for details.
241 *
242 *
243 \par Wildcard Match:
244 * Wildcard match is implemented with expression function \b %WildcardMatch, respectively its "alias
245 * operator" <c>'*'</c>.
246 * The first (left-hand side) argument is the
247 * string that is searched, the second (right-hand side) argument is the pattern string to be
248 * matched.
249 *
250 * \par
251 * Wildcards characters are (<c>'*'</c>) and (<c>'?'</c>). For example, expressions
252 *
253 * WildcardMatch("This is ALib Expressions", "*A?ib*")
254 * "This is ALib Expressions" * "*A?ib*"
255 *
256 * are equivalent and return boolean \c true.
257 *
258 * \par
259 * For case insensitive search, the both strings are to be converted to upper case, as in
260 * expression:
261 *
262 * +filename * "*.JPG"
263 *
264 * \note
265 * A more performant alternative for the latest sample expression is:
266 *
267 * EndsWith( filename, ".jpg", true )
268 *
269 \par Regular %Expression Match:
270 * Regular expression match is implemented with expression function \b %RegexMatch, respectively its
271 * "alias operator" <c>'\%'</c>.
272 * The first (left-hand side) argument is the
273 * string that is searched, the second (right-hand side) argument is the pattern string to be matched.
274 *
275 * \par
276 * The regular expression syntax is compatible with
277 * \https{Perl Regular Expressions,perldoc.perl.org/perlretut.html}.
278 * The feature is implemented with using \https{boost::regex library,www.boost.org}.
279 *
280 * \attention
281 * The regular expression features of \alib and therefore of this compiler plug-in, are only
282 * available with the definition of compiler symbol \ref ALIB_FEAT_BOOST_REGEX
283 * and if either \ref ALIB_CHARACTERS_WIDE is \c false or \ref ALIB_CHARACTERS_NATIVE_WCHAR
284 * equals \c true.
285 *
286 \I{################################################################################################}
287 * # Reference Documentation #
288 **************************************************************************************************/
290{
291 /** ********************************************************************************************
292 * Constructor. Creates the hash map.
293 * @param compiler The compiler we will get attached to.
294 **********************************************************************************************/
296
297 /** ********************************************************************************************
298 * Virtual destructor
299 **********************************************************************************************/
300 virtual ~Strings() override
301 {}
302
303 /** ********************************************************************************************
304 * Overwrites the implementation of class \b %Calculus. While this is usually not needed,
305 * this class uses this for wildcard and regular expression matching functions.
306 * These functions implement a special behavior in respect to allocate "matcher" classes
307 * at compile-time in the case that the pattern string is constant (which usually is).
308 * Parent helper class \alib{expressions::plugins;Calculus} does provide mechanics for such
309 * rather complicated special actions.
310 *
311 * Of-course, the original method is called alternatively.
312 *
313 * @param[in,out] ciFunction The compilation info struct.
314 * @return \c true if compilation information was given, \c false otherwise.
315 **********************************************************************************************/
317 virtual bool TryCompilation( CIFunction& ciFunction) override;
318
319 /** ********************************************************************************************
320 * Overwrites the implementation of class \b %Calculus. While this is usually not needed,
321 * this class uses this to fetch arbitrary boxed types for certain operations, because
322 * the interface mechanics of module \alib_boxing allows us to convert any custom type
323 * to a string.
324 *
325 * Of-course, the original method is called alternatively.
326 *
327 * @param[in,out] ciBinaryOp The compilation info struct.
328 * @return \c true if compilation information was given, \c false otherwise.
329 **********************************************************************************************/
331 virtual bool TryCompilation( CIBinaryOp& ciBinaryOp ) override;
332
333};
334
335/** ************************************************************************************************
336 * This is the callback method for string function <b>%String(...)</b>, which converts an arbitrary
337 * amount of arguments of arbitrary type to a concatenated string.
338 *
339 * The function is compile-time invokable.
340 *
341 * \note
342 * As an exclamation to the rule, this function is not defined in an anonymous namespace, but
343 * exposed through the C++ header file of this struct. The rationale for this
344 * is that the function is also used for auto-casting custom types to strings, which is performed
345 * with compiler plug-in \alib{expressions;plugins::AutoCast}.
346 *
347 * @param scope The scope.
348 * @param args The single argument.
349 * @return A boxed \alib{monomem::TMAString}.
350 **************************************************************************************************/
353
354/** ************************************************************************************************
355 * This is the callback method for string function <b>%Format(...)</b>, which formats an arbitrary
356 * amount of arguments according to a given format string.
357 *
358 * The function is compile-time invokable.
359 *
360 * \note
361 * As an exclamation to the rule, this function is not defined in an anonymous namespace, but
362 * exposed through the C++ header file of this struct. The rationale for this
363 * is that the function this way can be called by other plug-ins as well.
364 *
365 * @param scope The scope.
366 * @param args The single argument.
367 * @return A boxed \alib{monomem::TMAString}.
368 **************************************************************************************************/
371
372}}} // namespace [alib::expressions::plugins]
373
374#endif // HPP_ALIB_EXPRESSIONS_PLUGINS_STRINGS
#define ALIB_API
Definition alib.hpp:538
ALIB_API Box CBFormat(Scope &scope, ArgIterator args, ArgIterator)
ALIB_API Box CBToString(Scope &scope, ArgIterator args, ArgIterator)
std::vector< Box >::iterator ArgIterator
Definition alib.cpp:57
virtual ALIB_API bool TryCompilation(CIFunction &ciFunction) override
virtual ALIB_API bool TryCompilation(CIBinaryOp &ciBinaryOp) override
ALIB_API Strings(Compiler &compiler)