| 550 | } |
| 551 | |
| 552 | bool icinga::operator<(const Value& lhs, const Value& rhs) |
| 553 | { |
| 554 | if (lhs.IsString() && rhs.IsString()) |
| 555 | return static_cast<String>(lhs) < static_cast<String>(rhs); |
| 556 | else if ((lhs.IsNumber() || lhs.IsEmpty()) && (rhs.IsNumber() || rhs.IsEmpty()) && !(lhs.IsEmpty() && rhs.IsEmpty())) |
| 557 | return static_cast<double>(lhs) < static_cast<double>(rhs); |
| 558 | else if ((lhs.IsObjectType<DateTime>() || lhs.IsEmpty()) && (rhs.IsObjectType<DateTime>() || rhs.IsEmpty()) && !(lhs.IsEmpty() && rhs.IsEmpty())) |
| 559 | return Convert::ToDateTimeValue(lhs) < Convert::ToDateTimeValue(rhs); |
| 560 | else if (lhs.IsObjectType<Array>() && rhs.IsObjectType<Array>()) { |
| 561 | Array::Ptr larr = lhs; |
| 562 | Array::Ptr rarr = rhs; |
| 563 | |
| 564 | ObjectLock llock(larr); |
| 565 | ObjectLock rlock(rarr); |
| 566 | |
| 567 | Array::SizeType llen = larr->GetLength(); |
| 568 | Array::SizeType rlen = rarr->GetLength(); |
| 569 | |
| 570 | for (Array::SizeType i = 0; i < std::max(llen, rlen); i++) { |
| 571 | Value lval = (i >= llen) ? Empty : larr->Get(i); |
| 572 | Value rval = (i >= rlen) ? Empty : rarr->Get(i); |
| 573 | |
| 574 | if (lval < rval) |
| 575 | return true; |
| 576 | else if (lval > rval) |
| 577 | return false; |
| 578 | } |
| 579 | |
| 580 | return false; |
| 581 | } else |
| 582 | BOOST_THROW_EXCEPTION(std::invalid_argument("Operator < cannot be applied to values of type '" + lhs.GetTypeName() + "' and '" + rhs.GetTypeName() + "'")); |
| 583 | } |
| 584 | |
| 585 | bool icinga::operator<(const Value& lhs, double rhs) |
| 586 | { |