Cosmetics

This commit is contained in:
Birunthan Mohanathas 2012-12-22 12:23:36 +02:00
parent 0b84213eb6
commit 63c5e353d7

View File

@ -25,65 +25,66 @@
static const double M_E = 2.7182818284590452354; static const double M_E = 2.7182818284590452354;
static const double M_PI = 3.14159265358979323846; static const double M_PI = 3.14159265358979323846;
typedef double (*OneArgProc)(double arg); typedef double (*SingleArgFunction)(double arg);
typedef const WCHAR* (*MultiArgProc)(int paramcnt, double* args, double* result); typedef const WCHAR* (*MultiArgFunction)(int paramcnt, double* args, double* result);
enum OperationType enum class Operator : uint8_t
{ {
OP_SHL, ShiftLeft,
OP_SHR, ShiftRight,
OP_POW, Power,
OP_LOGIC_NEQ, NotEqual,
OP_LOGIC_GEQ, GreatorOrEqual,
OP_LOGIC_LEQ, LessOrEqual,
OP_LOGIC_AND, LogicalAND,
OP_LOGIC_OR, LogicalOR,
OP_OBR, OpeningBracket,
OP_ADD, Addition,
OP_SUB, Subtraction,
OP_MUL, Multiplication,
OP_DIV, Division,
OP_MOD, Modulo,
OP_UNK, UNK,
OP_XOR, BitwiseXOR,
OP_NOT, BitwiseNOT,
OP_AND, BitwiseAND,
OP_OR, BitwiseOR,
OP_EQU, Equal,
OP_GREATER, Greater,
OP_SMALLER, Less,
OP_LOGIC, Conditional,
OP_LOGIC_SEP, ConditionalSeparator,
OP_CBR, ClosingBracket,
OP_COMMA, Comma,
OP_FUNC_ONEARG, // Special SingleArgFunction,
OP_FUNC_MULTIARG // Special MultiArgFunction,
Invalid // Must be last.
}; };
enum CharType enum class CharType
{ {
CH_UNKNOWN = 0x00, Unknown = 0x00,
CH_LETTER = 0x01, Letter = 0x01,
CH_DIGIT = 0x02, Digit = 0x02,
CH_SEPARAT = 0x04, Separator = 0x04,
CH_SYMBOL = 0x08, Symbol = 0x08,
CH_MINUS = 0x10, MinusSymbol = 0x10,
CH_FINAL = 0x7F Final = 0x7F
}; };
enum MathTokenType enum class Token
{ {
TOK_ERROR, Error,
TOK_NONE, None,
TOK_FINAL, Final,
TOK_FLOAT, Float,
TOK_SYMBOL, Symbol,
TOK_NAME Name
}; };
struct Operation struct Operation
{ {
BYTE type; Operator type;
BYTE funcIndex; BYTE funcIndex;
char prevTop; char prevTop;
}; };
@ -91,7 +92,7 @@ struct Operation
struct Function struct Function
{ {
WCHAR* name; WCHAR* name;
OneArgProc proc; SingleArgFunction proc;
BYTE length; BYTE length;
}; };
@ -117,7 +118,7 @@ static Function g_Functions[] =
{ L"trunc", &trunc, 5 }, { L"trunc", &trunc, 5 },
{ L"floor", &floor, 5 }, { L"floor", &floor, 5 },
{ L"ceil", &ceil, 4 }, { L"ceil", &ceil, 4 },
{ L"round", (OneArgProc)&round, 5 }, { L"round", (SingleArgFunction)&round, 5 },
{ L"asin", &asin, 4 }, { L"asin", &asin, 4 },
{ L"acos", &acos, 4 }, { L"acos", &acos, 4 },
{ L"rad", &rad, 3 }, { L"rad", &rad, 3 },
@ -133,44 +134,44 @@ static const int FUNC_E = 19;
static const int FUNC_PI = 20; static const int FUNC_PI = 20;
static const BYTE FUNC_INVALID = UCHAR_MAX; static const BYTE FUNC_INVALID = UCHAR_MAX;
static const Operation g_BrOp = { OP_OBR, 0, 0}; static const Operation g_BrOp = { Operator::OpeningBracket, 0, 0};
static const Operation g_NegOp = { OP_FUNC_ONEARG, 18, 0 }; static const Operation g_NegOp = { Operator::SingleArgFunction, 18, 0 };
static const BYTE g_OpPriorities[OP_FUNC_MULTIARG + 1] = static const BYTE g_OpPriorities[Operator::Invalid] =
{ {
5, // OP_SHL 5, // Operator::ShiftLeft
5, // OP_SHR 5, // Operator::ShiftRight
5, // OP_POW 5, // Operator::Power
2, // OP_LOGIC_NEQ 2, // Operator::NotEqual
2, // OP_LOGIC_GEQ 2, // Operator::GreatorOrEqual
2, // OP_LOGIC_LEQ 2, // Operator::LessOrEqual
2, // OP_LOGIC_AND 2, // Operator::LogicalAND
2, // OP_LOGIC_OR 2, // Operator::LogicalOR
0, // OP_OBR 0, // Operator::OpeningBracket
3, // OP_ADD 3, // Operator::Addition
3, // OP_SUB 3, // Operator::Subtraction
4, // OP_MUL 4, // Operator::Multiplication
4, // OP_DIV 4, // Operator::Division
4, // OP_MOD 4, // Operator::Modulo
4, // OP_UNK 4, // Operator::UNK
5, // OP_XOR 5, // Operator::BitwiseXOR
5, // OP_NOT 5, // Operator::BitwiseNOT
5, // OP_AND 5, // Operator::BitwiseAND
5, // OP_OR 5, // Operator::BitwiseOR
2, // OP_EQU 2, // Operator::Equal
2, // OP_GREATER 2, // Operator::Greater
2, // OP_SMALLER 2, // Operator::Less
1, // OP_LOGIC 1, // Operator::Conditional
2, // OP_LOGIC_SEP 2, // Operator::ConditionalSeparator
0, // OP_CBR 0, // Operator::ClosingBracket
2, // OP_COMMA 2, // Operator::Comma
6, // OP_FUNC_ONEARG 6, // Operator::SingleArgFunction
6 // OP_FUNC_MULTIARG 6 // Operator::MultiArgFunction
}; };
static CharType GetCharType(WCHAR ch); static CharType GetCharType(WCHAR ch);
static BYTE GetFunctionIndex(const WCHAR* str, BYTE len); static BYTE GetFunctionIndex(const WCHAR* str, BYTE len);
static int FindSymbol(const WCHAR* str); static Operator GetOperator(const WCHAR* str);
struct Parser struct Parser
{ {
@ -180,7 +181,7 @@ struct Parser
char valTop; char valTop;
int obrDist; int obrDist;
Parser() : opTop(0), valTop(-1), obrDist(2) { opStack[0].type = OP_OBR; } Parser() : opTop(0), valTop(-1), obrDist(2) { opStack[0].type = Operator::OpeningBracket; }
}; };
static const WCHAR* CalcToObr(Parser& parser); static const WCHAR* CalcToObr(Parser& parser);
@ -193,13 +194,13 @@ struct Lexer
size_t nameLen; size_t nameLen;
double extValue; double extValue;
int intValue; int intValue;
MathTokenType prevToken; Token prevToken;
CharType charType; CharType charType;
Lexer(const WCHAR* str) : string(str), name(), nameLen(), extValue(), intValue(), prevToken(TOK_NONE), charType(GetCharType(*str)) {} Lexer(const WCHAR* str) : string(str), name(), nameLen(), extValue(), intValue(), prevToken(Token::None), charType(GetCharType(*str)) {}
}; };
static MathTokenType GetNextToken(Lexer& lexer); static Token GetNextToken(Lexer& lexer);
const WCHAR* eBrackets = L"Unmatched brackets"; const WCHAR* eBrackets = L"Unmatched brackets";
const WCHAR* eSyntax = L"Syntax error"; const WCHAR* eSyntax = L"Syntax error";
@ -263,14 +264,14 @@ const WCHAR* MathParser::Parse(const WCHAR* formula, CMeasureCalc* calc, double*
return eInternal; return eInternal;
} }
MathTokenType token = GetNextToken(lexer); Token token = GetNextToken(lexer);
--parser.obrDist; --parser.obrDist;
switch (token) switch (token)
{ {
case TOK_ERROR: case Token::Error:
return eSyntax; return eSyntax;
case TOK_FINAL: case Token::Final:
if ((error = CalcToObr(parser)) != NULL) if ((error = CalcToObr(parser)) != NULL)
{ {
return error; return error;
@ -287,31 +288,31 @@ const WCHAR* MathParser::Parse(const WCHAR* formula, CMeasureCalc* calc, double*
} }
break; break;
case TOK_FLOAT: case Token::Float:
parser.valStack[++parser.valTop] = lexer.extValue; parser.valStack[++parser.valTop] = lexer.extValue;
break; break;
case TOK_SYMBOL: case Token::Symbol:
switch (lexer.intValue) switch (lexer.intValue)
{ {
case OP_OBR: case Operator::OpeningBracket:
{ {
parser.opStack[++parser.opTop] = g_BrOp; parser.opStack[++parser.opTop] = g_BrOp;
parser.obrDist = 2; parser.obrDist = 2;
} }
break; break;
case OP_CBR: case Operator::ClosingBracket:
{ {
if ((error = CalcToObr(parser)) != NULL) return error; if ((error = CalcToObr(parser)) != NULL) return error;
} }
break; break;
case OP_COMMA: case Operator::Comma:
{ {
if ((error = CalcToObr(parser)) != NULL) return error; if ((error = CalcToObr(parser)) != NULL) return error;
if (parser.opStack[parser.opTop].type == OP_FUNC_MULTIARG) if (parser.opStack[parser.opTop].type == Operator::MultiArgFunction)
{ {
parser.opStack[++parser.opTop] = g_BrOp; parser.opStack[++parser.opTop] = g_BrOp;
parser.obrDist = 2; parser.obrDist = 2;
@ -326,10 +327,10 @@ const WCHAR* MathParser::Parse(const WCHAR* formula, CMeasureCalc* calc, double*
default: default:
{ {
Operation op; Operation op;
op.type = (OperationType)lexer.intValue; op.type = (Operator)lexer.intValue;
switch (op.type) switch (op.type)
{ {
case OP_ADD: case Operator::Addition:
if (parser.obrDist >= 1) if (parser.obrDist >= 1)
{ {
// Goto next token // Goto next token
@ -337,7 +338,7 @@ const WCHAR* MathParser::Parse(const WCHAR* formula, CMeasureCalc* calc, double*
} }
break; break;
case OP_SUB: case Operator::Subtraction:
if (parser.obrDist >= 1) if (parser.obrDist >= 1)
{ {
parser.opStack[++parser.opTop] = g_NegOp; parser.opStack[++parser.opTop] = g_NegOp;
@ -347,13 +348,13 @@ const WCHAR* MathParser::Parse(const WCHAR* formula, CMeasureCalc* calc, double*
} }
break; break;
case OP_LOGIC: case Operator::Conditional:
case OP_LOGIC_SEP: case Operator::ConditionalSeparator:
parser.obrDist = 2; parser.obrDist = 2;
break; break;
} }
while (g_OpPriorities[op.type] <= g_OpPriorities[parser.opStack[parser.opTop].type]) while (g_OpPriorities[(int)op.type] <= g_OpPriorities[(int)parser.opStack[parser.opTop].type])
{ {
if ((error = Calc(parser)) != NULL) return error; if ((error = Calc(parser)) != NULL) return error;
} }
@ -363,7 +364,7 @@ const WCHAR* MathParser::Parse(const WCHAR* formula, CMeasureCalc* calc, double*
} }
break; break;
case TOK_NAME: case Token::Name:
{ {
Operation op; Operation op;
if (lexer.nameLen <= FUNC_MAX_LEN && if (lexer.nameLen <= FUNC_MAX_LEN &&
@ -380,13 +381,13 @@ const WCHAR* MathParser::Parse(const WCHAR* formula, CMeasureCalc* calc, double*
break; break;
case FUNC_ROUND: case FUNC_ROUND:
op.type = OP_FUNC_MULTIARG; op.type = Operator::MultiArgFunction;
op.prevTop = parser.valTop; op.prevTop = parser.valTop;
parser.opStack[++parser.opTop] = op; parser.opStack[++parser.opTop] = op;
break; break;
default: // Internal function default: // Internal function
op.type = OP_FUNC_ONEARG; op.type = Operator::SingleArgFunction;
parser.opStack[++parser.opTop] = op; parser.opStack[++parser.opTop] = op;
break; break;
} }
@ -419,16 +420,16 @@ static const WCHAR* Calc(Parser& parser)
Operation op = parser.opStack[parser.opTop--]; Operation op = parser.opStack[parser.opTop--];
// Multi-argument function // Multi-argument function
if (op.type == OP_LOGIC) if (op.type == Operator::Conditional)
{ {
return NULL; return NULL;
} }
else if (op.type == OP_FUNC_MULTIARG) else if (op.type == Operator::MultiArgFunction)
{ {
int paramcnt = parser.valTop - op.prevTop; int paramcnt = parser.valTop - op.prevTop;
parser.valTop = op.prevTop; parser.valTop = op.prevTop;
const WCHAR* error = (*(MultiArgProc)g_Functions[op.funcIndex].proc)(paramcnt, &parser.valStack[parser.valTop + 1], &res); const WCHAR* error = (*(MultiArgFunction)g_Functions[op.funcIndex].proc)(paramcnt, &parser.valStack[parser.valTop + 1], &res);
if (error) return error; if (error) return error;
parser.valStack[++parser.valTop] = res; parser.valStack[++parser.valTop] = res;
@ -443,13 +444,13 @@ static const WCHAR* Calc(Parser& parser)
double right = parser.valStack[parser.valTop--]; double right = parser.valStack[parser.valTop--];
// One arg operations // One arg operations
if (op.type == OP_NOT) if (op.type == Operator::BitwiseNOT)
{ {
res = (double)(~((long long)right)); res = (double)(~((long long)right));
} }
else if (op.type == OP_FUNC_ONEARG) else if (op.type == Operator::SingleArgFunction)
{ {
res = (*(OneArgProc)g_Functions[op.funcIndex].proc)(right); res = (*(SingleArgFunction)g_Functions[op.funcIndex].proc)(right);
} }
else else
{ {
@ -462,51 +463,51 @@ static const WCHAR* Calc(Parser& parser)
double left = parser.valStack[parser.valTop--]; double left = parser.valStack[parser.valTop--];
switch (op.type) switch (op.type)
{ {
case OP_SHL: case Operator::ShiftLeft:
res = (double)((long long)left << (long long)right); res = (double)((long long)left << (long long)right);
break; break;
case OP_SHR: case Operator::ShiftRight:
res = (double)((long long)left >> (long long)right); res = (double)((long long)left >> (long long)right);
break; break;
case OP_POW: case Operator::Power:
res = pow(left, right); res = pow(left, right);
break; break;
case OP_LOGIC_NEQ: case Operator::NotEqual:
res = left != right; res = left != right;
break; break;
case OP_LOGIC_GEQ: case Operator::GreatorOrEqual:
res = left >= right; res = left >= right;
break; break;
case OP_LOGIC_LEQ: case Operator::LessOrEqual:
res = left <= right; res = left <= right;
break; break;
case OP_LOGIC_AND: case Operator::LogicalAND:
res = left && right; res = left && right;
break; break;
case OP_LOGIC_OR: case Operator::LogicalOR:
res = left || right; res = left || right;
break; break;
case OP_ADD: case Operator::Addition:
res = left + right; res = left + right;
break; break;
case OP_SUB: case Operator::Subtraction:
res = left - right; res = left - right;
break; break;
case OP_MUL: case Operator::Multiplication:
res = left* right; res = left* right;
break; break;
case OP_DIV: case Operator::Division:
if (right == 0.0) if (right == 0.0)
{ {
return eInfinity; return eInfinity;
@ -517,11 +518,11 @@ static const WCHAR* Calc(Parser& parser)
} }
break; break;
case OP_MOD: case Operator::Modulo:
res = fmod(left, right); res = fmod(left, right);
break; break;
case OP_UNK: case Operator::UNK:
if (left <= 0) if (left <= 0)
{ {
res = 0.0; res = 0.0;
@ -536,34 +537,34 @@ static const WCHAR* Calc(Parser& parser)
} }
break; break;
case OP_XOR: case Operator::BitwiseXOR:
res = (double)((long long)left ^ (long long)right); res = (double)((long long)left ^ (long long)right);
break; break;
case OP_AND: case Operator::BitwiseAND:
res = (double)((long long)left & (long long)right); res = (double)((long long)left & (long long)right);
break; break;
case OP_OR: case Operator::BitwiseOR:
res = (double)((long long)left | (long long)right); res = (double)((long long)left | (long long)right);
break; break;
case OP_EQU: case Operator::Equal:
res = left == right; res = left == right;
break; break;
case OP_GREATER: case Operator::Greater:
res = left > right; res = left > right;
break; break;
case OP_SMALLER: case Operator::Less:
res = left < right; res = left < right;
break; break;
case OP_LOGIC_SEP: case Operator::ConditionalSeparator:
{ {
// Needs three arguments // Needs three arguments
if (parser.opTop < 0 || parser.opStack[parser.opTop--].type != OP_LOGIC) if (parser.opTop < 0 || parser.opStack[parser.opTop--].type != Operator::Conditional)
{ {
return eLogicErr; return eLogicErr;
} }
@ -582,7 +583,7 @@ static const WCHAR* Calc(Parser& parser)
static const WCHAR* CalcToObr(Parser& parser) static const WCHAR* CalcToObr(Parser& parser)
{ {
while (parser.opStack[parser.opTop].type != OP_OBR) while (parser.opStack[parser.opTop].type != Operator::OpeningBracket)
{ {
const WCHAR* error = Calc(parser); const WCHAR* error = Calc(parser);
if (error) return error; if (error) return error;
@ -591,44 +592,44 @@ static const WCHAR* CalcToObr(Parser& parser)
return NULL; return NULL;
} }
MathTokenType GetNextToken(Lexer& lexer) Token GetNextToken(Lexer& lexer)
{ {
MathTokenType result = TOK_ERROR; Token result = Token::Error;
while (lexer.charType == CH_SEPARAT) while (lexer.charType == CharType::Separator)
{ {
lexer.charType = GetCharType(*++lexer.string); lexer.charType = GetCharType(*++lexer.string);
} }
if (lexer.charType == CH_MINUS) if (lexer.charType == CharType::MinusSymbol)
{ {
// If the - sign follows a symbol, it is treated as a (negative) number. // If the - sign follows a symbol, it is treated as a (negative) number.
lexer.charType = (lexer.prevToken == TOK_SYMBOL) ? CH_DIGIT : CH_SYMBOL; lexer.charType = (lexer.prevToken == Token::Symbol) ? CharType::Digit : CharType::Symbol;
} }
switch (lexer.charType) switch (lexer.charType)
{ {
case CH_FINAL: case CharType::Final:
{ {
result = TOK_FINAL; result = Token::Final;
} }
break; break;
case CH_LETTER: case CharType::Letter:
{ {
lexer.name = lexer.string; lexer.name = lexer.string;
do do
{ {
lexer.charType = GetCharType(*++lexer.string); lexer.charType = GetCharType(*++lexer.string);
} }
while (lexer.charType <= CH_DIGIT); while (lexer.charType <= CharType::Digit);
lexer.nameLen = lexer.string - lexer.name; lexer.nameLen = lexer.string - lexer.name;
result = TOK_NAME; result = Token::Name;
} }
break; break;
case CH_DIGIT: case CharType::Digit:
{ {
WCHAR* newString; WCHAR* newString;
if (lexer.string[0] == L'0') if (lexer.string[0] == L'0')
@ -660,7 +661,7 @@ MathTokenType GetNextToken(Lexer& lexer)
lexer.string = newString; lexer.string = newString;
lexer.charType = GetCharType(*lexer.string); lexer.charType = GetCharType(*lexer.string);
lexer.extValue = lexer.intValue; lexer.extValue = lexer.intValue;
result = TOK_FLOAT; result = Token::Float;
} }
break; break;
} }
@ -672,21 +673,21 @@ MathTokenType GetNextToken(Lexer& lexer)
{ {
lexer.string = newString; lexer.string = newString;
lexer.charType = GetCharType(*lexer.string); lexer.charType = GetCharType(*lexer.string);
result = TOK_FLOAT; result = Token::Float;
} }
} }
break; break;
case CH_SYMBOL: case CharType::Symbol:
{ {
int sym = FindSymbol(lexer.string); Operator oper = GetOperator(lexer.string);
if (sym >= 0) if (oper != Operator::Invalid)
{ {
lexer.string += (sym <= OP_LOGIC_OR) ? 2 : 1; lexer.string += ((int)oper <= (int)Operator::LogicalOR) ? 2 : 1;
lexer.charType = GetCharType(*lexer.string); lexer.charType = GetCharType(*lexer.string);
lexer.intValue = sym; lexer.intValue = (int)oper;
result = TOK_SYMBOL; result = Token::Symbol;
} }
} }
break; break;
@ -702,18 +703,18 @@ CharType GetCharType(WCHAR ch)
switch (ch) switch (ch)
{ {
case L'\0': case L'\0':
return CH_FINAL; return CharType::Final;
case L' ': case L' ':
case L'\t': case L'\t':
case L'\n': case L'\n':
return CH_SEPARAT; return CharType::Separator;
case L'_': case L'_':
return CH_LETTER; return CharType::Letter;
case L'-': case L'-':
return CH_MINUS; return CharType::MinusSymbol;
case L'+': case L'+':
case L'/': case L'/':
@ -731,19 +732,19 @@ CharType GetCharType(WCHAR ch)
case L'=': case L'=':
case L'&': case L'&':
case L'|': case L'|':
return CH_SYMBOL; return CharType::Symbol;
} }
if (iswalpha(ch)) return CH_LETTER; if (iswalpha(ch)) return CharType::Letter;
if (iswdigit(ch)) return CH_DIGIT; if (iswdigit(ch)) return CharType::Digit;
return CH_UNKNOWN; return CharType::Unknown;
} }
bool MathParser::IsDelimiter(WCHAR ch) bool MathParser::IsDelimiter(WCHAR ch)
{ {
CharType type = GetCharType(ch); CharType type = GetCharType(ch);
return type == CH_SYMBOL || type == CH_SEPARAT; return type == CharType::Symbol || type == CharType::Separator;
} }
BYTE GetFunctionIndex(const WCHAR* str, BYTE len) BYTE GetFunctionIndex(const WCHAR* str, BYTE len)
@ -761,31 +762,66 @@ BYTE GetFunctionIndex(const WCHAR* str, BYTE len)
return FUNC_INVALID; return FUNC_INVALID;
} }
int FindSymbol(const WCHAR* str) Operator GetOperator(const WCHAR* str)
{ {
switch (str[0]) switch (str[0])
{ {
case L'(': return OP_OBR; case L'(':
case L'+': return OP_ADD; return Operator::OpeningBracket;
case L'-': return OP_SUB;
case L'*': return (str[1] == L'*') ? OP_POW : OP_MUL; case L'+':
case L'/': return OP_DIV; return Operator::Addition;
case L'%': return OP_MOD;
case L'$': return OP_UNK; case L'-':
case L'^': return OP_XOR; return Operator::Subtraction;
case L'~': return OP_NOT;
case L'&': return (str[1] == L'&') ? OP_LOGIC_AND : OP_AND; case L'*':
case L'|': return (str[1] == L'|') ? OP_LOGIC_OR : OP_OR; return (str[1] == L'*') ? Operator::Power : Operator::Multiplication;
case L'=': return OP_EQU;
case L'>': return (str[1] == L'>') ? OP_SHR : (str[1] == L'=') ? OP_LOGIC_GEQ : OP_GREATER; case L'/':
case L'<': return (str[1] == L'>') ? OP_LOGIC_NEQ : (str[1] == L'<') ? OP_SHL : (str[1] == L'=') ? OP_LOGIC_LEQ : OP_SMALLER; return Operator::Division;
case L'?': return OP_LOGIC;
case L':': return OP_LOGIC_SEP; case L'%':
case L')': return OP_CBR; return Operator::Modulo;
case L',': return OP_COMMA;
case L'$':
return Operator::UNK;
case L'^':
return Operator::BitwiseXOR;
case L'~':
return Operator::BitwiseNOT;
case L'&':
return (str[1] == L'&') ? Operator::LogicalAND : Operator::BitwiseAND;
case L'|':
return (str[1] == L'|') ? Operator::LogicalOR : Operator::BitwiseOR;
case L'=':
return Operator::Equal;
case L'>':
return (str[1] == L'>') ? Operator::ShiftRight : (str[1] == L'=') ? Operator::GreatorOrEqual : Operator::Greater;
case L'<':
return (str[1] == L'>') ? Operator::NotEqual : (str[1] == L'<') ? Operator::ShiftLeft : (str[1] == L'=') ? Operator::LessOrEqual : Operator::Less;
case L'?':
return Operator::Conditional;
case L':':
return Operator::ConditionalSeparator;
case L')':
return Operator::ClosingBracket;
case L',':
return Operator::Comma;
} }
return -1; return Operator::Invalid;
} }
// ----------------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------------