/* * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * */ #include "QueueDepth.h" namespace qpid { namespace broker { QueueDepth::QueueDepth() {} QueueDepth::QueueDepth(uint32_t c, uint64_t s) : count(c), size(s) {} QueueDepth& QueueDepth::operator+=(const QueueDepth& other) { if (count.valid) count.value += other.count.value; if (size.valid) size.value += other.size.value; return *this; } QueueDepth& QueueDepth::operator-=(const QueueDepth& other) { if (count.valid) count.value -= other.count.value; if (size.valid) size.value -= other.size.value; return *this; } bool QueueDepth::operator==(const QueueDepth& other) const { //only compare values, not validity an invalid value is always 0; //this means that an invalid value will match an empty queue //depth, which is fine return (count.value == other.count.value) && (size.value == other.size.value); } bool QueueDepth::operator!=(const QueueDepth& other) const { return !(*this == other); } bool QueueDepth::operator<(const QueueDepth& other) const { if (count.valid && size.valid) return count.value < other.count.value || size.value < other.size.value; else if (count.valid) return count.value < other.count.value; else return size.value < other.size.value; } bool QueueDepth::operator>(const QueueDepth& other) const { if (count.valid && size.valid) return count.value > other.count.value || size.value > other.size.value; else if (count.valid) return count.value > other.count.value; else return size.value > other.size.value; } bool QueueDepth::hasCount() const { return count.valid; } uint32_t QueueDepth::getCount() const { return count.value; } void QueueDepth::setCount(uint32_t c) { count.value = c; count.valid = true; } bool QueueDepth::hasSize() const { return size.valid; } uint64_t QueueDepth::getSize() const { return size.value; } void QueueDepth::setSize(uint64_t c) { size.value = c; size.valid = true; } namespace{ template QueueDepth::Optional add(const QueueDepth::Optional& a, const QueueDepth::Optional& b) { QueueDepth::Optional result; if (a.valid && b.valid) { result.valid = true; result.value = a.value + b.value; } return result; } template QueueDepth::Optional subtract(const QueueDepth::Optional& a, const QueueDepth::Optional& b) { QueueDepth::Optional result; if (a.valid && b.valid) { result.valid = true; result.value = a.value - b.value; } return result; } } QueueDepth operator-(const QueueDepth& a, const QueueDepth& b) { QueueDepth result; result.count = subtract(a.count, b.count); result.size = subtract(a.size, b.size); return result; } QueueDepth operator+(const QueueDepth& a, const QueueDepth& b) { QueueDepth result; result.count = add(a.count, b.count); result.size = add(a.size, b.size); return result; } std::ostream& operator<<(std::ostream& o, const QueueDepth& d) { if (d.hasCount()) o << "count: " << d.getCount(); if (d.hasSize()) { if (d.hasCount()) o << ", "; o << "size: " << d.getSize(); } return o; } QueueDepth::operator bool() const { return hasCount() || hasSize(); } }} // namespace qpid::broker