44 double ,
Term* )
const
59 getInput (
i)->renameSymbol (oldSymbol, newName,
scope, recursionDepth);
143 return possibleInput ==
left ? 0 : (possibleInput ==
right ? 1 : -1);
156 right->resolve (
scope, recursionDepth)->toDouble()),
false);
164 if (
left->getOperatorPrecedence() > ourPrecendence)
165 s <<
'(' <<
left->toString() <<
')';
167 s =
left->toString();
171 if (
right->getOperatorPrecedence() >= ourPrecendence)
172 s <<
'(' <<
right->toString() <<
')';
189 return dest->createTermToEvaluateInput (
scope,
this, overallTarget, topLevelTerm);
191 return *
new Constant (overallTarget,
false);
204 return scope.getSymbolValue (
symbol).term->resolve (
scope, recursionDepth + 1);
216 scope.getSymbolValue (
symbol).term->visitAllSymbols (visitor,
scope, recursionDepth + 1);
254 for (
int i = 0;
i < numParams; ++
i)
255 params[
i] =
parameters.getReference(
i).term->resolve (
scope, recursionDepth + 1)->toDouble();
270 if (
parameters.getReference(
i).term == possibleInput)
337 getSymbol()->renameSymbol (oldSymbol, newName,
scope, recursionDepth);
440 if (
input->getOperatorPrecedence() > 0)
441 return "-(" +
input->toString() +
")";
443 return "-" +
input->toString();
491 return *
new Add (*newDest, *
right->clone());
542 if (newDest ==
nullptr)
548 return *
new Divide (*
left->clone(), *newDest);
583 if (
c->isResolutionTarget || ! mustBeFlagged)
590 const int numIns =
term->getNumInputs();
592 for (
int i = 0;
i < numIns; ++
i)
600 if (
c->isResolutionTarget || ! mustBeFlagged)
605 for (
int i = 0;
i < numIns; ++
i)
617 for (
int i =
t.getNumInputs(); --
i >= 0;)
657 Parser (String::CharPointerType& stringToParse) :
text (stringToParse)
690 return c >=
'0' &&
c <=
'9';
695 if (*
text == required)
706 text.incrementToEndOfWhitespace();
712 if (opType !=
nullptr)
726 text.incrementToEndOfWhitespace();
730 if (
t.isLetter() || *
t ==
'_')
735 while (
t.isLetterOrDigit() || *
t ==
'_')
744 identifier =
String (
text, (
size_t) numChars);
754 text.incrementToEndOfWhitespace();
756 bool isResolutionTarget = (*
t ==
'@');
758 if (isResolutionTarget)
761 t.incrementToEndOfWhitespace();
768 t.incrementToEndOfWhitespace();
790 lhs = *
new Add (lhs, rhs);
813 lhs = *
new Divide (lhs, rhs);
858 std::unique_ptr<Term>
func (
f);
862 if (param ==
nullptr)
867 return parseError (
"Expected parameters after \"" + identifier +
" (\"");
876 if (param ==
nullptr)
877 return parseError (
"Expected expression after \",\"");
893 return parseError (
"Expected symbol or function after \".\"");
895 if (identifier ==
"this")
958 :
term (std::move (other.term))
964 term = std::move (other.term);
973 parseError = parser.
error;
980 parseError = parser.
error;
999 return term->resolve (
scope, 0)->toDouble();
1003 evaluationError =
e.description;
1023 std::unique_ptr<Term> newTerm (
term->clone());
1027 if (termToAdjust ==
nullptr)
1030 if (termToAdjust ==
nullptr)
1036 jassert (termToAdjust !=
nullptr);
1041 termToAdjust->value =
Expression (reverseTerm.get()).evaluate (
scope);
1047 termToAdjust->value = targetValue;
1061 e.term->renameSymbol (oldSymbol, newName,
scope, 0);
1071 term->visitAllSymbols (visitor,
scope, 0);
1084 term->visitAllSymbols (visitor,
scope, 0);
1109bool Expression::Symbol::operator== (
const Symbol& other)
const noexcept
1114bool Expression::Symbol::operator!= (
const Symbol& other)
const noexcept
1116 return ! operator== (other);
1135 if (functionName ==
"min")
1137 double v = parameters[0];
1138 for (
int i = 1;
i < numParams; ++
i)
1144 if (functionName ==
"max")
1146 double v = parameters[0];
1147 for (
int i = 1;
i < numParams; ++
i)
1155 if (functionName ==
"sin")
return std::sin (parameters[0]);
1156 if (functionName ==
"cos")
return std::cos (parameters[0]);
1157 if (functionName ==
"tan")
return std::tan (parameters[0]);
1158 if (functionName ==
"abs")
return std::abs (parameters[0]);
#define noexcept
Definition DistrhoDefines.h:72
static Audio_Scope * scope
Definition player.cpp:26
static void message(int level, const char *fmt,...)
Definition adplugdb.cpp:120
static volatile bool term
Definition carla-uhe-test.c:12
Definition juce_Array.h:56
static double readDoubleValue(CharPointerType &text) noexcept
Definition juce_CharacterFunctions.h:147
Definition juce_Expression.cpp:452
void writeOperator(String &dest) const
Definition juce_Expression.cpp:460
Add(TermPtr l, TermPtr r)
Definition juce_Expression.cpp:454
int getOperatorPrecedence() const
Definition juce_Expression.cpp:458
Term * clone() const
Definition juce_Expression.cpp:456
TermPtr createTermToEvaluateInput(const Scope &scope, const Term *input, double overallTarget, Term *topLevelTerm) const
Definition juce_Expression.cpp:462
double performFunction(double lhs, double rhs) const
Definition juce_Expression.cpp:457
String getName() const
Definition juce_Expression.cpp:459
Term * getInput(int index) const
Definition juce_Expression.cpp:148
String toString() const
Definition juce_Expression.cpp:159
Type getType() const noexcept
Definition juce_Expression.cpp:146
TermPtr createDestinationTerm(const Scope &scope, const Term *input, double overallTarget, Term *topLevelTerm) const
Definition juce_Expression.cpp:182
BinaryTerm(TermPtr l, TermPtr r)
Definition juce_Expression.cpp:136
const TermPtr left
Definition juce_Expression.cpp:180
TermPtr resolve(const Scope &scope, int recursionDepth)
Definition juce_Expression.cpp:153
int getInputIndexFor(const Term *possibleInput) const
Definition juce_Expression.cpp:141
const TermPtr right
Definition juce_Expression.cpp:180
virtual double performFunction(double left, double right) const =0
int getNumInputs() const
Definition juce_Expression.cpp:147
virtual void writeOperator(String &dest) const =0
Definition juce_Expression.cpp:108
double toDouble() const
Definition juce_Expression.cpp:116
Type getType() const noexcept
Definition juce_Expression.cpp:113
TermPtr negated()
Definition juce_Expression.cpp:117
double value
Definition juce_Expression.cpp:128
bool isResolutionTarget
Definition juce_Expression.cpp:129
String toString() const
Definition juce_Expression.cpp:119
Constant(double val, bool resolutionTarget)
Definition juce_Expression.cpp:110
TermPtr resolve(const Scope &, int)
Definition juce_Expression.cpp:115
Term * clone() const
Definition juce_Expression.cpp:114
Definition juce_Expression.cpp:528
TermPtr createTermToEvaluateInput(const Scope &scope, const Term *input, double overallTarget, Term *topLevelTerm) const
Definition juce_Expression.cpp:538
void writeOperator(String &dest) const
Definition juce_Expression.cpp:535
Term * clone() const
Definition juce_Expression.cpp:532
String getName() const
Definition juce_Expression.cpp:534
int getOperatorPrecedence() const
Definition juce_Expression.cpp:536
double performFunction(double lhs, double rhs) const
Definition juce_Expression.cpp:533
Divide(TermPtr l, TermPtr r)
Definition juce_Expression.cpp:530
Definition juce_Expression.cpp:351
EvaluationVisitor(const TermPtr &t, const int recursion)
Definition juce_Expression.cpp:353
void visit(const Scope &scope)
Definition juce_Expression.cpp:356
const TermPtr input
Definition juce_Expression.cpp:358
const int recursionCount
Definition juce_Expression.cpp:360
TermPtr output
Definition juce_Expression.cpp:359
Definition juce_Expression.cpp:383
const String newName
Definition juce_Expression.cpp:393
SymbolRenamingVisitor(const TermPtr &t, const Expression::Symbol &symbol_, const String &newName_, const int recursionCount_)
Definition juce_Expression.cpp:385
void visit(const Scope &scope)
Definition juce_Expression.cpp:388
const TermPtr input
Definition juce_Expression.cpp:391
const int recursionCount
Definition juce_Expression.cpp:394
const Symbol & symbol
Definition juce_Expression.cpp:392
Definition juce_Expression.cpp:367
void visit(const Scope &scope)
Definition juce_Expression.cpp:372
const TermPtr input
Definition juce_Expression.cpp:375
const int recursionCount
Definition juce_Expression.cpp:377
SymbolVisitor & visitor
Definition juce_Expression.cpp:376
SymbolVisitingVisitor(const TermPtr &t, SymbolVisitor &v, const int recursion)
Definition juce_Expression.cpp:369
Definition juce_Expression.cpp:301
void visitAllSymbols(SymbolVisitor &visitor, const Scope &scope, int recursionDepth)
Definition juce_Expression.cpp:320
Term * clone() const
Definition juce_Expression.cpp:314
double performFunction(double, double) const
Definition juce_Expression.cpp:318
SymbolTerm * getSymbol() const
Definition juce_Expression.cpp:399
DotOperator(SymbolTerm *l, TermPtr r)
Definition juce_Expression.cpp:303
void writeOperator(String &dest) const
Definition juce_Expression.cpp:317
int getOperatorPrecedence() const
Definition juce_Expression.cpp:316
void renameSymbol(const Symbol &oldSymbol, const String &newName, const Scope &scope, int recursionDepth)
Definition juce_Expression.cpp:334
TermPtr resolve(const Scope &scope, int recursionDepth)
Definition juce_Expression.cpp:305
String getName() const
Definition juce_Expression.cpp:315
Definition juce_Expression.cpp:96
EvaluationError(const String &desc)
Definition juce_Expression.cpp:98
String description
Definition juce_Expression.cpp:103
Definition juce_Expression.cpp:230
Term * getInput(int i) const
Definition juce_Expression.cpp:241
Type getType() const noexcept
Definition juce_Expression.cpp:238
int getInputIndexFor(const Term *possibleInput) const
Definition juce_Expression.cpp:267
Function(const String &name, const Array< Expression > ¶ms)
Definition juce_Expression.cpp:234
String getName() const
Definition juce_Expression.cpp:242
int getNumInputs() const
Definition juce_Expression.cpp:240
Term * clone() const
Definition juce_Expression.cpp:239
TermPtr resolve(const Scope &scope, int recursionDepth)
Definition juce_Expression.cpp:244
Array< Expression > parameters
Definition juce_Expression.cpp:296
Function(const String &name)
Definition juce_Expression.cpp:232
const String functionName
Definition juce_Expression.cpp:295
String toString() const
Definition juce_Expression.cpp:276
Definition juce_Expression.cpp:505
TermPtr createTermToEvaluateInput(const Scope &scope, const Term *input, double overallTarget, Term *topLevelTerm) const
Definition juce_Expression.cpp:515
Multiply(TermPtr l, TermPtr r)
Definition juce_Expression.cpp:507
String getName() const
Definition juce_Expression.cpp:511
Term * clone() const
Definition juce_Expression.cpp:509
double performFunction(double lhs, double rhs) const
Definition juce_Expression.cpp:510
void writeOperator(String &dest) const
Definition juce_Expression.cpp:512
int getOperatorPrecedence() const
Definition juce_Expression.cpp:513
Definition juce_Expression.cpp:406
int getInputIndexFor(const Term *possibleInput) const
Definition juce_Expression.cpp:414
Type getType() const noexcept
Definition juce_Expression.cpp:413
Term * clone() const
Definition juce_Expression.cpp:417
TermPtr negated()
Definition juce_Expression.cpp:425
Negate(const TermPtr &t)
Definition juce_Expression.cpp:408
String toString() const
Definition juce_Expression.cpp:438
Term * getInput(int index) const
Definition juce_Expression.cpp:416
const TermPtr input
Definition juce_Expression.cpp:447
TermPtr createTermToEvaluateInput(const Scope &scope, const Term *t, double overallTarget, Term *topLevelTerm) const
Definition juce_Expression.cpp:427
String getName() const
Definition juce_Expression.cpp:424
TermPtr resolve(const Scope &scope, int recursionDepth)
Definition juce_Expression.cpp:419
int getNumInputs() const
Definition juce_Expression.cpp:415
Definition juce_Expression.cpp:654
Term * readNumber() noexcept
Definition juce_Expression.cpp:752
Parser(String::CharPointerType &stringToParse)
Definition juce_Expression.cpp:657
TermPtr readUnaryExpression()
Definition juce_Expression.cpp:819
bool readIdentifier(String &identifier) noexcept
Definition juce_Expression.cpp:724
bool readChar(const juce_wchar required) noexcept
Definition juce_Expression.cpp:693
static bool isDecimalDigit(const juce_wchar c) noexcept
Definition juce_Expression.cpp:688
TermPtr readParenthesisedExpression()
Definition juce_Expression.cpp:909
TermPtr readUpToComma()
Definition juce_Expression.cpp:661
String::CharPointerType & text
Definition juce_Expression.cpp:677
String error
Definition juce_Expression.cpp:674
TermPtr parseError(const String &message)
Definition juce_Expression.cpp:679
TermPtr readSymbolOrFunction()
Definition juce_Expression.cpp:849
bool readOperator(const char *ops, char *const opType=nullptr) noexcept
Definition juce_Expression.cpp:704
TermPtr readExpression()
Definition juce_Expression.cpp:777
TermPtr readMultiplyOrDivideExpression()
Definition juce_Expression.cpp:798
TermPtr readPrimaryExpression()
Definition juce_Expression.cpp:838
Definition juce_Expression.cpp:476
String getName() const
Definition juce_Expression.cpp:483
Subtract(TermPtr l, TermPtr r)
Definition juce_Expression.cpp:478
int getOperatorPrecedence() const
Definition juce_Expression.cpp:482
Term * clone() const
Definition juce_Expression.cpp:480
double performFunction(double lhs, double rhs) const
Definition juce_Expression.cpp:481
TermPtr createTermToEvaluateInput(const Scope &scope, const Term *input, double overallTarget, Term *topLevelTerm) const
Definition juce_Expression.cpp:486
void writeOperator(String &dest) const
Definition juce_Expression.cpp:484
Definition juce_Expression.cpp:626
SymbolCheckVisitor(const Symbol &s)
Definition juce_Expression.cpp:628
void useSymbol(const Symbol &s)
Definition juce_Expression.cpp:629
const Symbol & symbol
Definition juce_Expression.cpp:634
bool wasFound
Definition juce_Expression.cpp:631
Definition juce_Expression.cpp:641
Array< Symbol > & list
Definition juce_Expression.cpp:647
void useSymbol(const Symbol &s)
Definition juce_Expression.cpp:644
SymbolListVisitor(Array< Symbol > &list_)
Definition juce_Expression.cpp:643
Definition juce_Expression.cpp:197
void visitAllSymbols(SymbolVisitor &visitor, const Scope &scope, int recursionDepth)
Definition juce_Expression.cpp:212
String symbol
Definition juce_Expression.cpp:225
Term * clone() const
Definition juce_Expression.cpp:208
Type getType() const noexcept
Definition juce_Expression.cpp:207
void renameSymbol(const Symbol &oldSymbol, const String &newName, const Scope &scope, int)
Definition juce_Expression.cpp:219
String toString() const
Definition juce_Expression.cpp:209
TermPtr resolve(const Scope &scope, int recursionDepth)
Definition juce_Expression.cpp:201
SymbolTerm(const String &sym)
Definition juce_Expression.cpp:199
String getName() const
Definition juce_Expression.cpp:210
Definition juce_Expression.h:137
Definition juce_Expression.h:109
virtual Expression getSymbolValue(const String &symbol) const
Definition juce_Expression.cpp:1123
virtual void visitRelativeScope(const String &scopeName, Visitor &visitor) const
Definition juce_Expression.cpp:1165
virtual String getScopeUID() const
Definition juce_Expression.cpp:1170
virtual double evaluateFunction(const String &functionName, const double *parameters, int numParameters) const
Definition juce_Expression.cpp:1131
virtual ~Scope()
Definition juce_Expression.cpp:1121
Scope()
Definition juce_Expression.cpp:1120
Definition juce_Expression.cpp:63
virtual void useSymbol(const Symbol &)=0
virtual ~SymbolVisitor()
Definition juce_Expression.cpp:65
Definition juce_Expression.cpp:27
Term()
Definition juce_Expression.cpp:29
virtual int getOperatorPrecedence() const
Definition juce_Expression.cpp:38
virtual void visitAllSymbols(SymbolVisitor &visitor, const Scope &scope, int recursionDepth)
Definition juce_Expression.cpp:69
virtual void renameSymbol(const Symbol &oldSymbol, const String &newName, const Scope &scope, int recursionDepth)
Definition juce_Expression.cpp:56
virtual String getName() const
Definition juce_Expression.cpp:50
virtual ~Term()
Definition juce_Expression.cpp:30
virtual ReferenceCountedObjectPtr< Term > createTermToEvaluateInput(const Scope &, const Term *, double, Term *) const
Definition juce_Expression.cpp:43
virtual ReferenceCountedObjectPtr< Term > resolve(const Scope &, int recursionDepth)=0
virtual double toDouble() const
Definition juce_Expression.cpp:36
virtual int getNumInputs() const
Definition juce_Expression.cpp:39
virtual Type getType() const noexcept=0
virtual String toString() const =0
virtual ReferenceCountedObjectPtr< Term > negated()
Definition juce_Expression.cpp:1098
virtual Term * clone() const =0
virtual int getInputIndexFor(const Term *) const
Definition juce_Expression.cpp:37
virtual Term * getInput(int) const
Definition juce_Expression.cpp:40
Expression adjustedToGiveNewResult(double targetValue, const Scope &scope) const
Definition juce_Expression.cpp:1021
void findReferencedSymbols(Array< Symbol > &results, const Scope &scope) const
Definition juce_Expression.cpp:1079
static Expression function(const String &functionName, const Array< Expression > ¶meters)
Definition juce_Expression.cpp:1016
String getSymbolOrFunction() const
Definition juce_Expression.cpp:1093
Expression()
Definition juce_Expression.cpp:927
bool usesAnySymbols() const
Definition juce_Expression.cpp:1091
Expression withRenamedSymbol(const Symbol &oldSymbol, const String &newName, const Scope &scope) const
Definition juce_Expression.cpp:1053
Expression operator-(const Expression &) const
Definition juce_Expression.cpp:1010
~Expression()
Definition juce_Expression.cpp:932
Type getType() const noexcept
Definition juce_Expression.cpp:1092
double evaluate() const
Definition juce_Expression.cpp:984
static Expression parse(String::CharPointerType &stringToParse, String &parseError)
Definition juce_Expression.cpp:976
int getNumInputs() const
Definition juce_Expression.cpp:1094
Expression getInput(int index) const
Definition juce_Expression.cpp:1095
bool referencesSymbol(const Symbol &symbol, const Scope &scope) const
Definition juce_Expression.cpp:1065
ReferenceCountedObjectPtr< Term > term
Definition juce_Expression.h:246
static Expression symbol(const String &symbol)
Definition juce_Expression.cpp:1014
Type
Definition juce_Expression.h:219
@ symbolType
Definition juce_Expression.h:223
@ functionType
Definition juce_Expression.h:221
@ constantType
Definition juce_Expression.h:220
@ operatorType
Definition juce_Expression.h:222
String toString() const
Definition juce_Expression.cpp:1090
Definition juce_HeapBlock.h:87
Definition juce_ReferenceCountedObject.h:247
ReferencedType * get() const noexcept
Definition juce_ReferenceCountedObject.h:381
SingleThreadedReferenceCountedObject()=default
Definition juce_String.h:53
CharPointerType getCharPointer() const noexcept
Definition juce_String.h:1153
String trim() const
Definition juce_String.cpp:1656
String toLowerCase() const
Definition juce_String.cpp:1474
static String charToString(juce_wchar character)
Definition juce_String.cpp:359
bool containsOnly(StringRef charactersItMightContain) const noexcept
Definition juce_String.cpp:1796
* e
Definition inflate.c:1404
int * l
Definition inflate.c:1579
struct huft * t
Definition inflate.c:943
unsigned v[N_MAX]
Definition inflate.c:1584
register unsigned i
Definition inflate.c:1575
unsigned s
Definition inflate.c:1555
unsigned f
Definition inflate.c:1572
static const char * name
Definition pugl.h:1582
static uintptr_t parent
Definition pugl.h:1644
CARLA_PLUGIN_EXPORT int clone(int(*)(void *), void *, int, void *,...)
Definition interposer-safe.cpp:46
int val
Definition jpeglib.h:956
Definition carla_juce.cpp:31
constexpr Type jmin(Type a, Type b)
Definition juce_MathsFunctions.h:106
jack_client_t client jack_client_t client jack_client_t client jack_client_t JackInfoShutdownCallback void arg jack_client_t jack_port_t port void(* func)(const char *))
Definition juce_linux_JackAudio.cpp:67
constexpr Type jmax(Type a, Type b)
Definition juce_MathsFunctions.h:94
wchar_t juce_wchar
Definition juce_CharacterFunctions.h:42
void ignoreUnused(Types &&...) noexcept
Definition juce_MathsFunctions.h:333
unsigned char uint8
Definition juce_MathsFunctions.h:37
Definition juce_Uuid.h:141
#define false
Definition ordinals.h:83
Definition juce_Expression.cpp:82
friend class Expression::Term
Definition juce_Expression.cpp:91
static Term * findDestinationFor(Term *const topLevel, const Term *const inputTerm)
Definition juce_Expression.cpp:555
static void checkRecursionDepth(int depth)
Definition juce_Expression.cpp:85
static Constant * findTermToAdjust(Term *const term, const bool mustBeFlagged)
Definition juce_Expression.cpp:572
static bool containsAnySymbols(const Term &t)
Definition juce_Expression.cpp:612
ReferenceCountedObjectPtr< Term > TermPtr
Definition juce_Expression.cpp:83
Definition juce_Expression.h:186
String symbolName
Definition juce_Expression.h:192
String scopeUID
Definition juce_Expression.h:191
Symbol(const String &scopeUID, const String &symbolName)
Definition juce_Expression.cpp:1104
const char * text
Definition swell-functions.h:167
return c
Definition crypt.c:175
int r
Definition crypt.c:458
int result
Definition process.c:1455
#define const
Definition zconf.h:137