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