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");
8 index = static_cast< typename T::value_type >( 0 );
10 last = T(num_samples, static_cast< typename T::value_type >(0.0));
13 template < typename T >
14 void RecurseMean<T>::operator()(const T &next_value) {
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;
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);
31 for ( uint i = 0; i < next_value.size() ; i++ ) {
32 last[i] = ((index - 1.0f) / index) * last[i] + next_value[i] / index;
35 std::cout << __CLASS__ << "index is currently: " << index << std::endl;
38 template < typename T >
39 typename T::value_type RecurseMean<T>::Index() {
40 boost::shared_lock<boost::shared_mutex> lock( monitor );
44 template < typename T >
45 void RecurseMean<T>::Reset() {
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);
52 last = T(last.size() , static_cast< typename T::value_type >(0.0f));
57 template < typename T >
58 T RecurseMean<T>::ReturnValue() {
60 boost::shared_lock<boost::shared_mutex> lock( monitor );