| 603 | } |
| 604 | |
| 605 | bool icinga::operator>(const Value& lhs, const Value& rhs) |
| 606 | { |
| 607 | if (lhs.IsString() && rhs.IsString()) |
| 608 | return static_cast<String>(lhs) > static_cast<String>(rhs); |
| 609 | else if ((lhs.IsNumber() || lhs.IsEmpty()) && (rhs.IsNumber() || rhs.IsEmpty()) && !(lhs.IsEmpty() && rhs.IsEmpty())) |
| 610 | return static_cast<double>(lhs) > static_cast<double>(rhs); |
| 611 | else if ((lhs.IsObjectType<DateTime>() || lhs.IsEmpty()) && (rhs.IsObjectType<DateTime>() || rhs.IsEmpty()) && !(lhs.IsEmpty() && rhs.IsEmpty())) |
| 612 | return Convert::ToDateTimeValue(lhs) > Convert::ToDateTimeValue(rhs); |
| 613 | else if (lhs.IsObjectType<Array>() && rhs.IsObjectType<Array>()) { |
| 614 | Array::Ptr larr = lhs; |
| 615 | Array::Ptr rarr = rhs; |
| 616 | |
| 617 | ObjectLock llock(larr); |
| 618 | ObjectLock rlock(rarr); |
| 619 | |
| 620 | Array::SizeType llen = larr->GetLength(); |
| 621 | Array::SizeType rlen = rarr->GetLength(); |
| 622 | |
| 623 | for (Array::SizeType i = 0; i < std::max(llen, rlen); i++) { |
| 624 | Value lval = (i >= llen) ? Empty : larr->Get(i); |
| 625 | Value rval = (i >= rlen) ? Empty : rarr->Get(i); |
| 626 | |
| 627 | if (lval > rval) |
| 628 | return true; |
| 629 | else if (lval < rval) |
| 630 | return false; |
| 631 | } |
| 632 | |
| 633 | return false; |
| 634 | } else |
| 635 | BOOST_THROW_EXCEPTION(std::invalid_argument("Operator > cannot be applied to values of type '" + lhs.GetTypeName() + "' and '" + rhs.GetTypeName() + "'")); |
| 636 | } |
| 637 | |
| 638 | bool icinga::operator>(const Value& lhs, double rhs) |
| 639 | { |