/[svn]/linuxsampler/trunk/src/scriptvm/common.h
ViewVC logotype

Diff of /linuxsampler/trunk/src/scriptvm/common.h

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3561 by schoenebeck, Fri Aug 23 11:44:00 2019 UTC revision 3690 by schoenebeck, Fri Jan 3 10:18:21 2020 UTC
# Line 1  Line 1 
1  /*  /*
2   * Copyright (c) 2014-2019 Christian Schoenebeck   * Copyright (c) 2014-2020 Christian Schoenebeck
3   *   *
4   * http://www.linuxsampler.org   * http://www.linuxsampler.org
5   *   *
# Line 19  Line 19 
19  #include <vector>  #include <vector>
20  #include <map>  #include <map>
21  #include <stddef.h> // offsetof()  #include <stddef.h> // offsetof()
22    #include <functional> // std::function<>
23    
24  namespace LinuxSampler {  namespace LinuxSampler {
25    
# Line 37  namespace LinuxSampler { Line 38  namespace LinuxSampler {
38      typedef uint64_t vmuint;      typedef uint64_t vmuint;
39    
40      /**      /**
41       * Native data type used internally by the script engine for floating point       * Native data type used by the script engine both internally for floating
42       * data types. This type is currently not exposed to scripts.       * point data, as well as for all @c real data types used by scripts (i.e.
43         * for all ~foo variables in NKSP scripts).
44       */       */
45      typedef float vmfloat;      typedef float vmfloat;
46    
# Line 64  namespace LinuxSampler { Line 66  namespace LinuxSampler {
66          INT_ARR_EXPR, ///< integer array expression          INT_ARR_EXPR, ///< integer array expression
67          STRING_EXPR, ///< string expression          STRING_EXPR, ///< string expression
68          STRING_ARR_EXPR, ///< string array expression          STRING_ARR_EXPR, ///< string array expression
69            REAL_EXPR, ///< floating point (scalar) expression
70            REAL_ARR_EXPR, ///< floating point array expression
71      };      };
72    
73      /** @brief Result flags of a script statement or script function call.      /** @brief Result flags of a script statement or script function call.
# Line 116  namespace LinuxSampler { Line 120  namespace LinuxSampler {
120          VM_EVENT_HANDLER_NOTE, ///< Note event handler, that is script's "on note ... end on" code block.          VM_EVENT_HANDLER_NOTE, ///< Note event handler, that is script's "on note ... end on" code block.
121          VM_EVENT_HANDLER_RELEASE, ///< Release event handler, that is script's "on release ... end on" code block.          VM_EVENT_HANDLER_RELEASE, ///< Release event handler, that is script's "on release ... end on" code block.
122          VM_EVENT_HANDLER_CONTROLLER, ///< Controller event handler, that is script's "on controller ... end on" code block.          VM_EVENT_HANDLER_CONTROLLER, ///< Controller event handler, that is script's "on controller ... end on" code block.
123            VM_EVENT_HANDLER_RPN, ///< RPN event handler, that is script's "on rpn ... end on" code block.
124            VM_EVENT_HANDLER_NRPN, ///< NRPN event handler, that is script's "on nrpn ... end on" code block.
125      };      };
126    
127      /**      /**
# Line 134  namespace LinuxSampler { Line 140  namespace LinuxSampler {
140      };      };
141    
142      /**      /**
143         * This constant is used for comparison with Unit::unitFactor() to check
144         * whether a number does have any metric unit prefix at all.
145         *
146         * @see Unit::unitFactor()
147         */
148        static const vmfloat VM_NO_FACTOR = vmfloat(1);
149    
150        /**
151       * All measurement unit types supported by this script engine.       * All measurement unit types supported by this script engine.
152       *       *
153       * @e Note: there is no standard unit "cents" here (for pitch/tuning), use       * @e Note: there is no standard unit "cents" here (for pitch/tuning), use
# Line 150  namespace LinuxSampler { Line 164  namespace LinuxSampler {
164          VM_BEL,         ///< Measuring relation between two energy levels (in logarithmic scale). Since we are using it for accoustics, we are always referring to A-weighted Bels (i.e. dBA).          VM_BEL,         ///< Measuring relation between two energy levels (in logarithmic scale). Since we are using it for accoustics, we are always referring to A-weighted Bels (i.e. dBA).
165      };      };
166    
167        //TODO: see Unit::hasUnitFactorEver()
168        enum EverTriState_t {
169            VM_NEVER = 0,
170            VM_MAYBE,
171            VM_ALWAYS,
172        };
173    
174      // just symbol prototyping      // just symbol prototyping
175      class VMIntExpr;      class VMIntExpr;
176        class VMRealExpr;
177      class VMStringExpr;      class VMStringExpr;
178        class VMNumberExpr;
179        class VMArrayExpr;
180      class VMIntArrayExpr;      class VMIntArrayExpr;
181        class VMRealArrayExpr;
182      class VMStringArrayExpr;      class VMStringArrayExpr;
183      class VMParserContext;      class VMParserContext;
184    
185      /** @brief Virtual machine measuring unit.      /** @brief Virtual machine standard measuring unit.
186       *       *
187       * Abstract base class representing standard measurement units throughout       * Abstract base class representing standard measurement units throughout
188       * the script engine. These might be i.e. "dB" (deci Bel) for loudness,       * the script engine. These might be e.g. "dB" (deci Bel) for loudness,
189       * "Hz" (Hertz) for frequencies or "s" for "seconds".       * "Hz" (Hertz) for frequencies or "s" for "seconds". These unit types can
190         * combined with metric prefixes, for instance "kHz" (kilo Hertz),
191         * "us" (micro second), etc.
192       *       *
193       * Originally the script engine only supported abstract integer values for       * Originally the script engine only supported abstract integer values for
194       * controlling any synthesis parameter or built-in function argument or       * controlling any synthesis parameter or built-in function argument or
195       * variable. Under certain situations it makes sense though for an       * variable. Under certain situations it makes sense though for an
196       * instrument script author to provide values in real, standard measurement       * instrument script author to provide values in real, standard measurement
197       * units, for example setting the frequency of some LFO directly to "20Hz".       * units to provide a more natural and intuitive approach for writing
198       * Hence support for standard units in scripts was added as an extension to       * instrument scripts, for example by setting the frequency of some LFO
199       * the NKSP script engine.       * directly to "20Hz" or reducing loudness by "-4.2dB". Hence support for
200         * standard units in scripts was added as an extension to the NKSP script
201         * engine.
202         *
203         * So a unit consists of 1) a sequence of metric prefixes as scale factor
204         * (e.g. "k" for kilo) and 2) the actual unit type (e.g. "Hz" for Hertz).
205         * The unit type is a constant feature of number literals and variables, so
206         * once a variable was declared with a unit type (or no unit type at all)
207         * then that unit type of that variable cannot be changed for the entire
208         * life time of the script. This is different from the unit's metric
209         * prefix(es) of variables which may freely be changed at runtime.
210       */       */
211      class VMUnit {      class VMUnit {
212      public:      public:
213          /**          /**
214           * Returns the metric prefix of this unit. A metric prefix essentially           * Returns the metric prefix(es) of this unit as unit factor. A metric
215           * is just a mathematical scale factor that should be applied to the           * prefix essentially is just a mathematical scale factor that should be
216           * number associated with the measurement unit. Usually a unit either           * applied to the number associated with the measurement unit. Consider
217           * has exactly none or one prefix, but note that there might also be           * a string literal in an NKSP script like '3kHz' where 'k' (kilo) is
218           * units with more than one prefix, for example mdB (mili deci bel)           * the metric prefix, which essentically is a scale factor of 1000.
219           * is used sometimes which has two prefixes. This is an exception though           *
220           * and more than two prefixes is currently not supported by the script           * Usually a unit either has exactly none or one metric prefix, but note
221           * engine.           * that there might also be units with more than one prefix, for example
222             * @c mdB (milli deci Bel) is used sometimes which has two prefixes. The
223             * latter is an exception though and more than two prefixes is currently
224             * not supported by the script engine.
225           *           *
226           * Start iterating over the prefixes of this unit by passing @c 0 as           * The factor returned by this method is the final mathematical factor
227           * argument to this method. The prefixes are terminated with return           * that should be multiplied against the number associated with this
228           * value VM_NO_PREFIX being always the last element.           * unit. This factor results from the sequence of metric prefixes of
229             * this unit.
230           *           *
231           * @param i - index of prefix           * @see MetricPrefix_t, hasUnitFactorNow(), hasUnitFactorEver(),
232           * @returns prefix of requested index or VM_NO_PREFIX otherwise           *      VM_NO_FACTOR
233           * @see unitFactor()           * @returns current metric unit factor
234           */           */
235          virtual MetricPrefix_t unitPrefix(vmuint i) const = 0;          virtual vmfloat unitFactor() const = 0;
236    
237            //TODO: this still needs to be implemented in tree.h/.pp, built-in functions and as 2nd pass of parser appropriately
238            /*virtual*/ EverTriState_t hasUnitFactorEver() const { return VM_NEVER; }
239    
240          /**          /**
241           * Conveniently returns the final mathematical factor that should be           * Whether this unit currently does have any metric unit prefix.
242           * multiplied against the number associated with this unit. This factor           *
243           * results from the sequence of metric prefixes of this unit.           * This is actually just a convenience method which returns @c true if
244             * unitFactor() is not @c 1.0.
245           *           *
246           * @see unitPrefix()           * @see MetricPrefix_t, unitFactor(), hasUnitFactorEver(), VM_NO_FACTOR
247             * @returns @c true if this unit currently has any metric prefix
248           */           */
249          vmfloat unitFactor() const;          bool hasUnitFactorNow() const;
250    
251          /**          /**
252           * This is the actual fundamental measuring unit base type of this unit,           * This is the actual fundamental measuring unit base type of this unit,
253           * which might be either Hertz, second or Bel.           * which might be either Hertz, second or Bel.
254           *           *
255           * @returns standard unit type identifier or VM_NO_UNIT if no unit used           * Note that a number without a unit type may still have metric
256             * prefixes.
257             *
258             * @returns standard unit type identifier or VM_NO_UNIT if no unit type
259             *          is used for this object
260           */           */
261          virtual StdUnit_t unitType() const = 0;          virtual StdUnit_t unitType() const = 0;
262    
# Line 219  namespace LinuxSampler { Line 269  namespace LinuxSampler {
269          /**          /**
270           * Returns the actual mathematical factor represented by the passed           * Returns the actual mathematical factor represented by the passed
271           * two @a prefix1 and @a prefix2 arguments.           * two @a prefix1 and @a prefix2 arguments.
272             *
273             * @returns scale factor of given metric unit prefixes
274           */           */
275          static vmfloat unitFactor(MetricPrefix_t prefix1, MetricPrefix_t prefix2);          static vmfloat unitFactor(MetricPrefix_t prefix1, MetricPrefix_t prefix2);
276    
277            /**
278             * Returns the actual mathematical factor represented by the passed
279             * @a prefixes array. The passed array should always be terminated by a
280             * VM_NO_PREFIX value as last element.
281             *
282             * @param prefixes - sequence of metric prefixes
283             * @param size - max. amount of elements of array @a prefixes
284             * @returns scale factor of given metric unit prefixes
285             */
286            static vmfloat unitFactor(const MetricPrefix_t* prefixes, vmuint size = 2);
287      };      };
288    
289      /** @brief Virtual machine expression      /** @brief Virtual machine expression
# Line 254  namespace LinuxSampler { Line 317  namespace LinuxSampler {
317           * if this expression is i.e. actually a string expression like "12",           * if this expression is i.e. actually a string expression like "12",
318           * calling asInt() will @b not cast that numerical string expression to           * calling asInt() will @b not cast that numerical string expression to
319           * an integer expression 12 for you, instead this method will simply           * an integer expression 12 for you, instead this method will simply
320           * return NULL!           * return NULL! Same applies if this expression is actually a real
321             * number expression: asInt() would return NULL in that case as well.
322           *           *
323           * @see exprType()           * @see exprType(), asReal(), asNumber()
324           */           */
325          VMIntExpr* asInt() const;          VMIntExpr* asInt() const;
326    
327          /**          /**
328             * In case this expression is a real number (floating point) expression,
329             * then this method returns a casted pointer to that VMRealExpr object.
330             * It returns NULL if this expression is not a real number expression.
331             *
332             * @b Note: type casting performed by this method is strict! That means
333             * if this expression is i.e. actually a string expression like "12",
334             * calling asReal() will @b not cast that numerical string expression to
335             * a real number expression 12.0 for you, instead this method will
336             * simply return NULL! Same applies if this expression is actually an
337             * integer expression: asReal() would return NULL in that case as well.
338             *
339             * @see exprType(), asInt(), asNumber()
340             */
341            VMRealExpr* asReal() const;
342    
343            /**
344             * In case this expression is a scalar number expression, that is either
345             * an integer (scalar) expression or a real number (floating point
346             * scalar) expression, then this method returns a casted pointer to that
347             * VMNumberExpr base class object. It returns NULL if this
348             * expression is neither an integer (scalar), nor a real number (scalar)
349             * expression.
350             *
351             * Since the methods asInt() and asReal() are very strict, this method
352             * is provided as convenience access in case only very general
353             * information (e.g. which standard measurement unit is being used or
354             * whether final operator being effective to this expression) is
355             * intended to be retrieved of this scalar number expression independent
356             * from whether this expression is actually an integer or a real number
357             * expression.
358             *
359             * @see exprType(), asInt(), asReal()
360             */
361            VMNumberExpr* asNumber() const;
362    
363            /**
364           * In case this expression is a string expression, then this method           * In case this expression is a string expression, then this method
365           * returns a casted pointer to that VMStringExpr object. It returns NULL           * returns a casted pointer to that VMStringExpr object. It returns NULL
366           * if this expression is not a string expression.           * if this expression is not a string expression.
# Line 281  namespace LinuxSampler { Line 381  namespace LinuxSampler {
381           * returns NULL if this expression is not an integer array expression.           * returns NULL if this expression is not an integer array expression.
382           *           *
383           * @b Note: type casting performed by this method is strict! That means           * @b Note: type casting performed by this method is strict! That means
384           * if this expression is i.e. an integer expression or a string           * if this expression is i.e. an integer scalar expression, a real
385           * expression, calling asIntArray() will @b not cast those scalar           * number expression or a string expression, calling asIntArray() will
386           * expressions to an array expression for you, instead this method will           * @b not cast those expressions to an integer array expression for you,
387           * simply return NULL!           * instead this method will simply return NULL!
388           *           *
389           * @b Note: this method is currently, and in contrast to its other           * @b Note: this method is currently, and in contrast to its other
390           * counter parts, declared as virtual method. Some deriving classes are           * counter parts, declared as virtual method. Some deriving classes are
# Line 299  namespace LinuxSampler { Line 399  namespace LinuxSampler {
399          virtual VMIntArrayExpr* asIntArray() const;          virtual VMIntArrayExpr* asIntArray() const;
400    
401          /**          /**
402             * In case this expression is a real number (floating point) array
403             * expression, then this method returns a casted pointer to that
404             * VMRealArrayExpr object. It returns NULL if this expression is not a
405             * real number array expression.
406             *
407             * @b Note: type casting performed by this method is strict! That means
408             * if this expression is i.e. a real number scalar expression, an
409             * integer expression or a string expression, calling asRealArray() will
410             * @b not cast those scalar expressions to a real number array
411             * expression for you, instead this method will simply return NULL!
412             *
413             * @b Note: this method is currently, and in contrast to its other
414             * counter parts, declared as virtual method. Some deriving classes are
415             * currently using this to override this default implementation in order
416             * to implement an "evaluate now as real number array" behavior. This
417             * has efficiency reasons, however this also currently makes this part
418             * of the API less clean and should thus be addressed in future with
419             * appropriate changes to the API.
420             *
421             * @see exprType()
422             */
423            virtual VMRealArrayExpr* asRealArray() const;
424    
425            /**
426             * This is an alternative to calling either asIntArray() or
427             * asRealArray(). This method here might be used if the fundamental
428             * scalar data type (real or integer) of the array is not relevant,
429             * i.e. for just getting the size of the array. Since all as*() methods
430             * here are very strict regarding type casting, this asArray() method
431             * sometimes can reduce code complexity.
432             *
433             * Likewise calling this method only returns a valid pointer if the
434             * expression is some array type (currently either integer array or real
435             * number array). For any other expression type this method will return
436             * NULL instead.
437             *
438             * @see exprType()
439             */
440            VMArrayExpr* asArray() const;
441    
442            /**
443           * Returns true in case this expression can be considered to be a           * Returns true in case this expression can be considered to be a
444           * constant expression. A constant expression will retain the same           * constant expression. A constant expression will retain the same
445           * value throughout the entire life time of a script and the           * value throughout the entire life time of a script and the
# Line 329  namespace LinuxSampler { Line 470  namespace LinuxSampler {
470          bool isModifyable() const;          bool isModifyable() const;
471      };      };
472    
473        /** @brief Virtual machine scalar number expression
474         *
475         * This is the abstract base class for integer (scalar) expressions and
476         * real number (floating point scalar) expressions of scripts.
477         */
478        class VMNumberExpr : virtual public VMExpr, virtual public VMUnit {
479        public:
480            /**
481             * Returns @c true if the value of this expression should be applied
482             * as final value to the respective destination synthesis chain
483             * parameter.
484             *
485             * This property is somewhat special and dedicated for the purpose of
486             * this expression's (integer or real number) value to be applied as
487             * parameter to the synthesis chain of the sampler (i.e. for altering a
488             * filter cutoff frequency). Now historically and by default all values
489             * of scripts are applied relatively to the sampler's synthesis chain,
490             * that is the synthesis parameter value of a script is multiplied
491             * against other sources for the same synthesis parameter (i.e. an LFO
492             * or a dedicated MIDI controller either hard wired in the engine or
493             * defined by the instrument patch). So by default the resulting actual
494             * final synthesis parameter is a combination of all these sources. This
495             * has the advantage that it creates a very living and dynamic overall
496             * sound.
497             *
498             * However sometimes there are requirements by script authors where this
499             * is not what you want. Therefore the NKSP script engine added a
500             * language extension by prefixing a value in scripts with a @c !
501             * character the value will be defined as being the "final" value of the
502             * destination synthesis parameter, so that causes this value to be
503             * applied exclusively, and the values of all other sources are thus
504             * entirely ignored by the sampler's synthesis core as long as this
505             * value is assigned by the script engine as "final" value for the
506             * requested synthesis parameter.
507             */
508            virtual bool isFinal() const = 0;
509    
510            /**
511             * Calling this method evaluates the expression and returns the value
512             * of the expression as integer. If this scalar number expression is a
513             * real number expression then this method automatically casts the value
514             * from real number to integer.
515             */
516            vmint evalCastInt();
517    
518            /**
519             * Calling this method evaluates the expression and returns the value
520             * of the expression as integer and thus behaves similar to the previous
521             * method, however this overridden method automatically takes unit
522             * prefixes into account and returns a converted value corresponding to
523             * the given unit @a prefix expected by the caller.
524             *
525             * Example: Assume this expression was an integer expression '12kHz'
526             * then calling this method as @c evalCastInt(VM_MILLI) would return
527             * the value @c 12000000.
528             *
529             * @param prefix - measuring unit prefix expected for result by caller
530             */
531            vmint evalCastInt(MetricPrefix_t prefix);
532    
533            /**
534             * This method behaves like the previous method, just that it takes a
535             * measuring unit prefix with two elements (e.g. "milli cents" for
536             * tuning).
537             *
538             * @param prefix1 - 1st measuring unit prefix element expected by caller
539             * @param prefix2 - 2nd measuring unit prefix element expected by caller
540             */
541            vmint evalCastInt(MetricPrefix_t prefix1, MetricPrefix_t prefix2);
542    
543            /**
544             * Calling this method evaluates the expression and returns the value
545             * of the expression as real number. If this scalar number expression is
546             * an integer expression then this method automatically casts the value
547             * from integer to real number.
548             */
549            vmfloat evalCastReal();
550    
551            /**
552             * Calling this method evaluates the expression and returns the value
553             * of the expression as real number and thus behaves similar to the
554             * previous method, however this overridden method automatically takes
555             * unit prefixes into account and returns a converted value
556             * corresponding to the given unit @a prefix expected by the caller.
557             *
558             * Example: Assume this expression was an integer expression '8ms' then
559             * calling this method as @c evalCastReal(VM_NO_PREFIX) would return the
560             * value @c 0.008.
561             *
562             * @param prefix - measuring unit prefix expected for result by caller
563             */
564            vmfloat evalCastReal(MetricPrefix_t prefix);
565    
566            /**
567             * This method behaves like the previous method, just that it takes a
568             * measuring unit prefix with two elements (e.g. "milli cents" for
569             * tuning).
570             *
571             * @param prefix1 - 1st measuring unit prefix element expected by caller
572             * @param prefix2 - 2nd measuring unit prefix element expected by caller
573             */
574            vmfloat evalCastReal(MetricPrefix_t prefix1, MetricPrefix_t prefix2);
575        };
576    
577      /** @brief Virtual machine integer expression      /** @brief Virtual machine integer expression
578       *       *
579       * This is the abstract base class for all expressions inside scripts which       * This is the abstract base class for all expressions inside scripts which
# Line 336  namespace LinuxSampler { Line 581  namespace LinuxSampler {
581       * abstract method evalInt() to return the actual integer result value of       * abstract method evalInt() to return the actual integer result value of
582       * the expression.       * the expression.
583       */       */
584      class VMIntExpr : virtual public VMExpr, virtual public VMUnit {      class VMIntExpr : virtual public VMNumberExpr {
585      public:      public:
586          /**          /**
587           * Returns the result of this expression as integer (scalar) value.           * Returns the result of this expression as integer (scalar) value.
# Line 365  namespace LinuxSampler { Line 610  namespace LinuxSampler {
610           * Returns always INT_EXPR for instances of this class.           * Returns always INT_EXPR for instances of this class.
611           */           */
612          ExprType_t exprType() const OVERRIDE { return INT_EXPR; }          ExprType_t exprType() const OVERRIDE { return INT_EXPR; }
613        };
614    
615        /** @brief Virtual machine real number (floating point scalar) expression
616         *
617         * This is the abstract base class for all expressions inside scripts which
618         * evaluate to a real number (floating point scalar) value. Deriving classes
619         * implement the abstract method evalReal() to return the actual floating
620         * point result value of the expression.
621         */
622        class VMRealExpr : virtual public VMNumberExpr {
623        public:
624          /**          /**
625           * Returns @c true if the value of this expression should be applied           * Returns the result of this expression as real number (floating point
626           * as final value to the respective destination synthesis chain           * scalar) value. This abstract method must be implemented by deriving
627           * parameter.           * classes.
628           *           */
629           * This property is somewhat special and dedicated for the purpose of          virtual vmfloat evalReal() = 0;
630           * this expression's integer value to be applied as parameter to the  
631           * synthesis chain of the sampler (i.e. for altering a filter cutoff          /**
632           * frequency). Now historically and by default all values of scripts are           * Returns the result of this expression as real number (floating point
633           * applied relatively to the sampler's synthesis chain, that is the           * scalar) value and thus behaves similar to the previous method,
634           * synthesis parameter value of a script is multiplied against other           * however this overridden method automatically takes unit prefixes into
635           * sources for the same synthesis parameter (i.e. an LFO or a dedicated           * account and returns a value corresponding to the expected given unit
636           * MIDI controller either hard wired in the engine or defined by the           * @a prefix.
          * instrument patch). So by default the resulting actual final synthesis  
          * parameter is a combination of all these sources. This has the  
          * advantage that it creates a very living and dynamic overall sound.  
637           *           *
638           * However sometimes there are requirements by script authors where this           * @param prefix - default measurement unit prefix expected by caller
          * is not what you want. Therefore the NKSP script engine added a  
          * language extension by prefixing a value in scripts with a @c !  
          * character the value will be defined as being the "final" value of the  
          * destination synthesis parameter, so that causes this value to be  
          * applied exclusively, and the values of all other sources are thus  
          * entirely ignored by the sampler's synthesis core as long as this  
          * value is assigned by the script engine as "final" value for the  
          * requested synthesis parameter.  
639           */           */
640          virtual bool isFinal() const = 0;          vmfloat evalReal(MetricPrefix_t prefix);
641    
642            /**
643             * This method behaves like the previous method, just that it takes
644             * a default measurement prefix with two elements (i.e. "milli cents"
645             * for tuning).
646             */
647            vmfloat evalReal(MetricPrefix_t prefix1, MetricPrefix_t prefix2);
648    
649            /**
650             * Returns always REAL_EXPR for instances of this class.
651             */
652            ExprType_t exprType() const OVERRIDE { return REAL_EXPR; }
653      };      };
654    
655      /** @brief Virtual machine string expression      /** @brief Virtual machine string expression
# Line 433  namespace LinuxSampler { Line 689  namespace LinuxSampler {
689          virtual vmint arraySize() const = 0;          virtual vmint arraySize() const = 0;
690      };      };
691    
692        /** @brief Virtual Machine Number Array Expression
693         *
694         * This is the abstract base class for all expressions which either evaluate
695         * to an integer array or real number array.
696         */
697        class VMNumberArrayExpr : virtual public VMArrayExpr {
698        public:
699            /**
700             * Returns the metric unit factor of the requested array element.
701             *
702             * @param i - array element index (must be between 0 .. arraySize() - 1)
703             * @see VMUnit::unitFactor() for details about metric unit factors
704             */
705            virtual vmfloat unitFactorOfElement(vmuint i) const = 0;
706    
707            /**
708             * Changes the current unit factor of the array element given by element
709             * index @a i.
710             *
711             * @param i - array element index (must be between 0 .. arraySize() - 1)
712             * @param factor - new unit factor to be assigned
713             * @see VMUnit::unitFactor() for details about metric unit factors
714             */
715            virtual void assignElementUnitFactor(vmuint i, vmfloat factor) = 0;
716        };
717    
718      /** @brief Virtual Machine Integer Array Expression      /** @brief Virtual Machine Integer Array Expression
719       *       *
720       * This is the abstract base class for all expressions inside scripts which       * This is the abstract base class for all expressions inside scripts which
# Line 440  namespace LinuxSampler { Line 722  namespace LinuxSampler {
722       * abstract methods arraySize(), evalIntElement() and assignIntElement() to       * abstract methods arraySize(), evalIntElement() and assignIntElement() to
723       * access the individual integer array values.       * access the individual integer array values.
724       */       */
725      class VMIntArrayExpr : virtual public VMArrayExpr {      class VMIntArrayExpr : virtual public VMNumberArrayExpr {
726      public:      public:
727          /**          /**
728           * Returns the (scalar) integer value of the array element given by           * Returns the (scalar) integer value of the array element given by
# Line 465  namespace LinuxSampler { Line 747  namespace LinuxSampler {
747          ExprType_t exprType() const OVERRIDE { return INT_ARR_EXPR; }          ExprType_t exprType() const OVERRIDE { return INT_ARR_EXPR; }
748      };      };
749    
750        /** @brief Virtual Machine Real Number Array Expression
751         *
752         * This is the abstract base class for all expressions inside scripts which
753         * evaluate to an array of real numbers (floating point values). Deriving
754         * classes implement the abstract methods arraySize(), evalRealElement() and
755         * assignRealElement() to access the array's individual real numbers.
756         */
757        class VMRealArrayExpr : virtual public VMNumberArrayExpr {
758        public:
759            /**
760             * Returns the (scalar) real mumber (floating point value) of the array
761             * element given by element index @a i.
762             *
763             * @param i - array element index (must be between 0 .. arraySize() - 1)
764             */
765            virtual vmfloat evalRealElement(vmuint i) = 0;
766    
767            /**
768             * Changes the current value of an element (given by array element
769             * index @a i) of this real number array.
770             *
771             * @param i - array element index (must be between 0 .. arraySize() - 1)
772             * @param value - new real number value to be assigned to that array element
773             */
774            virtual void assignRealElement(vmuint i, vmfloat value) = 0;
775    
776            /**
777             * Returns always REAL_ARR_EXPR for instances of this class.
778             */
779            ExprType_t exprType() const OVERRIDE { return REAL_ARR_EXPR; }
780        };
781    
782      /** @brief Arguments (parameters) for being passed to a built-in script function.      /** @brief Arguments (parameters) for being passed to a built-in script function.
783       *       *
784       * An argument or a set of arguments passed to a script function are       * An argument or a set of arguments passed to a script function are
# Line 488  namespace LinuxSampler { Line 802  namespace LinuxSampler {
802           * argument passed to the function at runtime.           * argument passed to the function at runtime.
803           *           *
804           * @param i - function argument index (indexed from left to right)           * @param i - function argument index (indexed from left to right)
805             * @return requested function argument or NULL if @a i out of bounds
806           */           */
807          virtual VMExpr* arg(vmint i) = 0;          virtual VMExpr* arg(vmint i) = 0;
808      };      };
# Line 545  namespace LinuxSampler { Line 860  namespace LinuxSampler {
860          /**          /**
861           * Script data type of the function's return value. If the function does           * Script data type of the function's return value. If the function does
862           * not return any value (void), then it returns EMPTY_EXPR here.           * not return any value (void), then it returns EMPTY_EXPR here.
863             *
864             * Some functions may have a different return type depending on the
865             * arguments to be passed to this function. That's what the @a args
866             * parameter is for, so that the method implementation can look ahead
867             * of what kind of parameters are going to be passed to the built-in
868             * function later on in order to decide which return value type would
869             * be used and returned by the function accordingly in that case.
870             *
871             * @param args - function arguments going to be passed for executing
872             *               this built-in function later on
873             */
874            virtual ExprType_t returnType(VMFnArgs* args) = 0;
875    
876            /**
877             * Standard measuring unit type of the function's result value
878             * (e.g. second, Hertz).
879             *
880             * Some functions may have a different standard measuring unit type for
881             * their return value depending on the arguments to be passed to this
882             * function. That's what the @a args parameter is for, so that the
883             * method implementation can look ahead of what kind of parameters are
884             * going to be passed to the built-in function later on in order to
885             * decide which return value type would be used and returned by the
886             * function accordingly in that case.
887             *
888             * @param args - function arguments going to be passed for executing
889             *               this built-in function later on
890             * @see Unit for details about standard measuring units
891             */
892            virtual StdUnit_t returnUnitType(VMFnArgs* args) = 0;
893    
894            /**
895             * Whether the result value returned by this built-in function is
896             * considered to be a 'final' value.
897             *
898             * Some functions may have a different 'final' feature for their return
899             * value depending on the arguments to be passed to this function.
900             * That's what the @a args parameter is for, so that the method
901             * implementation can look ahead of what kind of parameters are going to
902             * be passed to the built-in function later on in order to decide which
903             * return value type would be used and returned by the function
904             * accordingly in that case.
905             *
906             * @param args - function arguments going to be passed for executing
907             *               this built-in function later on
908             * @see VMNumberExpr::isFinal() for details about 'final' values
909           */           */
910          virtual ExprType_t returnType() = 0;          virtual bool returnsFinal(VMFnArgs* args) = 0;
911    
912          /**          /**
913           * Minimum amount of function arguments this function accepts. If a           * Minimum amount of function arguments this function accepts. If a
# Line 563  namespace LinuxSampler { Line 924  namespace LinuxSampler {
924          virtual vmint maxAllowedArgs() const = 0;          virtual vmint maxAllowedArgs() const = 0;
925    
926          /**          /**
          * Script data type of the function's @c iArg 'th function argument.  
          * The information provided here is less strong than acceptsArgType().  
          * The parser will compare argument data types provided in scripts by  
          * calling acceptsArgType(). The return value of argType() is used by the  
          * parser instead to show an appropriate parser error which data type  
          * this function usually expects as "default" data type. Reason: a  
          * function may accept multiple data types for a certain function  
          * argument and would automatically cast the passed argument value in  
          * that case to the type it actually needs.  
          *  
          * @param iArg - index of the function argument in question  
          *               (must be between 0 .. maxAllowedArgs() - 1)  
          */  
         virtual ExprType_t argType(vmint iArg) const = 0;  
   
         /**  
927           * This method is called by the parser to check whether arguments           * This method is called by the parser to check whether arguments
928           * passed in scripts to this function are accepted by this function. If           * passed in scripts to this function are accepted by this function. If
929           * a script calls this function with an argument's data type not           * a script calls this function with an argument's data type not
930           * accepted by this function, the parser will throw a parser error. On           * accepted by this function, the parser will throw a parser error.
931           * such errors the data type returned by argType() will be used to           *
932           * assemble an appropriate error message regarding the precise misusage           * The parser will also use this method to assemble a list of actually
933           * of the built-in function.           * supported data types accepted by this built-in function for the
934             * function argument in question, that is to provide an appropriate and
935             * precise parser error message in such cases.
936           *           *
937           * @param iArg - index of the function argument in question           * @param iArg - index of the function argument in question
938           *               (must be between 0 .. maxAllowedArgs() - 1)           *               (must be between 0 .. maxAllowedArgs() - 1)
# Line 630  namespace LinuxSampler { Line 977  namespace LinuxSampler {
977           *           *
978           * @param iArg - index of the function argument in question           * @param iArg - index of the function argument in question
979           *               (must be between 0 .. maxAllowedArgs() - 1)           *               (must be between 0 .. maxAllowedArgs() - 1)
980             * @param type - standard measurement unit data type used for that
981             *               function argument by currently parsed script
982           *           *
983           * @return true if a metric prefix would be accepted for the respective           * @return true if a metric prefix would be accepted for the respective
984           *         function argument by this function           *         function argument by this function
985           *           *
986           * @see MetricPrefix_t           * @see MetricPrefix_t
987           */           */
988          virtual bool acceptsArgUnitPrefix(vmint iArg) const;          virtual bool acceptsArgUnitPrefix(vmint iArg, StdUnit_t type) const;
989    
990          /**          /**
991           * This method is called by the parser to check whether arguments           * This method is called by the parser to check whether arguments
# Line 654  namespace LinuxSampler { Line 1003  namespace LinuxSampler {
1003           * @return true if a "final" value would be accepted for the respective           * @return true if a "final" value would be accepted for the respective
1004           *         function argument by the function           *         function argument by the function
1005           *           *
1006           * @see VMIntExpr::isFinal()           * @see VMNumberExpr::isFinal(), returnsFinal()
1007           */           */
1008          virtual bool acceptsArgFinal(vmint iArg) const;          virtual bool acceptsArgFinal(vmint iArg) const;
1009    
# Line 673  namespace LinuxSampler { Line 1022  namespace LinuxSampler {
1022           */           */
1023          virtual bool modifiesArg(vmint iArg) const = 0;          virtual bool modifiesArg(vmint iArg) const = 0;
1024    
1025            /** @brief Parse-time check of function arguments.
1026             *
1027             * This method is called by the parser to let the built-in function
1028             * perform its own, individual parse time checks on the arguments to be
1029             * passed to the built-in function. So this method is the place for
1030             * implementing custom checks which are very specific to the individual
1031             * built-in function's purpose and its individual requirements.
1032             *
1033             * For instance the built-in 'in_range()' function uses this method to
1034             * check whether the last 2 of their 3 arguments are of same data type
1035             * and if not it triggers a parser error. 'in_range()' also checks
1036             * whether all of its 3 arguments do have the same standard measuring
1037             * unit type and likewise raises a parser error if not.
1038             *
1039             * For less critical issues built-in functions may also raise parser
1040             * warnings instead.
1041             *
1042             * It is recommended that classes implementing (that is overriding) this
1043             * method should always call their super class's implementation of this
1044             * method to ensure their potential parse time checks are always
1045             * performed as well.
1046             *
1047             * @param args - function arguments going to be passed for executing
1048             *               this built-in function later on
1049             * @param err - the parser's error handler to be called by this method
1050             *              implementation to trigger a parser error with the
1051             *              respective error message text
1052             * @param wrn - the parser's warning handler to be called by this method
1053             *              implementation to trigger a parser warning with the
1054             *              respective warning message text
1055             */
1056            virtual void checkArgs(VMFnArgs* args,
1057                                   std::function<void(String)> err,
1058                                   std::function<void(String)> wrn);
1059    
1060          /**          /**
1061           * Implements the actual function execution. This exec() method is           * Implements the actual function execution. This exec() method is
1062           * called by the VM whenever this function implementation shall be           * called by the VM whenever this function implementation shall be
# Line 753  namespace LinuxSampler { Line 1137  namespace LinuxSampler {
1137       *       *
1138       * Refer to DECLARE_VMINT() for example code.       * Refer to DECLARE_VMINT() for example code.
1139       *       *
1140       * @see VMInt32RelPtr, VMInt8RelPtr, DECLARE_VMINT()       * @see VMInt32RelPtr, VMInt16RelPtr, VMInt8RelPtr, DECLARE_VMINT()
1141       */       */
1142      struct VMInt64RelPtr : VMRelPtr, VMIntPtr {      struct VMInt64RelPtr : VMRelPtr, VMIntPtr {
1143          VMInt64RelPtr() {          VMInt64RelPtr() {
# Line 795  namespace LinuxSampler { Line 1179  namespace LinuxSampler {
1179       *       *
1180       * Refer to DECLARE_VMINT() for example code.       * Refer to DECLARE_VMINT() for example code.
1181       *       *
1182       * @see VMInt64RelPtr, VMInt8RelPtr, DECLARE_VMINT()       * @see VMInt64RelPtr, VMInt16RelPtr, VMInt8RelPtr, DECLARE_VMINT()
1183       */       */
1184      struct VMInt32RelPtr : VMRelPtr, VMIntPtr {      struct VMInt32RelPtr : VMRelPtr, VMIntPtr {
1185          VMInt32RelPtr() {          VMInt32RelPtr() {
# Line 817  namespace LinuxSampler { Line 1201  namespace LinuxSampler {
1201          bool isAssignable() const OVERRIDE { return !readonly; }          bool isAssignable() const OVERRIDE { return !readonly; }
1202      };      };
1203    
1204        /** @brief Pointer to built-in VM integer variable (of C/C++ type int16_t).
1205         *
1206         * Used for defining built-in 16 bit integer script variables.
1207         *
1208         * @b CAUTION: You may only use this class for pointing to C/C++ variables
1209         * of type "int16_t" (thus being exactly 16 bit in size). If the C/C++ int
1210         * variable you want to reference is 64 bit in size then you @b must use
1211         * VMInt64RelPtr instead! Respectively for a referenced native variable with
1212         * only 8 bit in size you @b must use VMInt8RelPtr instead!
1213         *
1214         * For efficiency reasons the actual native C/C++ int variable is referenced
1215         * by two components here. The actual native int C/C++ variable in memory
1216         * is dereferenced at VM run-time by taking the @c base pointer dereference
1217         * and adding @c offset bytes. This has the advantage that for a large
1218         * number of built-in int variables, only one (or few) base pointer need
1219         * to be re-assigned before running a script, instead of updating each
1220         * built-in variable each time before a script is executed.
1221         *
1222         * Refer to DECLARE_VMINT() for example code.
1223         *
1224         * @see VMInt64RelPtr, VMInt32RelPtr, VMInt8RelPtr, DECLARE_VMINT()
1225         */
1226        struct VMInt16RelPtr : VMRelPtr, VMIntPtr {
1227            VMInt16RelPtr() {
1228                base   = NULL;
1229                offset = 0;
1230                readonly = false;
1231            }
1232            VMInt16RelPtr(const VMRelPtr& data) {
1233                base   = data.base;
1234                offset = data.offset;
1235                readonly = false;
1236            }
1237            vmint evalInt() OVERRIDE {
1238                return (vmint)*(int16_t*)&(*(uint8_t**)base)[offset];
1239            }
1240            void assign(vmint i) OVERRIDE {
1241                *(int16_t*)&(*(uint8_t**)base)[offset] = (int16_t)i;
1242            }
1243            bool isAssignable() const OVERRIDE { return !readonly; }
1244        };
1245    
1246      /** @brief Pointer to built-in VM integer variable (of C/C++ type int8_t).      /** @brief Pointer to built-in VM integer variable (of C/C++ type int8_t).
1247       *       *
1248       * Used for defining built-in 8 bit integer script variables.       * Used for defining built-in 8 bit integer script variables.
# Line 837  namespace LinuxSampler { Line 1263  namespace LinuxSampler {
1263       *       *
1264       * Refer to DECLARE_VMINT() for example code.       * Refer to DECLARE_VMINT() for example code.
1265       *       *
1266       * @see VMIntRel32Ptr, VMIntRel64Ptr, DECLARE_VMINT()       * @see VMInt16RelPtr, VMIntRel32Ptr, VMIntRel64Ptr, DECLARE_VMINT()
1267       */       */
1268      struct VMInt8RelPtr : VMRelPtr, VMIntPtr {      struct VMInt8RelPtr : VMRelPtr, VMIntPtr {
1269          VMInt8RelPtr() {          VMInt8RelPtr() {
# Line 880  namespace LinuxSampler { Line 1306  namespace LinuxSampler {
1306      #endif      #endif
1307    
1308      /**      /**
1309       * Convenience macro for initializing VMInt64RelPtr, VMInt32RelPtr and       * Convenience macro for initializing VMInt64RelPtr, VMInt32RelPtr,
1310       * VMInt8RelPtr structures. Usage example:       * VMInt16RelPtr and VMInt8RelPtr structures. Usage example:
1311       * @code       * @code
1312       * struct Foo {       * struct Foo {
1313       *   uint8_t a; // native representation of a built-in integer script variable       *   uint8_t a; // native representation of a built-in integer script variable
# Line 934  namespace LinuxSampler { Line 1360  namespace LinuxSampler {
1360    
1361      /**      /**
1362       * Same as DECLARE_VMINT(), but this one defines the VMInt64RelPtr,       * Same as DECLARE_VMINT(), but this one defines the VMInt64RelPtr,
1363       * VMInt32RelPtr and VMInt8RelPtr structures to be of read-only type.       * VMInt32RelPtr, VMInt16RelPtr and VMInt8RelPtr structures to be of
1364       * That means the script parser will abort any script at parser time if the       * read-only type. That means the script parser will abort any script at
1365       * script is trying to modify such a read-only built-in variable.       * parser time if the script is trying to modify such a read-only built-in
1366         * variable.
1367       *       *
1368       * @b NOTE: this is only intended for built-in read-only variables that       * @b NOTE: this is only intended for built-in read-only variables that
1369       * may change during runtime! If your built-in variable's data is rather       * may change during runtime! If your built-in variable's data is rather
# Line 959  namespace LinuxSampler { Line 1386  namespace LinuxSampler {
1386      /** @brief Built-in VM 8 bit integer array variable.      /** @brief Built-in VM 8 bit integer array variable.
1387       *       *
1388       * Used for defining built-in integer array script variables (8 bit per       * Used for defining built-in integer array script variables (8 bit per
1389       * array element). Currently there is no support for any other kind of array       * array element). Currently there is no support for any other kind of
1390       * type. So all integer arrays of scripts use 8 bit data types.       * built-in array type. So all built-in integer arrays accessed by scripts
1391         * use 8 bit data types.
1392       */       */
1393      struct VMInt8Array {      struct VMInt8Array {
1394          int8_t* data;          int8_t* data;
# Line 972  namespace LinuxSampler { Line 1400  namespace LinuxSampler {
1400    
1401      /** @brief Virtual machine script variable.      /** @brief Virtual machine script variable.
1402       *       *
1403       * Common interface for all variables accessed in scripts.       * Common interface for all variables accessed in scripts, independent of
1404         * their precise data type.
1405       */       */
1406      class VMVariable : virtual public VMExpr {      class VMVariable : virtual public VMExpr {
1407      public:      public:
# Line 993  namespace LinuxSampler { Line 1422  namespace LinuxSampler {
1422           */           */
1423          virtual void assignExpr(VMExpr* expr) = 0;          virtual void assignExpr(VMExpr* expr) = 0;
1424      };      };
1425        
1426      /** @brief Dynamically executed variable (abstract base class).      /** @brief Dynamically executed variable (abstract base class).
1427       *       *
1428       * Interface for the implementation of a dynamically generated content of       * Interface for the implementation of a dynamically generated content of
# Line 1067  namespace LinuxSampler { Line 1496  namespace LinuxSampler {
1496       */       */
1497      class VMDynIntVar : virtual public VMDynVar, virtual public VMIntExpr {      class VMDynIntVar : virtual public VMDynVar, virtual public VMIntExpr {
1498      public:      public:
1499          MetricPrefix_t unitPrefix(vmuint i) const OVERRIDE { return VM_NO_PREFIX; }          vmfloat unitFactor() const OVERRIDE { return VM_NO_FACTOR; }
1500          StdUnit_t unitType() const OVERRIDE { return VM_NO_UNIT; }          StdUnit_t unitType() const OVERRIDE { return VM_NO_UNIT; }
1501          bool isFinal() const OVERRIDE { return false; }          bool isFinal() const OVERRIDE { return false; }
1502      };      };
# Line 1141  namespace LinuxSampler { Line 1570  namespace LinuxSampler {
1570    
1571          /**          /**
1572           * Returns a variable name indexed map of all built-in constant script           * Returns a variable name indexed map of all built-in constant script
1573           * variables, which never change their value at runtime.           * variables of integer type, which never change their value at runtime.
1574           */           */
1575          virtual std::map<String,vmint> builtInConstIntVariables() = 0;          virtual std::map<String,vmint> builtInConstIntVariables() = 0;
1576    
1577          /**          /**
1578             * Returns a variable name indexed map of all built-in constant script
1579             * variables of real number (floating point) type, which never change
1580             * their value at runtime.
1581             */
1582            virtual std::map<String,vmfloat> builtInConstRealVariables() = 0;
1583    
1584            /**
1585           * Returns a variable name indexed map of all built-in dynamic variables,           * Returns a variable name indexed map of all built-in dynamic variables,
1586           * which are not simply data stores, rather each one of them executes           * which are not simply data stores, rather each one of them executes
1587           * natively to provide or alter the respective script variable data.           * natively to provide or alter the respective script variable data.
# Line 1349  namespace LinuxSampler { Line 1785  namespace LinuxSampler {
1785              case EMPTY_EXPR: return "empty";              case EMPTY_EXPR: return "empty";
1786              case INT_EXPR: return "integer";              case INT_EXPR: return "integer";
1787              case INT_ARR_EXPR: return "integer array";              case INT_ARR_EXPR: return "integer array";
1788                case REAL_EXPR: return "real number";
1789                case REAL_ARR_EXPR: return "real number array";
1790              case STRING_EXPR: return "string";              case STRING_EXPR: return "string";
1791              case STRING_ARR_EXPR: return "string array";              case STRING_ARR_EXPR: return "string array";
1792          }          }
# Line 1356  namespace LinuxSampler { Line 1794  namespace LinuxSampler {
1794      }      }
1795    
1796      /**      /**
1797         * Returns @c true in case the passed data type is some array data type.
1798         */
1799        inline bool isArray(const ExprType_t& type) {
1800            return type == INT_ARR_EXPR || type == REAL_ARR_EXPR ||
1801                   type == STRING_ARR_EXPR;
1802        }
1803    
1804        /**
1805         * Returns @c true in case the passed data type is some scalar number type
1806         * (i.e. not an array and not a string).
1807         */
1808        inline bool isNumber(const ExprType_t& type) {
1809            return type == INT_EXPR || type == REAL_EXPR;
1810        }
1811    
1812        /**
1813       * Convenience function used for converting an StdUnit_t constant to a       * Convenience function used for converting an StdUnit_t constant to a
1814       * string, i.e. for generating error message by the parser.       * string, i.e. for generating error message by the parser.
1815       */       */
# Line 1468  namespace LinuxSampler { Line 1922  namespace LinuxSampler {
1922          bool isStringLiteral() const; ///< Returns true in case this source token represents a string literal (i.e. "Some text").          bool isStringLiteral() const; ///< Returns true in case this source token represents a string literal (i.e. "Some text").
1923          bool isComment() const; ///< Returns true in case this source token represents a source code comment.          bool isComment() const; ///< Returns true in case this source token represents a source code comment.
1924          bool isPreprocessor() const; ///< Returns true in case this source token represents a preprocessor statement.          bool isPreprocessor() const; ///< Returns true in case this source token represents a preprocessor statement.
1925            bool isMetricPrefix() const;
1926            bool isStdUnit() const;
1927          bool isOther() const; ///< Returns true in case this source token represents anything else not covered by the token types mentioned above.          bool isOther() const; ///< Returns true in case this source token represents anything else not covered by the token types mentioned above.
1928    
1929          // extended types          // extended types
1930          bool isIntegerVariable() const; ///< Returns true in case this source token represents an integer variable name (i.e. "$someIntVariable").          bool isIntegerVariable() const; ///< Returns true in case this source token represents an integer variable name (i.e. "$someIntVariable").
1931            bool isRealVariable() const; ///< Returns true in case this source token represents a floating point variable name (i.e. "~someRealVariable").
1932          bool isStringVariable() const; ///< Returns true in case this source token represents an string variable name (i.e. "\@someStringVariable").          bool isStringVariable() const; ///< Returns true in case this source token represents an string variable name (i.e. "\@someStringVariable").
1933          bool isArrayVariable() const; ///< Returns true in case this source token represents an array variable name (i.e. "%someArryVariable").          bool isIntArrayVariable() const; ///< Returns true in case this source token represents an integer array variable name (i.e. "%someArrayVariable").
1934            bool isRealArrayVariable() const; ///< Returns true in case this source token represents a real number array variable name (i.e. "?someArrayVariable").
1935            bool isArrayVariable() const DEPRECATED_API; ///< Returns true in case this source token represents an @b integer array variable name (i.e. "%someArrayVariable"). @deprecated This method will be removed, use isIntArrayVariable() instead.
1936          bool isEventHandlerName() const; ///< Returns true in case this source token represents an event handler name (i.e. "note", "release", "controller").          bool isEventHandlerName() const; ///< Returns true in case this source token represents an event handler name (i.e. "note", "release", "controller").
1937    
1938          VMSourceToken& operator=(const VMSourceToken& other);          VMSourceToken& operator=(const VMSourceToken& other);

Legend:
Removed from v.3561  
changed lines
  Added in v.3690

  ViewVC Help
Powered by ViewVC