From 4ed895f9e16f15e1817748fc5ea471a76261cc3e Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (laptop)" <j.wuttke@fz-juelich.de>
Date: Tue, 18 Sep 2012 17:53:25 +0200
Subject: [PATCH] sort class members, comments, prepare for precomputed grid
 step

---
 pub/src/expr.cpp | 131 ++++++++++++++++++++++++++---------------------
 pub/src/expr.h   |  42 ++++++++-------
 2 files changed, 95 insertions(+), 78 deletions(-)

diff --git a/pub/src/expr.cpp b/pub/src/expr.cpp
index a44f2754..3feaf1ac 100644
--- a/pub/src/expr.cpp
+++ b/pub/src/expr.cpp
@@ -69,14 +69,19 @@ CContext::CContext( uint _k, uint _j, uint _i )
 
 void CContext::request_VT( const vector<double> *_vt )
 {
-    dim = _VT; nv = _vt->size(); vt = _vt;
+    dim = _VT;
+    nv = _vt->size();
+    vt = _vt;
+    if( !mystd::is_equidis( &vt_step, vt ) || vt_step<0 )
+        vt_step = 0;
 }
 
 //! Request a vector of indices.
 
 void CContext::request_VI( uint _nv )
 {
-    dim = _VI; nv = _nv;
+    dim = _VI;
+    nv = _nv;
 }
 
 //! Introspection, for debugging.
@@ -414,91 +419,111 @@ string CRef::ref_info() const
 
 
 //***************************************************************************//
-//* class CTree (parsed expressions)                                        *//
+//* CTree: constructors                                                     *//
 //***************************************************************************//
 
-//! Constructors.
+//! Empty tree. Probably needed for copying, in assignments &c.
 
 CTree::CTree()
     : typ(_NOTREE), fun(0) {}
 
+//! Universal constructor, for given _typ, with no tree arguments.
+
+CTree::CTree( char _typ )
+{
+    if        ( _typ=='t' ) { // function argument
+        typ = _DUMMY;
+    } else if ( _typ=='d' ) { // Dirac delta function centered at 0
+        typ = _DIRAC;
+        arg[0] = PTree( new CTree( 0.0 ) );
+        narg = 1;
+    } else
+        throw string( "invalid tree type in char-constructor" );
+}
+
+//! Universal constructor, for given _typ, with 1 tree argument.
+
+CTree::CTree( char _typ, const PTree& a0 )
+{
+    if ( _typ=='d' ) { // Dirac delta function centered at a0
+        typ = _DIRAC;
+        if( a0->has_dummy() )
+            throw string( "shift of Dirac delta must not contain t" );
+        arg[0] = a0;
+        narg = 1;
+    } else
+        throw string( "invalid tree type in char-constructor" );
+}
+
+//! Universal constructor, for given _typ, with 2 tree argument.
+
+CTree::CTree( char _typ, const PTree& a0, const PTree& a1 )
+{
+    if ( _typ=='c' ) { // convolution
+        typ = _CONV;
+        arg[0] = a0;
+        arg[1] = a1;
+        narg = 2;
+    } else
+        throw string( "invalid tree type in char-constructor" );
+}
+
+//! Numeric value node constructor.
+
 CTree::CTree( double v_in )
-    : typ(_VAL), val(v_in), fun(0) {}
+    : typ(_VAL), fun(0), val(v_in) {}
+
+//! Function node with 1 argument.
 
 CTree::CTree( const class CFunc *f_in, PTree a0 )
-    : typ(_OP), fun(f_in), narg(1)
+    : typ(_OP), narg(1), fun(f_in)
 {
     arg[0] = a0;
     if ( fun->narg!=1 )
         throw string( "BUG: CTree(1) with conflicting #arg" );
 }
 
+//! Function node constructor with 2 arguments.
+
 CTree::CTree( const class CFunc *f_in, PTree a0, PTree a1 )
-    : typ(_OP), fun(f_in), narg(2)
+    : typ(_OP), narg(2), fun(f_in)
 {
     arg[0] = a0; arg[1] = a1;
     if ( fun->narg!=2 )
         throw string( "BUG: CTree(2) with conflicting #arg" );
 }
 
+//! Function node constructor with 3 arguments.
+
 CTree::CTree( const class CFunc *f_in, PTree a0, PTree a1, PTree a2 )
-    : typ(_OP), fun(f_in), narg(3)
+    : typ(_OP), narg(3), fun(f_in)
 {
     arg[0] = a0; arg[1] = a1; arg[2] = a2;
     if ( fun->narg!=3 )
         throw string( "BUG: CTree(3) with conflicting #arg" );
 }
 
+//! Reference node constructor.
+
 CTree::CTree( PRef& _ref )
     : typ(_REF), fun(0), ref(_ref) {};
 
