00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef LATTICES_LATTICEEXPRNODE_H
00029 #define LATTICES_LATTICEEXPRNODE_H
00030
00031
00032
00033 #include <casacore/casa/aips.h>
00034 #include <casacore/lattices/LEL/LELInterface.h>
00035 #include <casacore/lattices/LEL/LELAttribute.h>
00036 #include <casacore/lattices/LEL/LELBinaryEnums.h>
00037 #include <casacore/lattices/LEL/LELUnaryEnums.h>
00038 #include <casacore/lattices/LEL/LELFunctionEnums.h>
00039 #include <casacore/casa/Arrays/IPosition.h>
00040 #include <casacore/casa/Utilities/CountedPtr.h>
00041 #include <casacore/casa/Utilities/DataType.h>
00042
00043 namespace casacore {
00044
00045
00046 template <class T> class LatticeExpr;
00047 template <class T> class Lattice;
00048 template <class T> class MaskedLattice;
00049 template <class T> class Array;
00050 template <class T> class Block;
00051 class LCRegion;
00052 class Slicer;
00053 class LattRegionHolder;
00054 class LatticeExprNode;
00055
00056
00057
00058
00059
00060 LatticeExprNode operator+ (const LatticeExprNode& expr);
00061 LatticeExprNode operator- (const LatticeExprNode& expr);
00062 LatticeExprNode operator! (const LatticeExprNode& expr);
00063
00064
00065
00066
00067 LatticeExprNode operator+ (const LatticeExprNode& left,
00068 const LatticeExprNode& right);
00069 LatticeExprNode operator- (const LatticeExprNode& left,
00070 const LatticeExprNode& right);
00071 LatticeExprNode operator* (const LatticeExprNode& left,
00072 const LatticeExprNode& right);
00073 LatticeExprNode operator/ (const LatticeExprNode& left,
00074 const LatticeExprNode& right);
00075 LatticeExprNode operator% (const LatticeExprNode& left,
00076 const LatticeExprNode& right);
00077 LatticeExprNode operator^ (const LatticeExprNode& left,
00078 const LatticeExprNode& right);
00079
00080
00081
00082
00083 LatticeExprNode operator== (const LatticeExprNode& left,
00084 const LatticeExprNode& right);
00085 LatticeExprNode operator> (const LatticeExprNode& left,
00086 const LatticeExprNode& right);
00087 LatticeExprNode operator>= (const LatticeExprNode& left,
00088 const LatticeExprNode& right);
00089 LatticeExprNode operator< (const LatticeExprNode& left,
00090 const LatticeExprNode& right);
00091 LatticeExprNode operator<= (const LatticeExprNode& left,
00092 const LatticeExprNode& right);
00093 LatticeExprNode operator!= (const LatticeExprNode& left,
00094 const LatticeExprNode& right);
00095
00096
00097
00098
00099 LatticeExprNode operator&& (const LatticeExprNode& left,
00100 const LatticeExprNode& right);
00101 LatticeExprNode operator|| (const LatticeExprNode& left,
00102 const LatticeExprNode& right);
00103
00104
00105
00106
00107 LatticeExprNode sin (const LatticeExprNode& expr);
00108 LatticeExprNode sinh (const LatticeExprNode& expr);
00109 LatticeExprNode asin (const LatticeExprNode& expr);
00110 LatticeExprNode cos (const LatticeExprNode& expr);
00111 LatticeExprNode cosh (const LatticeExprNode& expr);
00112 LatticeExprNode acos (const LatticeExprNode& expr);
00113 LatticeExprNode tan (const LatticeExprNode& expr);
00114 LatticeExprNode tanh (const LatticeExprNode& expr);
00115 LatticeExprNode atan (const LatticeExprNode& expr);
00116 LatticeExprNode exp (const LatticeExprNode& expr);
00117 LatticeExprNode log (const LatticeExprNode& expr);
00118 LatticeExprNode log10(const LatticeExprNode& expr);
00119 LatticeExprNode sqrt (const LatticeExprNode& expr);
00120 LatticeExprNode sign (const LatticeExprNode& expr);
00121 LatticeExprNode round(const LatticeExprNode& expr);
00122 LatticeExprNode ceil (const LatticeExprNode& expr);
00123 LatticeExprNode floor(const LatticeExprNode& expr);
00124 LatticeExprNode conj (const LatticeExprNode& expr);
00125
00126
00127
00128
00129 LatticeExprNode atan2 (const LatticeExprNode& left,
00130 const LatticeExprNode& right);
00131 LatticeExprNode pow (const LatticeExprNode& left,
00132 const LatticeExprNode& right);
00133 LatticeExprNode fmod (const LatticeExprNode& left,
00134 const LatticeExprNode& right);
00135 LatticeExprNode min (const LatticeExprNode& left,
00136 const LatticeExprNode& right);
00137 LatticeExprNode max (const LatticeExprNode& left,
00138 const LatticeExprNode& right);
00139
00140
00141
00142 LatticeExprNode formComplex (const LatticeExprNode& left,
00143 const LatticeExprNode& right);
00144
00145
00146
00147
00148 LatticeExprNode abs (const LatticeExprNode& expr);
00149 LatticeExprNode arg (const LatticeExprNode& expr);
00150 LatticeExprNode real (const LatticeExprNode& expr);
00151 LatticeExprNode imag (const LatticeExprNode& expr);
00152
00153
00154
00155
00156
00157 LatticeExprNode min (const LatticeExprNode& expr);
00158 LatticeExprNode max (const LatticeExprNode& expr);
00159 LatticeExprNode sum (const LatticeExprNode& expr);
00160 LatticeExprNode median (const LatticeExprNode& expr);
00161 LatticeExprNode mean (const LatticeExprNode& expr);
00162 LatticeExprNode variance (const LatticeExprNode& expr);
00163 LatticeExprNode stddev (const LatticeExprNode& expr);
00164 LatticeExprNode avdev (const LatticeExprNode& expr);
00165
00166
00167
00168
00169
00170 LatticeExprNode fractile (const LatticeExprNode& expr,
00171 const LatticeExprNode& fraction);
00172
00173
00174
00175
00176
00177
00178
00179 LatticeExprNode fractileRange (const LatticeExprNode& expr,
00180 const LatticeExprNode& fraction1,
00181 const LatticeExprNode& fraction2);
00182 LatticeExprNode fractileRange (const LatticeExprNode& expr,
00183 const LatticeExprNode& fraction);
00184
00185
00186
00187
00188
00189 LatticeExprNode nelements (const LatticeExprNode& expr);
00190
00191
00192
00193
00194 LatticeExprNode ndim (const LatticeExprNode& expr);
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204 LatticeExprNode length (const LatticeExprNode& expr,
00205 const LatticeExprNode& axis);
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216 LatticeExprNode indexin (const LatticeExprNode& axis,
00217 const LatticeExprNode& indexFlags);
00218
00219
00220
00221
00222 LatticeExprNode rebin (const LatticeExprNode& expr,
00223 const LatticeExprNode& bin);
00224
00225
00226 LatticeExprNode isNaN (const LatticeExprNode& expr);
00227
00228
00229
00230
00231
00232
00233 LatticeExprNode any (const LatticeExprNode& expr);
00234 LatticeExprNode all (const LatticeExprNode& expr);
00235 LatticeExprNode ntrue (const LatticeExprNode& expr);
00236 LatticeExprNode nfalse(const LatticeExprNode& expr);
00237
00238
00239
00240
00241 LatticeExprNode mask (const LatticeExprNode& expr);
00242
00243
00244 LatticeExprNode value (const LatticeExprNode& expr);
00245
00246
00247
00248
00249 LatticeExprNode amp (const LatticeExprNode& left,
00250 const LatticeExprNode& right);
00251
00252
00253
00254
00255 LatticeExprNode pa (const LatticeExprNode& left,
00256 const LatticeExprNode& right);
00257
00258
00259
00260 LatticeExprNode spectralindex (const LatticeExprNode& left,
00261 const LatticeExprNode& right);
00262
00263
00264
00265
00266
00267 LatticeExprNode iif (const LatticeExprNode& condition,
00268 const LatticeExprNode& arg1,
00269 const LatticeExprNode& arg2);
00270
00271
00272
00273
00274
00275
00276 LatticeExprNode replace (const LatticeExprNode& arg1,
00277 const LatticeExprNode& arg2);
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288 LatticeExprNode toFloat (const LatticeExprNode& expr);
00289 LatticeExprNode toDouble (const LatticeExprNode& expr);
00290 LatticeExprNode toComplex (const LatticeExprNode& expr);
00291 LatticeExprNode toDComplex(const LatticeExprNode& expr);
00292 LatticeExprNode toBool (const LatticeExprNode& expr);
00293 LatticeExprNode convertType (const LatticeExprNode& expr, const Float*);
00294 LatticeExprNode convertType (const LatticeExprNode& expr, const Double*);
00295 LatticeExprNode convertType (const LatticeExprNode& expr, const Complex*);
00296 LatticeExprNode convertType (const LatticeExprNode& expr, const DComplex*);
00297 LatticeExprNode convertType (const LatticeExprNode& expr, const Bool*);
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440 class LatticeExprNode
00441 {
00442
00443
00444 friend LatticeExprNode operator+ (const LatticeExprNode& expr);
00445 friend LatticeExprNode operator- (const LatticeExprNode& expr);
00446 friend LatticeExprNode operator! (const LatticeExprNode& expr);
00447 friend LatticeExprNode operator+ (const LatticeExprNode& left,
00448 const LatticeExprNode& right);
00449 friend LatticeExprNode operator- (const LatticeExprNode& left,
00450 const LatticeExprNode& right);
00451 friend LatticeExprNode operator* (const LatticeExprNode& left,
00452 const LatticeExprNode& right);
00453 friend LatticeExprNode operator/ (const LatticeExprNode& left,
00454 const LatticeExprNode& right);
00455 friend LatticeExprNode operator% (const LatticeExprNode& left,
00456 const LatticeExprNode& right);
00457 friend LatticeExprNode operator^ (const LatticeExprNode& left,
00458 const LatticeExprNode& right);
00459 friend LatticeExprNode operator== (const LatticeExprNode& left,
00460 const LatticeExprNode& right);
00461 friend LatticeExprNode operator> (const LatticeExprNode& left,
00462 const LatticeExprNode& right);
00463 friend LatticeExprNode operator>= (const LatticeExprNode& left,
00464 const LatticeExprNode& right);
00465 friend LatticeExprNode operator< (const LatticeExprNode& left,
00466 const LatticeExprNode& right);
00467 friend LatticeExprNode operator<= (const LatticeExprNode& left,
00468 const LatticeExprNode& right);
00469 friend LatticeExprNode operator!= (const LatticeExprNode& left,
00470 const LatticeExprNode& right);
00471 friend LatticeExprNode operator&& (const LatticeExprNode& left,
00472 const LatticeExprNode& right);
00473 friend LatticeExprNode operator|| (const LatticeExprNode& left,
00474 const LatticeExprNode& right);
00475 friend LatticeExprNode sin (const LatticeExprNode& expr);
00476 friend LatticeExprNode sinh (const LatticeExprNode& expr);
00477 friend LatticeExprNode asin (const LatticeExprNode& expr);
00478 friend LatticeExprNode cos (const LatticeExprNode& expr);
00479 friend LatticeExprNode cosh (const LatticeExprNode& expr);
00480 friend LatticeExprNode acos (const LatticeExprNode& expr);
00481 friend LatticeExprNode tan (const LatticeExprNode& expr);
00482 friend LatticeExprNode tanh (const LatticeExprNode& expr);
00483 friend LatticeExprNode atan (const LatticeExprNode& expr);
00484 friend LatticeExprNode exp (const LatticeExprNode& expr);
00485 friend LatticeExprNode log (const LatticeExprNode& expr);
00486 friend LatticeExprNode log10(const LatticeExprNode& expr);
00487 friend LatticeExprNode sqrt (const LatticeExprNode& expr);
00488 friend LatticeExprNode sign (const LatticeExprNode& expr);
00489 friend LatticeExprNode round(const LatticeExprNode& expr);
00490 friend LatticeExprNode ceil (const LatticeExprNode& expr);
00491 friend LatticeExprNode floor(const LatticeExprNode& expr);
00492 friend LatticeExprNode conj (const LatticeExprNode& expr);
00493 friend LatticeExprNode atan2 (const LatticeExprNode& left,
00494 const LatticeExprNode& right);
00495 friend LatticeExprNode pow (const LatticeExprNode& left,
00496 const LatticeExprNode& right);
00497 friend LatticeExprNode fmod (const LatticeExprNode& left,
00498 const LatticeExprNode& right);
00499 friend LatticeExprNode min (const LatticeExprNode& left,
00500 const LatticeExprNode& right);
00501 friend LatticeExprNode max (const LatticeExprNode& left,
00502 const LatticeExprNode& right);
00503 friend LatticeExprNode formComplex (const LatticeExprNode& left,
00504 const LatticeExprNode& right);
00505 friend LatticeExprNode abs (const LatticeExprNode& expr);
00506 friend LatticeExprNode arg (const LatticeExprNode& expr);
00507 friend LatticeExprNode real (const LatticeExprNode& expr);
00508 friend LatticeExprNode imag (const LatticeExprNode& expr);
00509 friend LatticeExprNode min (const LatticeExprNode& expr);
00510 friend LatticeExprNode max (const LatticeExprNode& expr);
00511 friend LatticeExprNode sum (const LatticeExprNode& expr);
00512 friend LatticeExprNode median (const LatticeExprNode& expr);
00513 friend LatticeExprNode mean (const LatticeExprNode& expr);
00514 friend LatticeExprNode variance (const LatticeExprNode& expr);
00515 friend LatticeExprNode stddev (const LatticeExprNode& expr);
00516 friend LatticeExprNode avdev (const LatticeExprNode& expr);
00517 friend LatticeExprNode fractile (const LatticeExprNode& expr,
00518 const LatticeExprNode& fraction);
00519 friend LatticeExprNode fractileRange (const LatticeExprNode& expr,
00520 const LatticeExprNode& fraction1,
00521 const LatticeExprNode& fraction2);
00522 friend LatticeExprNode fractileRange (const LatticeExprNode& expr,
00523 const LatticeExprNode& fraction);
00524 friend LatticeExprNode nelements (const LatticeExprNode& expr);
00525 friend LatticeExprNode ndim (const LatticeExprNode& expr);
00526 friend LatticeExprNode length (const LatticeExprNode& expr,
00527 const LatticeExprNode& axis);
00528 friend LatticeExprNode indexin (const LatticeExprNode& axis,
00529 const LatticeExprNode& indexFlags);
00530 friend LatticeExprNode rebin (const LatticeExprNode& expr,
00531 const LatticeExprNode& bin);
00532 friend LatticeExprNode isNaN (const LatticeExprNode& expr);
00533 friend LatticeExprNode any (const LatticeExprNode& expr);
00534 friend LatticeExprNode all (const LatticeExprNode& expr);
00535 friend LatticeExprNode ntrue (const LatticeExprNode& expr);
00536 friend LatticeExprNode nfalse(const LatticeExprNode& expr);
00537 friend LatticeExprNode mask (const LatticeExprNode& expr);
00538 friend LatticeExprNode value (const LatticeExprNode& expr);
00539 friend LatticeExprNode amp (const LatticeExprNode& left,
00540 const LatticeExprNode& right);
00541 friend LatticeExprNode pa (const LatticeExprNode& left,
00542 const LatticeExprNode& right);
00543 friend LatticeExprNode spectralindex (const LatticeExprNode& left,
00544 const LatticeExprNode& right);
00545 friend LatticeExprNode iif (const LatticeExprNode& condition,
00546 const LatticeExprNode& arg1,
00547 const LatticeExprNode& arg2);
00548 friend LatticeExprNode replace (const LatticeExprNode& arg1,
00549 const LatticeExprNode& arg2);
00550 friend LatticeExprNode toFloat (const LatticeExprNode& expr);
00551 friend LatticeExprNode toDouble (const LatticeExprNode& expr);
00552 friend LatticeExprNode toComplex (const LatticeExprNode& expr);
00553 friend LatticeExprNode toDComplex(const LatticeExprNode& expr);
00554 friend LatticeExprNode toBool (const LatticeExprNode& expr);
00555
00556
00557 public:
00558
00559
00560 LatticeExprNode();
00561
00562
00563
00564 LatticeExprNode (Int64 constant);
00565 LatticeExprNode (Int constant);
00566 LatticeExprNode (uInt constant);
00567 LatticeExprNode (Long constant);
00568 LatticeExprNode (Float constant);
00569 LatticeExprNode (Double constant);
00570 LatticeExprNode (const Complex& constant);
00571 LatticeExprNode (const DComplex& constant);
00572 LatticeExprNode (Bool constant);
00573
00574
00575
00576 LatticeExprNode (const IPosition&);
00577
00578
00579
00580 LatticeExprNode (const Lattice<Float>& lattice);
00581 LatticeExprNode (const Lattice<Double>& lattice);
00582 LatticeExprNode (const Lattice<Complex>& lattice);
00583 LatticeExprNode (const Lattice<DComplex>& lattice);
00584 LatticeExprNode (const Lattice<Bool>& lattice);
00585 LatticeExprNode (const MaskedLattice<Float>& lattice);
00586 LatticeExprNode (const MaskedLattice<Double>& lattice);
00587 LatticeExprNode (const MaskedLattice<Complex>& lattice);
00588 LatticeExprNode (const MaskedLattice<DComplex>& lattice);
00589 LatticeExprNode (const MaskedLattice<Bool>& lattice);
00590
00591
00592
00593
00594
00595 LatticeExprNode (const LCRegion& region);
00596 LatticeExprNode (const Slicer& slicer);
00597 LatticeExprNode (const LattRegionHolder& region);
00598
00599
00600
00601
00602 LatticeExprNode operator[] (const LatticeExprNode& cond) const;
00603
00604
00605 LatticeExprNode (const LatticeExprNode& other);
00606
00607
00608 virtual ~LatticeExprNode();
00609
00610
00611 LatticeExprNode& operator= (const LatticeExprNode& other);
00612
00613
00614
00615 const IPosition& getIPosition() const;
00616
00617
00618
00619 CountedPtr<LELInterface<Float> > makeFloat() const;
00620 CountedPtr<LELInterface<Double> > makeDouble() const;
00621 CountedPtr<LELInterface<Complex> > makeComplex() const;
00622 CountedPtr<LELInterface<DComplex> > makeDComplex() const;
00623 CountedPtr<LELInterface<Bool> > makeBool() const;
00624
00625
00626
00627
00628
00629
00630 void eval (LELArray<Float>& result, const Slicer& section) const;
00631 void eval (LELArray<Double>& result, const Slicer& section) const;
00632 void eval (LELArray<Complex>& result, const Slicer& section) const;
00633 void eval (LELArray<DComplex>& result, const Slicer& section) const;
00634 void eval (LELArray<Bool>& result, const Slicer& section) const;
00635
00636
00637
00638
00639
00640
00641
00642
00643 void evalRef (LELArrayRef<Float>& result, const Slicer& section) const
00644 { pExprFloat_p->evalRef (result, section); }
00645 void evalRef (LELArrayRef<Double>& result, const Slicer& section) const
00646 { pExprDouble_p->evalRef (result, section); }
00647 void evalRef (LELArrayRef<Complex>& result, const Slicer& section) const
00648 { pExprComplex_p->evalRef (result, section); }
00649 void evalRef (LELArrayRef<DComplex>& result, const Slicer& section) const
00650 { pExprDComplex_p->evalRef (result, section); }
00651 void evalRef (LELArrayRef<Bool>& result, const Slicer& section) const
00652 { pExprBool_p->evalRef (result, section); }
00653
00654
00655
00656
00657
00658
00659 void eval (Float& result) const;
00660 void eval (Double& result) const;
00661 void eval (Complex& result) const;
00662 void eval (DComplex& result) const;
00663 void eval (Bool& result) const;
00664 Float getFloat() const;
00665 Double getDouble() const;
00666 Complex getComplex() const;
00667 DComplex getDComplex() const;
00668 Bool getBool() const;
00669
00670
00671
00672
00673 Array<Float> getArrayFloat() const;
00674 Array<Double> getArrayDouble() const;
00675 Array<Complex> getArrayComplex() const;
00676 Array<DComplex> getArrayDComplex() const;
00677 Array<Bool> getArrayBool() const;
00678
00679
00680
00681 DataType dataType() const
00682 {return dtype_p;}
00683
00684
00685 Bool isRegion() const
00686 {return pAttr_p->isRegion();}
00687
00688
00689 Bool isScalar() const
00690 {return pAttr_p->isScalar();}
00691
00692
00693 Bool isMasked() const
00694 {return pAttr_p->isMasked();}
00695
00696
00697 Bool isInvalidScalar() const
00698 {
00699 if (!donePrepare_p) doPrepare();
00700 return isInvalid_p;
00701 }
00702
00703
00704
00705 const IPosition& shape() const
00706 {return pAttr_p->shape();}
00707
00708
00709 const LELAttribute& getAttribute() const
00710 {return *pAttr_p;}
00711
00712
00713 Bool replaceScalarExpr();
00714
00715
00716
00717
00718
00719 LatticeExprNode(const CountedPtr<LELInterface<Float> >& expr);
00720 LatticeExprNode(const CountedPtr<LELInterface<Double> >& expr);
00721 LatticeExprNode(const CountedPtr<LELInterface<Complex> >& expr);
00722 LatticeExprNode(const CountedPtr<LELInterface<DComplex> >& expr);
00723 LatticeExprNode(const CountedPtr<LELInterface<Bool> >& expr);
00724
00725
00726
00727
00728 static DataType resultDataType (DataType left, DataType right);
00729
00730
00731
00732
00733
00734
00735
00736 static LELAttribute checkArg (const Block<LatticeExprNode>& arg,
00737 const Block<Int>& argType,
00738 Bool expectArray,
00739 Bool matchAxes = True);
00740
00741
00742
00743 Bool lock (FileLocker::LockType, uInt nattempts);
00744 void unlock();
00745 Bool hasLock (FileLocker::LockType) const;
00746 void resync();
00747
00748
00749
00750 private:
00751
00752
00753 LatticeExprNode(LELInterface<Float>* expr);
00754 LatticeExprNode(LELInterface<Double>* expr);
00755 LatticeExprNode(LELInterface<Complex>* expr);
00756 LatticeExprNode(LELInterface<DComplex>* expr);
00757 LatticeExprNode(LELInterface<Bool>* expr);
00758
00759
00760
00761
00762 static Bool areRegions (const LatticeExprNode& left,
00763 const LatticeExprNode& right);
00764
00765
00766
00767 static LatticeExprNode newNumUnary (LELUnaryEnums::Operation oper,
00768 const LatticeExprNode& expr);
00769
00770
00771
00772 static LatticeExprNode newNumFunc1D (LELFunctionEnums::Function func,
00773 const LatticeExprNode& expr);
00774
00775
00776
00777 static LatticeExprNode newRealFunc1D (LELFunctionEnums::Function func,
00778 const LatticeExprNode& expr);
00779
00780
00781
00782 static LatticeExprNode newComplexFunc1D (LELFunctionEnums::Function func,
00783 const LatticeExprNode& expr);
00784
00785
00786
00787 static LatticeExprNode newNumReal1D (LELFunctionEnums::Function func,
00788 const LatticeExprNode& expr);
00789
00790
00791
00792 static LatticeExprNode newNumFunc2D (LELFunctionEnums::Function func,
00793 const LatticeExprNode& left,
00794 const LatticeExprNode& right);
00795
00796
00797
00798 static LatticeExprNode newNumBinary (LELBinaryEnums::Operation oper,
00799 const LatticeExprNode& left,
00800 const LatticeExprNode& right);
00801
00802
00803
00804 static LatticeExprNode newLogBinary (LELBinaryEnums::Operation oper,
00805 const LatticeExprNode& left,
00806 const LatticeExprNode& right);
00807
00808
00809
00810 static LatticeExprNode newBinaryCmp (LELBinaryEnums::Operation oper,
00811 const LatticeExprNode& left,
00812 const LatticeExprNode& right);
00813
00814
00815
00816
00817
00818
00819 static Int makeEqualDim (LatticeExprNode& expr0,
00820 LatticeExprNode& expr1);
00821
00822
00823 void doPrepare() const;
00824
00825
00826
00827
00828 Bool donePrepare_p;
00829 DataType dtype_p;
00830 Bool isInvalid_p;
00831 IPosition iposition_p;
00832 const LELAttribute* pAttr_p;
00833 CountedPtr<LELInterface<Float> > pExprFloat_p;
00834 CountedPtr<LELInterface<Double> > pExprDouble_p;
00835 CountedPtr<LELInterface<Complex> > pExprComplex_p;
00836 CountedPtr<LELInterface<DComplex> > pExprDComplex_p;
00837 CountedPtr<LELInterface<Bool> > pExprBool_p;
00838 };
00839
00840
00841
00842 inline LatticeExprNode operator% (const LatticeExprNode& left,
00843 const LatticeExprNode& right)
00844 { return fmod (left, right); }
00845 inline LatticeExprNode operator^ (const LatticeExprNode& left,
00846 const LatticeExprNode& right)
00847 { return pow (left, right); }
00848
00849 inline LatticeExprNode convertType(const LatticeExprNode& expr, const Float*)
00850 { return toFloat (expr); }
00851 inline LatticeExprNode convertType(const LatticeExprNode& expr, const Double*)
00852 { return toDouble (expr); }
00853 inline LatticeExprNode convertType(const LatticeExprNode& expr, const Complex*)
00854 { return toComplex (expr); }
00855 inline LatticeExprNode convertType(const LatticeExprNode& expr, const DComplex*)
00856 { return toDComplex (expr); }
00857 inline LatticeExprNode convertType(const LatticeExprNode& expr, const Bool*)
00858 { return toBool (expr); }
00859
00860 }
00861
00862 #endif