JASPL  0.2
Just Another Signal Processing Library
jalgorithm.tpp
1 template < typename T >
2 RecurseMean<T>::RecurseMean(uint num_samples) {
3  static_assert(is_stdlib_container< T >::value,
4  "Recurse mean can only operate on container-like objects.");
5  static_assert(std::is_floating_point< typename T::value_type >::value,
6  "Recurse mean can only accept floating-point types");
7 
8  index = static_cast< typename T::value_type >( 0 );
9 
10  last = T(num_samples, static_cast< typename T::value_type >(0.0));
11 }
12 
13 template < typename T >
14 void RecurseMean<T>::operator()(const T &next_value) {
15 
16  if ( last.size() != next_value.size() ) {
17  std::cout << "________________________________________________" << std::endl;
18  std::cout << "Sample size did not match averaging engine size" << std::endl;
19  std::cout << "Sample Size: " << last.size() << " Input Size: " << next_value.size() << std::endl;
20  std::cout << "________________________________________________" << std::endl;
21  return;
22  }
23 
24  // get upgradable access
25  boost::upgrade_lock<boost::shared_mutex> lock( monitor );
26  // get exclusive access
27  boost::upgrade_to_unique_lock<boost::shared_mutex> uniqueLock(lock);
28 
29  index += 1.0f;
30 
31  for ( uint i = 0; i < next_value.size() ; i++ ) {
32  last[i] = ((index - 1.0f) / index) * last[i] + next_value[i] / index;
33  }
34 
35  std::cout << __CLASS__ << "index is currently: " << index << std::endl;
36 }
37 
38 template < typename T >
39 typename T::value_type RecurseMean<T>::Index() {
40  boost::shared_lock<boost::shared_mutex> lock( monitor );
41  return index;
42 }
43 
44 template < typename T >
45 void RecurseMean<T>::Reset() {
46 
47  // get upgradable access
48  boost::upgrade_lock<boost::shared_mutex> lock( monitor );
49  // get exclusive access
50  boost::upgrade_to_unique_lock<boost::shared_mutex> uniqueLock(lock);
51 
52  last = T(last.size() , static_cast< typename T::value_type >(0.0f));
53  index = 0.0f;
54 
55 }
56 
57 template < typename T >
58 T RecurseMean<T>::ReturnValue() {
59 
60  boost::shared_lock<boost::shared_mutex> lock( monitor );
61  return last;
62 
63 }