+//! Curve evaluation node constructor.
+
 CTree::CTree( PRef& _ref, PTree a0 )
     : typ(_CEV), fun(0), ref(_ref)
 {
     arg[0] = a0;
 }
 
+//! Register reference node constructor.
+
 CTree::CTree( PRgr& _rgr )
     : typ(_RGR), rgr(_rgr) {};
 
-CTree::CTree( char which )
-{
-    if        ( which=='t' ) { // function argument
-        typ = _DUMMY;
-    } else if ( which=='d' ) { // Dirac delta function centered at 0
-        typ = _DIRAC;
-        arg[0] = PTree( new CTree( 0.0 ) );
-        narg = 1;
-    } else
-        throw string( "invalid tree type in char-constructor" );
-}
-
-CTree::CTree( char which, const PTree& a0 )
-{
-    if ( which=='d' ) { // Dirac delta function centered at a0
-        typ = _DIRAC;
-        if( a0->has_dummy() )
-            throw string( "shift of Dirac delta must not contain t" );
-        arg[0] = a0;
-        narg = 1;
-    } else
-        throw string( "invalid tree type in char-constructor" );
-}
-
-CTree::CTree( char which, const PTree& a0, const PTree& a1 )
-{
-    if ( which=='c' ) { // convolution
-        typ = _CONV;
-        arg[0] = a0;
-        arg[1] = a1;
-        narg = 2;
-    } else
-        throw string( "invalid tree type in char-constructor" );
-}
-
 
 //***************************************************************************//
-//* CTree / read out various properties                                     *//
+//* CTree: status requests                                                  *//
 //***************************************************************************//
 
 //! How many curve parameters are contained in the tree?
@@ -510,7 +535,6 @@ uint CTree::npar() const
     return np;
 }
 
-
 //! Implementation with pointer argument to allow recursion.
 
 void CTree::npar_exec( uint *np ) const
@@ -527,7 +551,6 @@ void CTree::npar_exec( uint *np ) const
         throw string( "BUG: npar(UNDEF)" );
 }
 
-
 //! Does the result depend on k?
 
 bool CTree::k_dependent() const
@@ -537,7 +560,6 @@ bool CTree::k_dependent() const
     return kd;
 }
 
-
 //! Implementation with pointer argument to allow recursion.
 
 void CTree::kdep_exec( bool *kd ) const
@@ -553,7 +575,6 @@ void CTree::kdep_exec( bool *kd ) const
         throw string( "BUG: kdep(UNDEF)" );
 }
 
-
 //! Does expression contain dummy argument t ?
 
 bool CTree::has_dummy() const
@@ -616,7 +637,6 @@ void CTree::set_coord( CCoord& ret, uint k ) const
     }
 }
 
-
 //! Tree -> expression.
 
 string CTree::tree_info() const
@@ -649,7 +669,7 @@ string CTree::tree_info() const
 
 
 //***************************************************************************//
-//* CTree / low-level tree evaluation                                       *//
+//* CTree: low-level tree evaluation                                        *//
 //***************************************************************************//
 
 //! Evaluate tree and convert result to integer, for use as index.
@@ -662,7 +682,6 @@ void CTree::tree_uival( uint *ret, const CContext& ctx ) const
     *ret = (uint) ( val.r + 0.5);
 }
 
-
 //! Evaluate tree. Private. User calls pass through API implemented below.
 
 void CTree::tree_val( CResult& ret, const CContext& ctx ) const
@@ -696,7 +715,6 @@ void CTree::tree_val( CResult& ret, const CContext& ctx ) const
     }
 }
 
-
 //! A function of 1,2,.. arguments (including operators like +,-,.. ).
 
 void CTree::tree_op( CResult& ret, const CContext& ctx ) const
@@ -808,7 +826,6 @@ void CTree::tree_op( CResult& ret, const CContext& ctx ) const
     }
 }
 
-
 //! A curve evaluation: fc[k,j](arg).
 
 void CTree::tree_cev( CResult& ret, const CContext& ctx ) const
@@ -866,7 +883,7 @@ void CTree::tree_cev( CResult& ret, const CContext& ctx ) const
 
 
 //***************************************************************************//
-//* CTree / public interface to tree evaluation                             *//
+//* CTree: public interface to tree evaluation                              *//
 //***************************************************************************//
 
 //! Evaluate tree. Public API.
@@ -885,7 +902,6 @@ void CTree::tree_point_val(
         *dret = val.dr;
 }
 
