AJA NTV2 SDK  17.0.1.1246
NTV2 SDK 17.0.1.1246
ajamovingavg.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
8 #ifndef AJA_MOVINGAVG_H
9 #define AJA_MOVINGAVG_H
10 
11 //#include "ajabase/common/public.h"
12 #include "ajabase/system/lock.h"
13 #include <climits>
14 #include <cfloat>
15 #include <deque>
16 #include <ostream>
17 #include <typeinfo>
18 #if defined(AJA_WINDOWS)
19  #pragma warning(disable:4056)
20 #endif
21 
22 
28 template <typename T> class AJAMovingAvg
29 {
30  public:
31  static const size_t kDefaultMaxNumSamples = 10;
32 
33  public:
39  inline explicit AJAMovingAvg (const size_t inMaxNumSamples = kDefaultMaxNumSamples)
40  {
41  reset(inMaxNumSamples);
42  }
43 
49  inline void addSample (const T inValue)
50  { AJAAutoLock tmp(&mLock);
51  mValues.push_front(inValue);
52  if (mValues.size() > mSampleCapacity)
53  mValues.pop_back();
54  mTotNumSamples++;
55  if (inValue < mMinValue)
56  mMinValue = inValue;
57  if (inValue > mMaxValue)
58  mMaxValue = inValue;
59  }
60 
66  inline void reset (const size_t inMaxNumSamples = kDefaultMaxNumSamples)
67  { AJAAutoLock tmp(&mLock);
68  mValues.clear();
69  mSampleCapacity = inMaxNumSamples;
70  mTotNumSamples = 0;
71  mMinValue = largestPossibleValue();
72  mMaxValue = smallestPossibleValue();
73  }
74 
78  inline size_t numStoredSamples (void) const {AJAAutoLock tmp(&mLock); return mValues.size();}
79 
83  inline size_t sampleCapacity (void) const {AJAAutoLock tmp(&mLock); return mSampleCapacity;}
84 
88  inline size_t totalSamples (void) const {AJAAutoLock tmp(&mLock); return mTotNumSamples;}
89 
93  inline bool isValid (void) const {AJAAutoLock tmp(&mLock); return totalSamples() > 0;}
94 
98  inline bool isEmpty (void) const {AJAAutoLock tmp(&mLock); return mValues.empty();}
99 
103  inline T average (void) const
104  { AJAAutoLock tmp(&mLock);
105  if (isEmpty())
106  return 0;
107  return sum() / T(numStoredSamples());
108  }
109 
113  inline double averageF (void) const
114  { AJAAutoLock tmp(&mLock);
115  if (isEmpty())
116  return 0.0;
117  return double(sum()) / double(numStoredSamples());
118  }
119 
123  inline T minimum (void) const {AJAAutoLock tmp(&mLock); return mMinValue;}
124 
128  inline T recentMinimum (void) const
129  {
130  T result(largestPossibleValue());
131  AJAAutoLock tmp(&mLock);
132  for (auto it(mValues.begin()); it != mValues.end(); ++it)
133  if (*it < result)
134  result = *it;
135  return result;
136  }
137 
141  inline T maximum (void) const {AJAAutoLock tmp(&mLock); return mMaxValue;}
142 
146  inline T recentMaximum (void) const
147  {
148  T result(smallestPossibleValue());
149  AJAAutoLock tmp(&mLock);
150  for (auto it(mValues.begin()); it != mValues.end(); ++it)
151  if (*it > result)
152  result = *it;
153  return result;
154  }
155 
164  inline std::ostream & Print (std::ostream & oss, const bool inDetailed = false) const
165  {
166  AJAAutoLock tmp(&mLock);
167  if (isValid())
168  {
169  if (inDetailed)
170  oss << averageF() << " (avg) for last " << numStoredSamples() << " of " << totalSamples() << " samples" << std::endl
171  << recentMinimum() << " (min), " << recentMaximum() << " (max)";
172  else oss << averageF();
173  }
174  else oss << "n/a";
175  return oss;
176  }
177 
178  protected:
179  inline T sum (void) const
180  {
181  AJAAutoLock tmp(&mLock);
182  if (isEmpty())
183  return T(0);
184  T result = T(0);
185  for (auto it(mValues.begin()); it != mValues.end(); ++it)
186  result += *it;
187  return result;
188  }
189 
190  static inline T smallestPossibleValue (void)
191  {
192  if (typeid(T) == typeid(char))
193  return SCHAR_MIN;
194  else if (typeid(T) == typeid(int8_t))
195  return SCHAR_MIN;
196  else if (typeid(T) == typeid(uint8_t))
197  return 0;
198  else if (typeid(T) == typeid(int16_t))
199  return T(SHRT_MIN);
200  else if (typeid(T) == typeid(uint16_t))
201  return 0;
202  else if (typeid(T) == typeid(int))
203  return T(INT_MIN);
204  else if (typeid(T) == typeid(int32_t))
205  return T(LONG_MIN);
206  else if (typeid(T) == typeid(uint32_t))
207  return 0;
208  else if (typeid(T) == typeid(int64_t))
209  return T(LLONG_MIN);
210  else if (typeid(T) == typeid(uint64_t))
211  return 0;
212  else if (typeid(T) == typeid(float))
213  return T(-FLT_MAX);
214  else if (typeid(T) == typeid(double))
215  return T(-DBL_MAX);
216  else if (typeid(T) == typeid(long double))
217  return T(-LDBL_MAX);
218  return 0;
219  }
220 
221  static inline T largestPossibleValue (void)
222  {
223  if (typeid(T) == typeid(char))
224  return SCHAR_MAX;
225  else if (typeid(T) == typeid(int8_t))
226  return SCHAR_MAX;
227  else if (typeid(T) == typeid(uint8_t))
228  return T(UCHAR_MAX);
229  else if (typeid(T) == typeid(int16_t))
230  return T(SHRT_MAX);
231  else if (typeid(T) == typeid(uint16_t))
232  return T(0xFFFF);
233  else if (typeid(T) == typeid(int))
234  return T(INT_MAX);
235  else if (typeid(T) == typeid(int32_t))
236  return T(LONG_MAX);
237  else if (typeid(T) == typeid(uint32_t))
238  return T(0xFFFFFFFF);
239  else if (typeid(T) == typeid(int64_t))
240  return T(LLONG_MAX);
241  else if (typeid(T) == typeid(uint64_t))
242  return T(0xFFFFFFFFFFFFFFFF);
243  else if (typeid(T) == typeid(float))
244  return T(FLT_MAX);
245  else if (typeid(T) == typeid(double))
246  return T(DBL_MAX);
247  else if (typeid(T) == typeid(long double))
248  return T(LDBL_MAX);
249  return 0;
250  }
251 
252  private:
253  mutable AJALock mLock;
254  std::deque<T> mValues;
255  size_t mSampleCapacity;
256  size_t mTotNumSamples;
257  T mMinValue;
258  T mMaxValue;
259 
260 }; // AJAMovingAvg
261 
262 
269 template <typename T> inline std::ostream & operator << (std::ostream & oss, const AJAMovingAvg<T> & inAvg)
270 {
271  inAvg.Print(oss,true);
272  return oss;
273 }
274 
275 #endif // AJA_MOVINGAVG_H
AJAMovingAvg::recentMaximum
T recentMaximum(void) const
Definition: ajamovingavg.h:146
AJAMovingAvg::smallestPossibleValue
static T smallestPossibleValue(void)
Definition: ajamovingavg.h:190
AJAMovingAvg::recentMinimum
T recentMinimum(void) const
Definition: ajamovingavg.h:128
AJAMovingAvg::Print
std::ostream & Print(std::ostream &oss, const bool inDetailed=false) const
Definition: ajamovingavg.h:164
AJAMovingAvg::kDefaultMaxNumSamples
static const size_t kDefaultMaxNumSamples
Definition: ajamovingavg.h:31
AJAMovingAvg::numStoredSamples
size_t numStoredSamples(void) const
Definition: ajamovingavg.h:78
AJAMovingAvg::average
T average(void) const
Definition: ajamovingavg.h:103
AJAMovingAvg::AJAMovingAvg
AJAMovingAvg(const size_t inMaxNumSamples=kDefaultMaxNumSamples)
Definition: ajamovingavg.h:39
AJAMovingAvg::isEmpty
bool isEmpty(void) const
Definition: ajamovingavg.h:98
AJAMovingAvg::sum
T sum(void) const
Definition: ajamovingavg.h:179
lock.h
Declares the AJALock class.
AJAMovingAvg
Definition: ajamovingavg.h:28
AJAMovingAvg::totalSamples
size_t totalSamples(void) const
Definition: ajamovingavg.h:88
AJALock
Definition: lock.h:30
AJAMovingAvg::maximum
T maximum(void) const
Definition: ajamovingavg.h:141
AJAAutoLock
Definition: lock.h:91
AJAMovingAvg::sampleCapacity
size_t sampleCapacity(void) const
Definition: ajamovingavg.h:83
AJAMovingAvg::reset
void reset(const size_t inMaxNumSamples=kDefaultMaxNumSamples)
Definition: ajamovingavg.h:66
AJAMovingAvg::isValid
bool isValid(void) const
Definition: ajamovingavg.h:93
AJAMovingAvg::addSample
void addSample(const T inValue)
Definition: ajamovingavg.h:49
operator<<
std::ostream & operator<<(std::ostream &oss, const AJAMovingAvg< T > &inAvg)
Definition: ajamovingavg.h:269
AJAMovingAvg::minimum
T minimum(void) const
Definition: ajamovingavg.h:123
AJAMovingAvg::largestPossibleValue
static T largestPossibleValue(void)
Definition: ajamovingavg.h:221
AJAMovingAvg::averageF
double averageF(void) const
Definition: ajamovingavg.h:113