Chris@1650: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@1650: Chris@1650: /* Chris@1650: Sonic Visualiser Chris@1650: An audio file viewer and annotation editor. Chris@1650: Centre for Digital Music, Queen Mary, University of London. Chris@1650: Chris@1650: This program is free software; you can redistribute it and/or Chris@1650: modify it under the terms of the GNU General Public License as Chris@1650: published by the Free Software Foundation; either version 2 of the Chris@1650: License, or (at your option) any later version. See the file Chris@1650: COPYING included with this distribution for more information. Chris@1650: */ Chris@1650: Chris@1650: #ifndef SV_EXTENTS_H Chris@1650: #define SV_EXTENTS_H Chris@1650: Chris@1650: #include Chris@1650: Chris@1650: /** Chris@1650: * Maintain a min and max value, and update them when supplied a new Chris@1650: * data point. Chris@1650: */ Chris@1650: template Chris@1650: class Extents Chris@1650: { Chris@1650: public: Chris@1650: Extents() : m_min(T()), m_max(T()) { } Chris@1650: Extents(T min, T max) : m_min(min), m_max(max) { } Chris@1650: Chris@1650: bool operator==(const Extents &r) { Chris@1650: return r.m_min == m_min && r.m_max == m_max; Chris@1650: } Chris@1650: bool operator!=(const Extents &r) { Chris@1650: return !(*this == r); Chris@1650: } Chris@1650: Chris@1650: bool isSet() const { Chris@1650: return (m_min != T() || m_max != T()); Chris@1650: } Chris@1650: void set(T min, T max) { Chris@1650: m_min = min; Chris@1650: m_max = max; Chris@1650: if (m_max < m_min) m_max = m_min; Chris@1650: } Chris@1650: void reset() { Chris@1650: m_min = T(); Chris@1650: m_max = T(); Chris@1650: } Chris@1650: Chris@1650: bool sample(T f) { Chris@1650: bool changed = false; Chris@1650: if (isSet()) { Chris@1650: if (f < m_min) { m_min = f; changed = true; } Chris@1650: if (f > m_max) { m_max = f; changed = true; } Chris@1650: } else { Chris@1650: m_max = m_min = f; Chris@1650: changed = true; Chris@1650: } Chris@1650: return changed; Chris@1650: } Chris@1650: bool sample(const std::vector &ff) { Chris@1650: bool changed = false; Chris@1650: for (auto f: ff) { Chris@1650: if (sample(f)) { Chris@1650: changed = true; Chris@1650: } Chris@1650: } Chris@1650: return changed; Chris@1650: } Chris@1650: bool sample(const Extents &r) { Chris@1650: bool changed = false; Chris@1650: if (isSet()) { Chris@1650: if (r.m_min < m_min) { m_min = r.m_min; changed = true; } Chris@1650: if (r.m_max > m_max) { m_max = r.m_max; changed = true; } Chris@1650: } else { Chris@1650: m_min = r.m_min; Chris@1650: m_max = r.m_max; Chris@1650: changed = true; Chris@1650: } Chris@1650: return changed; Chris@1650: } Chris@1650: Chris@1650: T getMin() const { return m_min; } Chris@1650: T getMax() const { return m_max; } Chris@1650: Chris@1650: private: Chris@1650: T m_min; Chris@1650: T m_max; Chris@1650: }; Chris@1650: Chris@1650: #endif