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(const std::vector< T > &data)