From 357d3fbad0d01995ade210526e489e60a20d113f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Tue, 29 May 2018 14:18:04 +0200 Subject: [PATCH] [apps/shared/stats] Make store functions const --- apps/shared/float_pair_store.cpp | 4 +- apps/shared/float_pair_store.h | 4 +- apps/statistics/store.cpp | 62 +++++++++++++++---------------- apps/statistics/store.h | 64 ++++++++++++++++---------------- 4 files changed, 67 insertions(+), 67 deletions(-) diff --git a/apps/shared/float_pair_store.cpp b/apps/shared/float_pair_store.cpp index 4ca63c8a3..c58ceb812 100644 --- a/apps/shared/float_pair_store.cpp +++ b/apps/shared/float_pair_store.cpp @@ -73,7 +73,7 @@ double FloatPairStore::sumOfColumn(int series, int i) const { return result; } -uint32_t FloatPairStore::storeChecksum() { +uint32_t FloatPairStore::storeChecksum() const { /* Ideally, we would only compute the checksum of the first m_numberOfPairs * pairs. However, the two values of a pair are not stored consecutively. We * thus compute the checksum on all pairs and ensure to set the pair at 0 @@ -83,7 +83,7 @@ uint32_t FloatPairStore::storeChecksum() { return Ion::crc32((uint32_t *)m_data, dataLengthInBytes/sizeof(uint32_t)); } -double FloatPairStore::defaultValue(int series, int i, int j) { +double FloatPairStore::defaultValue(int series, int i, int j) const { assert(series >= 0 && series < k_numberOfSeries); if(i == 0 && j > 1) { return 2*m_data[series][i][j-1]-m_data[series][i][j-2]; diff --git a/apps/shared/float_pair_store.h b/apps/shared/float_pair_store.h index 41eda91e5..788623a6f 100644 --- a/apps/shared/float_pair_store.h +++ b/apps/shared/float_pair_store.h @@ -34,7 +34,7 @@ public: void deleteAllPairs(); void resetColumn(int series, int i); double sumOfColumn(int series, int i) const; - uint32_t storeChecksum(); + uint32_t storeChecksum() const; static KDColor colorOfSeriesAtIndex(int i) { assert(i >= 0 && i < k_numberOfSeries); @@ -45,7 +45,7 @@ public: return Palette::DataColorLight[i]; } protected: - virtual double defaultValue(int series, int i, int j); + virtual double defaultValue(int series, int i, int j) const; int m_numberOfPairs[k_numberOfSeries]; double m_data[k_numberOfSeries][k_numberOfColumnsPerSeries][k_maxNumberOfPairs]; }; diff --git a/apps/statistics/store.cpp b/apps/statistics/store.cpp index 35704df36..869da49fe 100644 --- a/apps/statistics/store.cpp +++ b/apps/statistics/store.cpp @@ -17,7 +17,7 @@ Store::Store() : { } -uint32_t Store::barChecksum() { +uint32_t Store::barChecksum() const { double data[2] = {m_barWidth, m_firstDrawnBarAbscissa}; size_t dataLengthInBytes = 2*sizeof(double); assert((dataLengthInBytes & 0x3) == 0); // Assert that dataLengthInBytes is a multiple of 4 @@ -32,11 +32,11 @@ void Store::setBarWidth(double barWidth) { } } -double Store::heightOfBarAtIndex(int series, int index) { +double Store::heightOfBarAtIndex(int series, int index) const { return sumOfValuesBetween(series, startOfBarAtIndex(series, index), endOfBarAtIndex(series, index)); } -double Store::heightOfBarAtValue(int series, double value) { +double Store::heightOfBarAtValue(int series, double value) const { double width = barWidth(); int barNumber = std::floor((value - m_firstDrawnBarAbscissa)/width); double lowerBound = m_firstDrawnBarAbscissa + barNumber*width; @@ -44,16 +44,16 @@ double Store::heightOfBarAtValue(int series, double value) { return sumOfValuesBetween(series, lowerBound, upperBound); } -double Store::startOfBarAtIndex(int series, int index) { +double Store::startOfBarAtIndex(int series, int index) const { double firstBarAbscissa = m_firstDrawnBarAbscissa + m_barWidth*std::floor((minValue(series)- m_firstDrawnBarAbscissa)/m_barWidth); return firstBarAbscissa + index * m_barWidth; } -double Store::endOfBarAtIndex(int series, int index) { +double Store::endOfBarAtIndex(int series, int index) const { return startOfBarAtIndex(series, index+1); } -double Store::numberOfBars(int series) { +double Store::numberOfBars(int series) const { double firstBarAbscissa = m_firstDrawnBarAbscissa + m_barWidth*std::floor((minValue(series)- m_firstDrawnBarAbscissa)/m_barWidth); return std::ceil((maxValue(series) - firstBarAbscissa)/m_barWidth)+1; } @@ -76,7 +76,7 @@ bool Store::scrollToSelectedBarIndex(int series, int index) { return false; } -bool Store::isEmpty() { +bool Store::isEmpty() const { for (int i = 0; i < k_numberOfSeries; i ++) { if (!seriesIsEmpty(i)) { return false; @@ -85,7 +85,7 @@ bool Store::isEmpty() { return true; } -int Store::numberOfNonEmptySeries() { +int Store::numberOfNonEmptySeries() const { int result = 0; for (int i = 0; i < k_numberOfSeries; i ++) { if (!seriesIsEmpty(i)) { @@ -95,11 +95,11 @@ int Store::numberOfNonEmptySeries() { return result; } -bool Store::seriesIsEmpty(int i) { +bool Store::seriesIsEmpty(int i) const { return sumOfOccurrences(i) == 0; } -int Store::indexOfKthNonEmptySeries(int k) { +int Store::indexOfKthNonEmptySeries(int k) const { assert(k >= 0 && k < numberOfNonEmptySeries()); int nonEmptySeriesCount = 0; for (int i = 0; i < k_numberOfSeries; i++) { @@ -116,11 +116,11 @@ int Store::indexOfKthNonEmptySeries(int k) { /* Calculation */ -double Store::sumOfOccurrences(int series) { +double Store::sumOfOccurrences(int series) const { return sumOfColumn(series, 1); } -double Store::maxValueForAllSeries() { +double Store::maxValueForAllSeries() const { assert(FloatPairStore::k_numberOfSeries > 0); double result = maxValue(0); for (int i = 1; i < FloatPairStore::k_numberOfSeries; i++) { @@ -132,7 +132,7 @@ double Store::maxValueForAllSeries() { return result; } -double Store::minValueForAllSeries() { +double Store::minValueForAllSeries() const { assert(FloatPairStore::k_numberOfSeries > 0); double result = minValue(0); for (int i = 1; i < FloatPairStore::k_numberOfSeries; i++) { @@ -144,7 +144,7 @@ double Store::minValueForAllSeries() { return result; } -double Store::maxValue(int series) { +double Store::maxValue(int series) const { double max = -DBL_MAX; for (int k = 0; k < m_numberOfPairs[series]; k++) { if (m_data[series][0][k] > max && m_data[series][1][k] > 0) { @@ -154,7 +154,7 @@ double Store::maxValue(int series) { return max; } -double Store::minValue(int series) { +double Store::minValue(int series) const { double min = DBL_MAX; for (int k = 0; k < m_numberOfPairs[series]; k++) { if (m_data[series][0][k] < min && m_data[series][1][k] > 0) { @@ -164,42 +164,42 @@ double Store::minValue(int series) { return min; } -double Store::range(int series) { +double Store::range(int series) const { return maxValue(series)-minValue(series); } -double Store::mean(int series) { +double Store::mean(int series) const { return sum(series)/sumOfOccurrences(series); } -double Store::variance(int series) { +double Store::variance(int series) const { double m = mean(series); return squaredValueSum(series)/sumOfOccurrences(series) - m*m; } -double Store::standardDeviation(int series) { +double Store::standardDeviation(int series) const { return std::sqrt(variance(series)); } -double Store::sampleStandardDeviation(int series) { +double Store::sampleStandardDeviation(int series) const { double n = sumOfOccurrences(series); double s = std::sqrt(n/(n-1.0)); return s*standardDeviation(series); } -double Store::firstQuartile(int series) { +double Store::firstQuartile(int series) const { return sortedElementAtCumulatedFrequency(series, 1.0/4.0); } -double Store::thirdQuartile(int series) { +double Store::thirdQuartile(int series) const { return sortedElementAtCumulatedFrequency(series, 3.0/4.0); } -double Store::quartileRange(int series) { +double Store::quartileRange(int series) const { return thirdQuartile(series)-firstQuartile(series); } -double Store::median(int series) { +double Store::median(int series) const { bool exactElement = true; double maxMedian = sortedElementAtCumulatedFrequency(series, 1.0/2.0, &exactElement); if (!exactElement) { @@ -210,7 +210,7 @@ double Store::median(int series) { } } -double Store::sum(int series) { +double Store::sum(int series) const { double result = 0; for (int k = 0; k < m_numberOfPairs[series]; k++) { result += m_data[series][0][k]*m_data[series][1][k]; @@ -218,7 +218,7 @@ double Store::sum(int series) { return result; } -double Store::squaredValueSum(int series) { +double Store::squaredValueSum(int series) const { double result = 0; for (int k = 0; k < m_numberOfPairs[series]; k++) { result += m_data[series][0][k]*m_data[series][0][k]*m_data[series][1][k]; @@ -228,11 +228,11 @@ double Store::squaredValueSum(int series) { /* Private methods */ -double Store::defaultValue(int series, int i, int j) { +double Store::defaultValue(int series, int i, int j) const { return i == 0 ? FloatPairStore::defaultValue(series, i, j) : 1.0; } -double Store::sumOfValuesBetween(int series, double x1, double x2) { +double Store::sumOfValuesBetween(int series, double x1, double x2) const { double result = 0; for (int k = 0; k < m_numberOfPairs[series]; k++) { if (m_data[series][0][k] < x2 && x1 <= m_data[series][0][k]) { @@ -242,7 +242,7 @@ double Store::sumOfValuesBetween(int series, double x1, double x2) { return result; } -double Store::sortedElementAtCumulatedFrequency(int series, double k, bool * exactElement) { +double Store::sortedElementAtCumulatedFrequency(int series, double k, bool * exactElement) const { // TODO: use an other algorithm (ex quickselect) to avoid quadratic complexity assert(k >= 0.0 && k <= 1.0); double totalNumberOfElements = sumOfOccurrences(series); @@ -261,7 +261,7 @@ double Store::sortedElementAtCumulatedFrequency(int series, double k, bool * exa return m_data[series][0][sortedElementIndex]; } -double Store::sortedElementAfter(int series, double k) { +double Store::sortedElementAfter(int series, double k) const { assert(m_numberOfPairs[series] > 0); double result = DBL_MAX; bool foundResult = false; @@ -276,7 +276,7 @@ double Store::sortedElementAfter(int series, double k) { return result; } -int Store::minIndex(double * bufferValues, int bufferLength) { +int Store::minIndex(double * bufferValues, int bufferLength) const { int index = 0; for (int i = 1; i < bufferLength; i++) { if (bufferValues[index] > bufferValues[i]) { diff --git a/apps/statistics/store.h b/apps/statistics/store.h index 94b389f00..292d270bd 100644 --- a/apps/statistics/store.h +++ b/apps/statistics/store.h @@ -9,41 +9,41 @@ namespace Statistics { class Store : public Shared::MemoizedCurveViewRange, public Shared::FloatPairStore { public: Store(); - uint32_t barChecksum(); + uint32_t barChecksum() const; // Histogram bars double barWidth() const { return m_barWidth; } void setBarWidth(double barWidth); double firstDrawnBarAbscissa() const { return m_firstDrawnBarAbscissa; } void setFirstDrawnBarAbscissa(double firstDrawnBarAbscissa) { m_firstDrawnBarAbscissa = firstDrawnBarAbscissa;} - double heightOfBarAtIndex(int series, int index); - double heightOfBarAtValue(int series, double value); - double startOfBarAtIndex(int series, int index); - double endOfBarAtIndex(int series, int index); - double numberOfBars(int series); + double heightOfBarAtIndex(int series, int index) const; + double heightOfBarAtValue(int series, double value) const; + double startOfBarAtIndex(int series, int index) const; + double endOfBarAtIndex(int series, int index) const; + double numberOfBars(int series) const; // return true if the window has scrolled bool scrollToSelectedBarIndex(int series, int index); - bool isEmpty(); - int numberOfNonEmptySeries(); - bool seriesIsEmpty(int i); - int indexOfKthNonEmptySeries(int k); + bool isEmpty() const; + int numberOfNonEmptySeries() const; + bool seriesIsEmpty(int i) const; + int indexOfKthNonEmptySeries(int k) const; // Calculation - double sumOfOccurrences(int series); - double maxValueForAllSeries(); - double minValueForAllSeries(); - double maxValue(int series); - double minValue(int series); - double range(int series); - double mean(int series); - double variance(int series); - double standardDeviation(int series); - double sampleStandardDeviation(int series); - double firstQuartile(int series); - double thirdQuartile(int series); - double quartileRange(int series); - double median(int series); - double sum(int series); - double squaredValueSum(int series); + double sumOfOccurrences(int series) const; + double maxValueForAllSeries() const; + double minValueForAllSeries() const; + double maxValue(int series) const; + double minValue(int series) const; + double range(int series) const; + double mean(int series) const; + double variance(int series) const; + double standardDeviation(int series) const; + double sampleStandardDeviation(int series) const; + double firstQuartile(int series) const; + double thirdQuartile(int series) const; + double quartileRange(int series) const; + double median(int series) const; + double sum(int series) const; + double squaredValueSum(int series) const; constexpr static double k_maxNumberOfBars = 10000.0; constexpr static float k_displayTopMarginRatio = 0.1f; constexpr static float k_displayRightMarginRatio = 0.04f; @@ -51,17 +51,17 @@ public: constexpr static float k_displayLeftMarginRatio = 0.04f; private: - double defaultValue(int series, int i, int j) override; - double sumOfValuesBetween(int series, double x1, double x2); - double sortedElementAtCumulatedFrequency(int series, double k, bool * exactElement = nullptr); - double sortedElementAfter(int series, double k); - int minIndex(double * bufferValues, int bufferLength); + double defaultValue(int series, int i, int j) const override; + double sumOfValuesBetween(int series, double x1, double x2) const; + double sortedElementAtCumulatedFrequency(int series, double k, bool * exactElement = nullptr) const; + double sortedElementAfter(int series, double k) const; + int minIndex(double * bufferValues, int bufferLength) const; // Histogram bars double m_barWidth; double m_firstDrawnBarAbscissa; }; -typedef double (Store::*CalculPointer)(int); +typedef double (Store::*CalculPointer)(int) const; }