44 #ifdef CEXMC_USE_CUSTOM_FILTER 
   50 #include <boost/variant/get.hpp> 
   51 #include <boost/format.hpp> 
   60         static const std::string  opId[] =
 
   61             { 
"UNINITIALIZED", 
"TOP", 
"u -", 
"!", 
"*", 
"/", 
"+", 
"-", 
"<", 
"<=",
 
   62               ">", 
">=", 
"=", 
"!=", 
"&", 
"|" };
 
   64         std::stringstream         value;
 
   65         const Operator *          op( boost::get< Operator >( &type ) );
 
   69             value << 
"-op- " << opId[ op->type ];
 
   73             const Function *  fun( boost::get< Function >( &type ) );
 
   74             value << 
"-fun- " << *fun;
 
   77         std::stringstream  format;
 
   78         format << 
"%|" << level * printIndent << 
"t|";
 
   79         std::cout << boost::format( format.str() ) << value.str() << std::endl;
 
   81         for ( std::vector< Node >::const_iterator  k( children.begin() );
 
   82                                                       k != children.end(); ++k )
 
   84             const Subtree *  subtree( boost::get< Subtree >( &*k ) );
 
   88                 subtree->Print( level + 1 );
 
   92                 const Leaf *  leaf( boost::get< Leaf >( &*k ) );
 
   94                     PrintLeaf( leaf, level + 1 );
 
  100     void  Subtree::PrintLeaf( 
const Leaf *  leaf, 
int  level )
 const 
  103         std::stringstream  value;
 
  105         if ( ( 
variable = boost::get< Variable >( leaf ) ) )
 
  118             const Constant *  constant( boost::get< Constant >( leaf ) );
 
  119             const int *       intConstant( boost::get< int >( constant ) );
 
  120             const double *    doubleConstant( boost::get< double >(
 
  123             value << ( intConstant ? *intConstant : *doubleConstant );
 
  126         std::stringstream  format;
 
  127         format << 
"%|" << level * printIndent << 
"t|";
 
  128         std::cout << boost::format( format.str() ) << value.str() << std::endl;
 
  132     BasicEval::~BasicEval()
 
  137     bool  BasicEval::operator()( 
const Subtree &  ast )
 const 
  139         ScalarValueType  retval( GetScalarValue( ast ) );
 
  140         int *            intRetval( NULL );
 
  141         double *         doubleRetval( NULL );
 
  143         intRetval = boost::get< int >( &retval );
 
  146             doubleRetval = boost::get< double >( &retval );
 
  148         return doubleRetval ? bool( *doubleRetval ) : bool( *intRetval );
 
  152     BasicEval::ScalarValueType  BasicEval::GetScalarValue(
 
  153                                                     const Node &  node )
 const 
  155         const Subtree *  ast( boost::get< Subtree >( &node ) );
 
  159             const Operator *  op( boost::get< Operator >( &ast->type ) );
 
  162                 ScalarValueType           
left( 0 );
 
  163                 ScalarValueType           
right( 0 );
 
  164                 int *                     intLeft( NULL );
 
  165                 double *                  doubleLeft( NULL );
 
  166                 int *                     intRight( NULL );
 
  167                 double *                  doubleRight( NULL );
 
  168                 bool                      isDoubleRetval( 
false );
 
  170                 if ( ast->children.size() > 0 )
 
  172                     left = GetScalarValue( ast->children[ 0 ] );
 
  173                     intLeft = boost::get< int >( &
left );
 
  176                         doubleLeft = boost::get< double >( &
left );
 
  188                     if ( ast->children.size() > 1 )
 
  190                         right = GetScalarValue( ast->children[ 1 ] );
 
  191                         intRight = boost::get< int >( &
right );
 
  194                             doubleRight = boost::get< double >( &
right );
 
  197                                                 CexmcCFUnexpectedContext );
 
  200                     isDoubleRetval = doubleLeft || doubleRight;
 
  212                         return - *doubleLeft;
 
  217                         return ! *doubleLeft;
 
  221                     if ( isDoubleRetval )
 
  222                         return ( doubleLeft ? *doubleLeft : *intLeft ) *
 
  223                                ( doubleRight ? *doubleRight : *intRight );
 
  225                         return *intLeft * *intRight;
 
  227                     if ( isDoubleRetval )
 
  228                         return ( doubleLeft ? *doubleLeft : *intLeft ) /
 
  229                                ( doubleRight ? *doubleRight : *intRight );
 
  231                         return *intLeft / *intRight;
 
  233                     if ( isDoubleRetval )
 
  234                         return ( doubleLeft ? *doubleLeft : *intLeft ) +
 
  235                                ( doubleRight ? *doubleRight : *intRight );
 
  237                         return *intLeft + *intRight;
 
  239                     if ( isDoubleRetval )
 
  240                         return ( doubleLeft ? *doubleLeft : *intLeft ) -
 
  241                                ( doubleRight ? *doubleRight : *intRight );
 
  243                         return *intLeft - *intRight;
 
  245                     if ( isDoubleRetval )
 
  246                         return ( doubleLeft ? *doubleLeft : *intLeft ) <
 
  247                                ( doubleRight ? *doubleRight : *intRight );
 
  249                         return *intLeft < *intRight;
 
  251                     if ( isDoubleRetval )
 
  252                         return ( doubleLeft ? *doubleLeft : *intLeft ) <=
 
  253                                ( doubleRight ? *doubleRight : *intRight );
 
  255                         return *intLeft <= *intRight;
 
  257                     if ( isDoubleRetval )
 
  258                         return ( doubleLeft ? *doubleLeft : *intLeft ) >
 
  259                                ( doubleRight ? *doubleRight : *intRight );
 
  261                         return *intLeft > *intRight;
 
  263                     if ( isDoubleRetval )
 
  264                         return ( doubleLeft ? *doubleLeft : *intLeft ) >=
 
  265                                ( doubleRight ? *doubleRight : *intRight );
 
  267                         return *intLeft >= *intRight;
 
  269                     if ( isDoubleRetval )
 
  270                         return ( doubleLeft ? *doubleLeft : *intLeft ) ==
 
  271                                ( doubleRight ? *doubleRight : *intRight );
 
  273                         return *intLeft == *intRight;
 
  275                     if ( isDoubleRetval )
 
  276                         return ( doubleLeft ? *doubleLeft : *intLeft ) !=
 
  277                                ( doubleRight ? *doubleRight : *intRight );
 
  279                         return *intLeft != *intRight;
 
  291                     right = GetScalarValue( ast->children[ 1 ] );
 
  292                     intRight = boost::get< int >( &
right );
 
  295                         doubleRight = boost::get< double >( &
right );
 
  321                     right = GetScalarValue( ast->children[ 1 ] );
 
  322                     intRight = boost::get< int >( &
right );
 
  325                         doubleRight = boost::get< double >( &
right );
 
  346                 return GetFunScalarValue( *ast );
 
  351             const Leaf &      leaf( boost::get< Leaf >( node ) );
 
  352             const Constant *  constant( boost::get< Constant >( &leaf ) );
 
  360                 const Variable &  
variable( boost::get< Variable >( leaf ) );
 
  361                 return GetVarScalarValue( 
variable );
 
  369     BasicEval::ScalarValueType  BasicEval::GetFunScalarValue(
 
  370                                                     const Subtree &  ast )
 const 
  372         bool             evalResult( 
false );
 
  373         ScalarValueType  result( GetBasicFunScalarValue( ast, evalResult ) );
 
  384     BasicEval::ScalarValueType  BasicEval::GetVarScalarValue(
 
  385                                                     const Variable & )
 const 
  393     BasicEval::ScalarValueType  BasicEval::GetBasicFunScalarValue(
 
  394                                     const Subtree &  ast, 
bool &  result )
 const 
  396         const Function &  fun( boost::get< Function >( ast.type ) );
 
  400         ScalarValueType   arg( GetScalarValue( ast.children[ 0 ] ) );
 
  401         int *             intArg( NULL );
 
  402         double *          doubleArg( NULL );
 
  404         intArg = boost::get< int >( &arg );
 
  406             doubleArg = boost::get< double >( &arg );
 
  411                 return *doubleArg * *doubleArg;
 
  413                 return *intArg * *intArg;
 
  418                 return std::sqrt( *doubleArg );
 
  420                 return std::sqrt( *intArg );
 
static int variable(const string &name, double &result, const dic_type &dictionary)
 
void Print(G4Element &ele)