zeoslib  UNKNOWN
 All Files
ZFunctionsMath.pas
Go to the documentation of this file.
1 {*********************************************************}
2 { }
3 { Zeos Database Objects }
4 { Variables classes and interfaces }
5 { }
6 { Originally written by Sergey Seroukhov }
7 { }
8 {*********************************************************}
9 
10 {@********************************************************}
11 { Copyright (c) 1999-2012 Zeos Development Group }
12 { }
13 { License Agreement: }
14 { }
15 { This library is distributed in the hope that it will be }
16 { useful, but WITHOUT ANY WARRANTY; without even the }
17 { implied warranty of MERCHANTABILITY or FITNESS FOR }
18 { A PARTICULAR PURPOSE. See the GNU Lesser General }
19 { Public License for more details. }
20 { }
21 { The source code of the ZEOS Libraries and packages are }
22 { distributed under the Library GNU General Public }
23 { License (see the file COPYING / COPYING.ZEOS) }
24 { with the following modification: }
25 { As a special exception, the copyright holders of this }
26 { library give you permission to link this library with }
27 { independent modules to produce an executable, }
28 { regardless of the license terms of these independent }
29 { modules, and to copy and distribute the resulting }
30 { executable under terms of your choice, provided that }
31 { you also meet, for each linked independent module, }
32 { the terms and conditions of the license of that module. }
33 { An independent module is a module which is not derived }
34 { from or based on this library. If you modify this }
35 { library, you may extend this exception to your version }
36 { of the library, but you are not obligated to do so. }
37 { If you do not wish to do so, delete this exception }
38 { statement from your version. }
39 { }
40 { }
41 { The project web site is located on: }
42 { http://zeos.firmos.at (FORUM) }
43 { http://sourceforge.net/p/zeoslib/tickets/ (BUGTRACKER)}
44 { svn://svn.code.sf.net/p/zeoslib/code-0/trunk (SVN) }
45 { }
46 { http://www.sourceforge.net/projects/zeoslib. }
47 { }
48 { }
49 { Zeos Development Group. }
50 {********************************************************@}
51 
52 unit ZFunctionsMath;
53 
54 interface
55 
56 {$I ZCore.inc}
57 
58 uses
59  SysUtils, ZFunctions, ZExpression, ZVariant;
60 
61 {** Math functions }
62 
63 type
64  {** Implements a E function. }
65  TZEFunction = class (TZAbstractFunction)
66  public
67  function Execute(Stack: TZExecutionStack;
68  VariantManager: IZVariantManager): TZVariant; override;
69  end;
70 
71  {** Implements a PI function. }
72  TZPIFunction = class (TZAbstractFunction)
73  public
74  function Execute(Stack: TZExecutionStack;
75  VariantManager: IZVariantManager): TZVariant; override;
76  end;
77 
78  {** Implements a RND function. }
79  TZRndFunction = class (TZAbstractFunction)
80  public
81  function Execute(Stack: TZExecutionStack;
82  VariantManager: IZVariantManager): TZVariant; override;
83  end;
84 
85  {** Implements a ABS function. }
86  TZAbsFunction = class (TZAbstractFunction)
87  public
88  function Execute(Stack: TZExecutionStack;
89  VariantManager: IZVariantManager): TZVariant; override;
90  end;
91 
92 {** Trigonometric }
93  {** Implements a COS function. }
94  TZCosFunction = class (TZAbstractFunction)
95  public
96  function Execute(Stack: TZExecutionStack;
97  VariantManager: IZVariantManager): TZVariant; override;
98  end;
99 
100  {** Implements a COT function. }
101  TZCotFunction = class (TZAbstractFunction)
102  public
103  function Execute(Stack: TZExecutionStack;
104  VariantManager: IZVariantManager): TZVariant; override;
105  end;
106 
107  {** Implements a SIN function. }
108  TZSinFunction = class (TZAbstractFunction)
109  public
110  function Execute(Stack: TZExecutionStack;
111  VariantManager: IZVariantManager): TZVariant; override;
112  end;
113 
114  {** Implements a TAN function. }
115  TZTanFunction = class (TZAbstractFunction)
116  public
117  function Execute(Stack: TZExecutionStack;
118  VariantManager: IZVariantManager): TZVariant; override;
119  end;
120 
121  {** Implements a ACOS function. }
122  TZAcosFunction = class (TZAbstractFunction)
123  public
124  function Execute(Stack: TZExecutionStack;
125  VariantManager: IZVariantManager): TZVariant; override;
126  end;
127 
128  {** Implements a ASIN function. }
129  TZAsinFunction = class (TZAbstractFunction)
130  public
131  function Execute(Stack: TZExecutionStack;
132  VariantManager: IZVariantManager): TZVariant; override;
133  end;
134 
135  {** Implements a ATAN function. }
136  TZAtanFunction = class (TZAbstractFunction)
137  public
138  function Execute(Stack: TZExecutionStack;
139  VariantManager: IZVariantManager): TZVariant; override;
140  end;
141 
142 {** Rounding }
143  {** Implements a ROUND function. }
144  TZRoundFunction = class (TZAbstractFunction)
145  public
146  function Execute(Stack: TZExecutionStack;
147  VariantManager: IZVariantManager): TZVariant; override;
148  end;
149 
150  {** Implements a TRUNC function. }
151  TZTruncFunction = class (TZAbstractFunction)
152  public
153  function Execute(Stack: TZExecutionStack;
154  VariantManager: IZVariantManager): TZVariant; override;
155  end;
156 
157  {** Implements a INT function. }
158  TZIntFunction = class (TZAbstractFunction)
159  public
160  function Execute(Stack: TZExecutionStack;
161  VariantManager: IZVariantManager): TZVariant; override;
162  end;
163 
164  {** Implements a FRAC function. }
165  TZFracFunction = class (TZAbstractFunction)
166  public
167  function Execute(Stack: TZExecutionStack;
168  VariantManager: IZVariantManager): TZVariant; override;
169  end;
170 
171  {** Implements a CEIL function. }
172  TZCeilFunction = class (TZAbstractFunction)
173  public
174  function Execute(Stack: TZExecutionStack;
175  VariantManager: IZVariantManager): TZVariant; override;
176  end;
177 
178  {** Implements a FLOOR function. }
179  TZFloorFunction = class (TZAbstractFunction)
180  public
181  function Execute(Stack: TZExecutionStack;
182  VariantManager: IZVariantManager): TZVariant; override;
183  end;
184 
185 {** Logarithmic }
186  {** Implements a EXP function. }
187  TZExpFunction = class (TZAbstractFunction)
188  public
189  function Execute(Stack: TZExecutionStack;
190  VariantManager: IZVariantManager): TZVariant; override;
191  end;
192 
193  {** Implements a LOG function. }
194  TZLogFunction = class (TZAbstractFunction)
195  public
196  function Execute(Stack: TZExecutionStack;
197  VariantManager: IZVariantManager): TZVariant; override;
198  end;
199 
200  {** Implements a LOG10 function. }
201  TZLog10Function = class (TZAbstractFunction)
202  public
203  function Execute(Stack: TZExecutionStack;
204  VariantManager: IZVariantManager): TZVariant; override;
205  end;
206 
207  {** Implements a SQR function. }
208  TZSqrFunction = class (TZAbstractFunction)
209  public
210  function Execute(Stack: TZExecutionStack;
211  VariantManager: IZVariantManager): TZVariant; override;
212  end;
213 
214 procedure AddMathFunctions(Functions : TZFunctionsList);
215 
216 implementation
217 
218 uses
219  Math;
220 
221 {$IFDEF FPC}
222  {$HINTS OFF}
223 {$ENDIF}
224 
225 { TZEFunction }
226 
227 {**
228  Executes this function.
229  @param Stack the stack object.
230  @param VariantManager a reference to variant processor object.
231  @returns a function value.
232 }
233 function TZEFunction.Execute(Stack: TZExecutionStack;
234  VariantManager: IZVariantManager): TZVariant;
235 begin
236  CheckParamsCount(Stack, 0);
237  VariantManager.SetAsFloat(Result, Exp(1));
238 end;
239 
240 { TZPIFunction }
241 
242 {**
243  Executes this function.
244  @param Stack the stack object.
245  @param VariantManager a reference to variant processor object.
246  @returns a function value.
247 }
248 function TZPIFunction.Execute(Stack: TZExecutionStack;
249  VariantManager: IZVariantManager): TZVariant;
250 begin
251  CheckParamsCount(Stack, 0);
252  VariantManager.SetAsFloat(Result, PI);
253 end;
254 
255 { TZRndFunction }
256 
257 {**
258  Executes this function.
259  @param Stack the stack object.
260  @param VariantManager a reference to variant processor object.
261  @returns a function value.
262 }
263 function TZRndFunction.Execute(Stack: TZExecutionStack;
264  VariantManager: IZVariantManager): TZVariant;
265 begin
266  CheckParamsCount(Stack, 0);
267  VariantManager.SetAsFloat(Result, Random);
268 end;
269 
270 { TZAbsFunction }
271 
272 {**
273  Executes this function.
274  @param Stack the stack object.
275  @param VariantManager a reference to variant processor object.
276  @returns a function value.
277 }
278 function TZAbsFunction.Execute(Stack: TZExecutionStack;
279  VariantManager: IZVariantManager): TZVariant;
280 var
281  Value: TZVariant;
282 begin
283  CheckParamsCount(Stack, 1);
284  Value := Stack.GetParameter(1);
285  if Value.VType = vtInteger then
286  VariantManager.SetAsInteger(Result, Abs(Value.VInteger))
287  else if Value.VType = vtFloat then
288  VariantManager.SetAsFloat(Result, Abs(Value.VFloat))
289  else
290  Result := Value;
291 end;
292 
293 { TZExpFunction }
294 
295 {**
296  Executes this function.
297  @param Stack the stack object.
298  @param VariantManager a reference to variant processor object.
299  @returns a function value.
300 }
301 function TZExpFunction.Execute(Stack: TZExecutionStack;
302  VariantManager: IZVariantManager): TZVariant;
303 begin
304  CheckParamsCount(Stack, 1);
305  VariantManager.SetAsFloat(Result, Exp(
306  VariantManager.GetAsFloat(Stack.GetParameter(1))));
307 end;
308 
309 { TZLogFunction }
310 
311 {**
312  Executes this function.
313  @param Stack the stack object.
314  @param VariantManager a reference to variant processor object.
315  @returns a function value.
316 }
317 function TZLogFunction.Execute(Stack: TZExecutionStack;
318  VariantManager: IZVariantManager): TZVariant;
319 begin
320  CheckParamsCount(Stack, 1);
321  VariantManager.SetAsFloat(Result, Ln(
322  VariantManager.GetAsFloat(Stack.GetParameter(1))));
323 end;
324 
325 { TZLog10Function }
326 
327 {**
328  Executes this function.
329  @param Stack the stack object.
330  @param VariantManager a reference to variant processor object.
331  @returns a function value.
332 }
333 function TZLog10Function.Execute(Stack: TZExecutionStack;
334  VariantManager: IZVariantManager): TZVariant;
335 begin
336  CheckParamsCount(Stack, 1);
337  VariantManager.SetAsFloat(Result, Log10(
338  VariantManager.GetAsFloat(Stack.GetParameter(1))));
339 end;
340 
341 { TZCosFunction }
342 
343 {**
344  Executes this function.
345  @param Stack the stack object.
346  @param VariantManager a reference to variant processor object.
347  @returns a function value.
348 }
349 function TZCosFunction.Execute(Stack: TZExecutionStack;
350  VariantManager: IZVariantManager): TZVariant;
351 begin
352  CheckParamsCount(Stack, 1);
353  VariantManager.SetAsFloat(Result, Cos(
354  VariantManager.GetAsFloat(Stack.GetParameter(1))));
355 end;
356 
357 { TZCotFunction }
358 
359 {**
360  Executes this function.
361  @param Stack the stack object.
362  @param VariantManager a reference to variant processor object.
363  @returns a function value.
364 }
365 function TZCotFunction.Execute(Stack: TZExecutionStack;
366  VariantManager: IZVariantManager): TZVariant;
367 begin
368  CheckParamsCount(Stack, 1);
369  VariantManager.SetAsFloat(Result, Cotan(
370  VariantManager.GetAsFloat(Stack.GetParameter(1))));
371 end;
372 
373 { TZSinFunction }
374 
375 {**
376  Executes this function.
377  @param Stack the stack object.
378  @param VariantManager a reference to variant processor object.
379  @returns a function value.
380 }
381 function TZSinFunction.Execute(Stack: TZExecutionStack;
382  VariantManager: IZVariantManager): TZVariant;
383 begin
384  CheckParamsCount(Stack, 1);
385  VariantManager.SetAsFloat(Result, Sin(
386  VariantManager.GetAsFloat(Stack.GetParameter(1))));
387 end;
388 
389 { TZTanFunction }
390 
391 {**
392  Executes this function.
393  @param Stack the stack object.
394  @param VariantManager a reference to variant processor object.
395  @returns a function value.
396 }
397 function TZTanFunction.Execute(Stack: TZExecutionStack;
398  VariantManager: IZVariantManager): TZVariant;
399 begin
400  CheckParamsCount(Stack, 1);
401  VariantManager.SetAsFloat(Result, Tan(
402  VariantManager.GetAsFloat(Stack.GetParameter(1))));
403 end;
404 
405 { TZAcosFunction }
406 
407 {**
408  Executes this function.
409  @param Stack the stack object.
410  @param VariantManager a reference to variant processor object.
411  @returns a function value.
412 }
413 function TZAcosFunction.Execute(Stack: TZExecutionStack;
414  VariantManager: IZVariantManager): TZVariant;
415 begin
416  CheckParamsCount(Stack, 1);
417  VariantManager.SetAsFloat(Result, ArcCos(
418  VariantManager.GetAsFloat(Stack.GetParameter(1))));
419 end;
420 
421 { TZAsinFunction }
422 
423 {**
424  Executes this function.
425  @param Stack the stack object.
426  @param VariantManager a reference to variant processor object.
427  @returns a function value.
428 }
429 function TZAsinFunction.Execute(Stack: TZExecutionStack;
430  VariantManager: IZVariantManager): TZVariant;
431 begin
432  CheckParamsCount(Stack, 1);
433  VariantManager.SetAsFloat(Result, ArcSin(
434  VariantManager.GetAsFloat(Stack.GetParameter(1))));
435 end;
436 
437 { TZAtanFunction }
438 
439 {**
440  Executes this function.
441  @param Stack the stack object.
442  @param VariantManager a reference to variant processor object.
443  @returns a function value.
444 }
445 function TZAtanFunction.Execute(Stack: TZExecutionStack;
446  VariantManager: IZVariantManager): TZVariant;
447 begin
448  CheckParamsCount(Stack, 1);
449  VariantManager.SetAsFloat(Result, ArcTan(
450  VariantManager.GetAsFloat(Stack.GetParameter(1))));
451 end;
452 
453 { TZCeilFunction }
454 
455 {**
456  Executes this function.
457  @param Stack the stack object.
458  @param VariantManager a reference to variant processor object.
459  @returns a function value.
460 }
461 function TZCeilFunction.Execute(Stack: TZExecutionStack;
462  VariantManager: IZVariantManager): TZVariant;
463 begin
464  CheckParamsCount(Stack, 1);
465  VariantManager.SetAsInteger(Result, Ceil(
466  VariantManager.GetAsFloat(Stack.GetParameter(1))));
467 end;
468 
469 { TZFloorFunction }
470 
471 {**
472  Executes this function.
473  @param Stack the stack object.
474  @param VariantManager a reference to variant processor object.
475  @returns a function value.
476 }
477 function TZFloorFunction.Execute(Stack: TZExecutionStack;
478  VariantManager: IZVariantManager): TZVariant;
479 begin
480  CheckParamsCount(Stack, 1);
481  VariantManager.SetAsInteger(Result, Floor(
482  VariantManager.GetAsFloat(Stack.GetParameter(1))));
483 end;
484 
485 { TZRoundFunction }
486 
487 {**
488  Executes this function.
489  @param Stack the stack object.
490  @param VariantManager a reference to variant processor object.
491  @returns a function value.
492 }
493 function TZRoundFunction.Execute(Stack: TZExecutionStack;
494  VariantManager: IZVariantManager): TZVariant;
495 begin
496  CheckParamsCount(Stack, 1);
497  VariantManager.SetAsInteger(Result, Round(VariantManager.GetAsFloat(Stack.GetParameter(1))));
498 end;
499 
500 { TZTruncFunction }
501 
502 {**
503  Executes this function.
504  @param Stack the stack object.
505  @param VariantManager a reference to variant processor object.
506  @returns a function value.
507 }
508 function TZTruncFunction.Execute(Stack: TZExecutionStack;
509  VariantManager: IZVariantManager): TZVariant;
510 begin
511  CheckParamsCount(Stack, 1);
512  VariantManager.SetAsInteger(Result, Trunc(VariantManager.GetAsFloat(Stack.GetParameter(1))));
513 end;
514 
515 { TZIntFunction }
516 
517 {**
518  Executes this function.
519  @param Stack the stack object.
520  @param VariantManager a reference to variant processor object.
521  @returns a function value.
522 }
523 function TZIntFunction.Execute(Stack: TZExecutionStack;
524  VariantManager: IZVariantManager): TZVariant;
525 begin
526  CheckParamsCount(Stack, 1);
527  VariantManager.SetAsFloat(Result, Int(VariantManager.GetAsFloat(Stack.GetParameter(1))));
528 end;
529 
530 { TZFracFunction }
531 
532 {**
533  Executes this function.
534  @param Stack the stack object.
535  @param VariantManager a reference to variant processor object.
536  @returns a function value.
537 }
538 function TZFracFunction.Execute(Stack: TZExecutionStack;
539  VariantManager: IZVariantManager): TZVariant;
540 begin
541  CheckParamsCount(Stack, 1);
542  VariantManager.SetAsFloat(Result, Frac(VariantManager.GetAsFloat(Stack.GetParameter(1))));
543 end;
544 
545 { TZSqrFunction }
546 
547 {**
548  Executes this function.
549  @param Stack the stack object.
550  @param VariantManager a reference to variant processor object.
551  @returns a function value.
552 }
553 function TZSqrFunction.Execute(Stack: TZExecutionStack;
554  VariantManager: IZVariantManager): TZVariant;
555 begin
556  CheckParamsCount(Stack, 1);
557  VariantManager.SetAsFloat(Result, Sqrt(
558  VariantManager.GetAsFloat(Stack.GetParameter(1))));
559 end;
560 
561 procedure AddMathFunctions(Functions : TZFunctionsList);
562 begin
563  Functions.Add(TZEFunction.Create('E'));
564  Functions.Add(TZPIFunction.Create('PI'));
565  Functions.Add(TZRndFunction.Create('RND'));
566  Functions.Add(TZAbsFunction.Create('ABS'));
567  Functions.Add(TZExpFunction.Create('EXP'));
568  Functions.Add(TZLogFunction.Create('LOG'));
569  Functions.Add(TZLog10Function.Create('LOG10'));
570  Functions.Add(TZCosFunction.Create('COS'));
571  Functions.Add(TZSinFunction.Create('SIN'));
572  Functions.Add(TZTanFunction.Create('TAN'));
573  Functions.Add(TZCotFunction.Create('COT'));
574  Functions.Add(TZAcosFunction.Create('ACOS'));
575  Functions.Add(TZAsinFunction.Create('ASIN'));
576  Functions.Add(TZAtanFunction.Create('ATAN'));
577  Functions.Add(TZRoundFunction.Create('ROUND'));
578  Functions.Add(TZCeilFunction.Create('CEIL'));
579  Functions.Add(TZFloorFunction.Create('FLOOR'));
580  Functions.Add(TZIntFunction.Create('INT'));
581  Functions.Add(TZTruncFunction.Create('TRUNC'));
582  Functions.Add(TZFracFunction.Create('FRAC'));
583  Functions.Add(TZSqrFunction.Create('SQR'));
584  Functions.Add(TZSqrFunction.Create('SQRT'));
585 end;
586 
587 end.