| 9370 | } |
| 9371 | |
| 9372 | double eval_number(const xpath_context& c, const xpath_stack& stack) |
| 9373 | { |
| 9374 | switch (_type) |
| 9375 | { |
| 9376 | case ast_op_add: |
| 9377 | return _left->eval_number(c, stack) + _right->eval_number(c, stack); |
| 9378 | |
| 9379 | case ast_op_subtract: |
| 9380 | return _left->eval_number(c, stack) - _right->eval_number(c, stack); |
| 9381 | |
| 9382 | case ast_op_multiply: |
| 9383 | return _left->eval_number(c, stack) * _right->eval_number(c, stack); |
| 9384 | |
| 9385 | case ast_op_divide: |
| 9386 | return _left->eval_number(c, stack) / _right->eval_number(c, stack); |
| 9387 | |
| 9388 | case ast_op_mod: |
| 9389 | return fmod(_left->eval_number(c, stack), _right->eval_number(c, stack)); |
| 9390 | |
| 9391 | case ast_op_negate: |
| 9392 | return -_left->eval_number(c, stack); |
| 9393 | |
| 9394 | case ast_number_constant: |
| 9395 | return _data.number; |
| 9396 | |
| 9397 | case ast_func_last: |
| 9398 | return static_cast<double>(c.size); |
| 9399 | |
| 9400 | case ast_func_position: |
| 9401 | return static_cast<double>(c.position); |
| 9402 | |
| 9403 | case ast_func_count: |
| 9404 | { |
| 9405 | xpath_allocator_capture cr(stack.result); |
| 9406 | |
| 9407 | return static_cast<double>(_left->eval_node_set(c, stack, nodeset_eval_all).size()); |
| 9408 | } |
| 9409 | |
| 9410 | case ast_func_string_length_0: |
| 9411 | { |
| 9412 | xpath_allocator_capture cr(stack.result); |
| 9413 | |
| 9414 | return static_cast<double>(string_value(c.n, stack.result).length()); |
| 9415 | } |
| 9416 | |
| 9417 | case ast_func_string_length_1: |
| 9418 | { |
| 9419 | xpath_allocator_capture cr(stack.result); |
| 9420 | |
| 9421 | return static_cast<double>(_left->eval_string(c, stack).length()); |
| 9422 | } |
| 9423 | |
| 9424 | case ast_func_number_0: |
| 9425 | { |
| 9426 | xpath_allocator_capture cr(stack.result); |
| 9427 | |
| 9428 | return convert_string_to_number(string_value(c.n, stack.result).c_str()); |
| 9429 | } |
no test coverage detected