-
 //! Evaluate tree. Public API.
 
 void CTree::tree_vec_val(
@@ -910,7 +926,7 @@ void CTree::tree_vec_val(
 
 
 //***************************************************************************//
-//* CTree / convolution evaluation                                          *//
+//* CTree: convolution evaluation                                           *//
 //***************************************************************************//
 
 //! Return kconc and jconv, according to fc[k,j]->kconv.
@@ -945,7 +961,6 @@ void CTree::setConv( uint& kconv, uint& jconv, uint k, uint j )
             strg(kconv) + ": number of spectra does not match";
 }
 
-
 //! Convolution context. Declared locally because only needed in tree_conv.
 
 typedef struct {
@@ -957,7 +972,6 @@ typedef struct {
     PTree arg;
 } ConvDatTyp;
 
-
 //! Call-back for integration. Only needed in tree_conv.
 
 double tree_conv_eval( double tt, void *data )
@@ -972,7 +986,6 @@ double tree_conv_eval( double tt, void *data )
     return mydata->res.to_r(0) * mydata->sv->intpol( tt );
 }
 
-
 //! Convolution or Dirac function: conv(f, shift), dirac(shift).
 
 void CTree::tree_conv( CResult& ret, const CContext& ctx ) const
diff --git a/pub/src/expr.h b/pub/src/expr.h
index 4ac6ca65..9a1e5f1e 100644
--- a/pub/src/expr.h
+++ b/pub/src/expr.h
@@ -18,6 +18,7 @@ class CContext {
  public:
     uint k, j, i;                   // file,scan,point we are refering to
     const vector<double> *vt;       // a vector we may refer to
+    double vt_step;                 // step of equidistant vt, otherwise 0
     enum TDim { _1, _VI, _VT } dim; // kind of requested output
     bool want_error;                // errors requested?
     uint nv;                        // number of requested vector elements
@@ -43,13 +44,19 @@ class CResult {
 
     CResult() : vectorial(false), dr(0) {};
 
-    void set_r( double _r ) { vectorial = false; r = _r; };
-    void preset_v( int n ) { vectorial = true; v.resize(n); };
-    void set_v( const vector<double>& v_ ) { vectorial = true; v = v_; };
-    double to_r( int i ) const { return vectorial ? v[i] : r; };
-    double to_dr( int i ) const
-        { return vectorial ? ( dv.size() ? dv[i] : 0 ) : dr; };
-    bool has_err() const { return vectorial ? dv.size() : dr; };
+    void set_r( double _r ) {
+        vectorial = false; r = _r; };
+    void preset_v( int n ) {
+        vectorial = true; v.resize(n); };
+    void set_v( const vector<double>& v_ ) {
+        vectorial = true; v = v_; };
+
+    double to_r( int i ) const {
+        return vectorial ? v[i] : r; };
+    double to_dr( int i ) const {
+        return vectorial ? ( dv.size() ? dv[i] : 0 ) : dr; };
+    bool has_err() const {
+        return vectorial ? dv.size() : dr; };
 
     string result_info() const;
 };
@@ -88,11 +95,11 @@ class CTree {
         _DIRAC  // Dirac delta function
     };
     TreeTyp typ;
-    double val;
-    const class CFunc* fun;
     static const uint maxarg=3;
     PTree arg[maxarg];
     uint narg;
+    const class CFunc* fun;
+    double val;
     PRef ref;
     PRgr rgr;
 
@@ -100,8 +107,14 @@ class CTree {
     void tree_conv ( CResult& ret, const CContext& ctx ) const;
     void tree_cev  ( CResult& ret, const CContext& ctx ) const;
 
+    void npar_exec( uint *np ) const;
+    void kdep_exec( bool *kd ) const;
+
  public:
     CTree();
+    CTree( char _typ );
+    CTree( char _typ, const PTree& a0 );
+    CTree( char _typ, const PTree& a0, const PTree& a1 );
     CTree( double v_in );
     CTree( const class CFunc *f_in, PTree a0 );
     CTree( const class CFunc *f_in, PTree a0, PTree a1 );
@@ -109,9 +122,6 @@ class CTree {
     CTree( PRef& _ref );
     CTree( PRef& _ref, PTree a0 );
     CTree( PRgr& _rgr );
-    CTree( char which );
-    CTree( char which, const PTree& a0 );
-    CTree( char which, const PTree& a0, const PTree& a1 );
 
     static void setConv( uint& kconv, uint& jconv, uint k, uint j );
 
@@ -119,8 +129,7 @@ class CTree {
     bool k_dependent() const;
     bool has_dummy() const;
 
-    void tree_val  ( CResult& ret, const CContext& ctx ) const;
-
+    void tree_val( CResult& ret, const CContext& ctx ) const;
     void tree_uival( uint *ret, const CContext& ctx ) const;
     void tree_point_val(
         double *ret, double *dret,
@@ -128,11 +137,6 @@ class CTree {
     void tree_vec_val(
         vector<double> *ret, vector<double> *dret,
         uint k=(uint)-1, uint j=(uint)-1 ) const;
-
     void set_coord( CCoord& ret, uint k=(uint)-1 ) const;
     string tree_info() const;
-
- private:
-    void npar_exec( uint *np ) const;
-    void kdep_exec( bool *kd ) const;
 };
-- 
GitLab