Geant4  10.03
CexmcAST.hh
Go to the documentation of this file.
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 /*
27  * =============================================================================
28  *
29  * Filename: CexmcAST.hh
30  *
31  * Description: abstract syntax tree for custom filter scripting language
32  *
33  * Version: 1.0
34  * Created: 17.07.2010 14:39:37
35  * Revision: none
36  * Compiler: gcc
37  *
38  * Author: Alexey Radkov (),
39  * Company: PNPI
40  *
41  * =============================================================================
42  */
43 
44 #ifndef CEXMC_AST_HH
45 #define CEXMC_AST_HH
46 
47 #ifdef CEXMC_USE_CUSTOM_FILTER
48 
49 #include <vector>
50 #include <boost/variant/recursive_variant.hpp>
51 
52 
53 namespace CexmcAST
54 {
55  using boost::variant;
56  using boost::recursive_wrapper;
57 
58  enum OperatorType
59  {
60  Uninitialized,
61  Top,
62  UMinus,
63  Not,
64  Mult,
65  Div,
66  Plus,
67  Minus,
68  Less,
69  LessEq,
70  More,
71  MoreEq,
72  Eq,
73  NotEq,
74  And,
75  Or
76  };
77 
78 
79  struct Operator
80  {
81  Operator( OperatorType type = Uninitialized, int priority = 0,
82  bool hasRLAssoc = false ) :
83  type( type ), priority( priority ), hasRLAssoc( hasRLAssoc )
84  {}
85 
86  OperatorType type;
87 
88  int priority;
89 
90  bool hasRLAssoc;
91  };
92 
93 
94  struct Variable
95  {
96  Variable() : index1( 0 ), index2( 0 ), addr( ( const int * ) NULL )
97  {}
98 
99  std::string name;
100 
101  int index1;
102 
103  int index2;
104 
105  variant< const int *, const double * > addr;
106  };
107 
108 
109  struct Subtree;
110 
111  typedef std::string Function;
112 
113  typedef variant< int, double > Constant;
114 
115  typedef variant< Variable, Constant > Leaf;
116 
117  typedef recursive_wrapper< Subtree > Tree;
118 
119  typedef variant< Tree, Leaf > Node;
120 
121  typedef variant< Operator, Function > NodeType;
122 
123 
124  struct Subtree
125  {
126  Subtree() : type( Operator( Uninitialized ) )
127  {}
128 
129  void Print( int level = 0 ) const;
130 
131  void PrintLeaf( const Leaf * leaf, int level = 0 ) const;
132 
133  std::vector< Node > children;
134 
135  NodeType type;
136 
137  static const int printIndent = 4;
138  };
139 
140 
141  class BasicEval
142  {
143  protected:
144  typedef variant< int, double > ScalarValueType;
145 
146  protected:
147  virtual ~BasicEval();
148 
149  public:
150  bool operator()( const Subtree & ast ) const;
151 
152  protected:
153  ScalarValueType GetScalarValue( const Node & node ) const;
154 
155  virtual ScalarValueType GetFunScalarValue( const Subtree & ast )
156  const;
157 
158  virtual ScalarValueType GetVarScalarValue( const Variable & var )
159  const;
160 
161  ScalarValueType GetBasicFunScalarValue(
162  const Subtree & ast, bool & result )
163  const;
164  };
165 }
166 
167 #endif
168 
169 #endif
170 
const char * name(G4int ptype)
void Print(const std::vector< T > &data)
Definition: DicomRun.hh:109