| 8148 | } |
| 8149 | |
| 8150 | double eval_number(const xpath_context& c, const xpath_stack& stack) |
| 8151 | { |
| 8152 | switch (_type) |
| 8153 | { |
| 8154 | case ast_op_add: |
| 8155 | return _left->eval_number(c, stack) + _right->eval_number(c, stack); |
| 8156 | |
| 8157 | case ast_op_subtract: |
| 8158 | return _left->eval_number(c, stack) - _right->eval_number(c, stack); |
| 8159 | |
| 8160 | case ast_op_multiply: |
| 8161 | return _left->eval_number(c, stack) * _right->eval_number(c, stack); |
| 8162 | |
| 8163 | case ast_op_divide: |
| 8164 | return _left->eval_number(c, stack) / _right->eval_number(c, stack); |
| 8165 | |
| 8166 | case ast_op_mod: |
| 8167 | return fmod(_left->eval_number(c, stack), _right->eval_number(c, stack)); |
| 8168 | |
| 8169 | case ast_op_negate: |
| 8170 | return -_left->eval_number(c, stack); |
| 8171 | |
| 8172 | case ast_number_constant: |
| 8173 | return _data.number; |
| 8174 | |
| 8175 | case ast_func_last: |
| 8176 | return static_cast<double>(c.size); |
| 8177 | |
| 8178 | case ast_func_position: |
| 8179 | return static_cast<double>(c.position); |
| 8180 | |
| 8181 | case ast_func_count: |
| 8182 | { |
| 8183 | xpath_allocator_capture cr(stack.result); |
| 8184 | |
| 8185 | return static_cast<double>(_left->eval_node_set(c, stack).size()); |
| 8186 | } |
| 8187 | |
| 8188 | case ast_func_string_length_0: |
| 8189 | { |
| 8190 | xpath_allocator_capture cr(stack.result); |
| 8191 | |
| 8192 | return static_cast<double>(string_value(c.n, stack.result).length()); |
| 8193 | } |
| 8194 | |
| 8195 | case ast_func_string_length_1: |
| 8196 | { |
| 8197 | xpath_allocator_capture cr(stack.result); |
| 8198 | |
| 8199 | return static_cast<double>(_left->eval_string(c, stack).length()); |
| 8200 | } |
| 8201 | |
| 8202 | case ast_func_number_0: |
| 8203 | { |
| 8204 | xpath_allocator_capture cr(stack.result); |
| 8205 | |
| 8206 | return convert_string_to_number(string_value(c.n, stack.result).c_str()); |
| 8207 | } |
no test coverage detected