T convertToSeconds(const std::string &unit, T value) { T seconds; if (unit == "min") { seconds = value * 60; } else if (unit == "h") { std::string new_unit = "min"; seconds = convertToSeconds(new_unit, value * 60); } else if (unit == "s" || unit == "sec") { seconds = value; } else if (isScalable(unit, "s")) { double scaled = value * getSIScaling(unit, "s"); seconds = static_cast<T>(std::is_integral<T>::value ? std::round(scaled) : scaled); } else { std::cerr << "[nix::util::convertToSeconds]"; std::cerr << " Warning: given unit [" + unit + "] is not supported!" << std::endl; seconds = value; } return seconds; }
/** *@param info - "miles \t p_min \t p_sec \t tt_hour \t tt_min \t tt_sec" * one of three sections will be all " "; *@return the missing part of the equation */ string RunLog::PaceCalculator( string& p_Info ) { double numbers[6]; int calcCase; string retval = ""; for( int i = 0; i<6; i++) { size_t found = p_Info.find( "\t" ); if( found != string::npos ) { string num = p_Info.substr( 0, found ); if( num == " " ) calcCase = i; else { numbers[i] = atof( num.c_str() ); } p_Info = p_Info.substr( found +1 ); } else { return ""; } } double pace,tt,temp, zero = 0.0; switch( calcCase ) { case 0: //convert pace and tt to seconds pace = convertToSeconds( zero, numbers[1], numbers[2] ); tt = convertToSeconds( numbers[3], numbers[4], numbers[5] ); temp = tt / pace;//divide retval = DoubleToStr( temp ); break; case 1: case 2: //convert tt to seconds tt = convertToSeconds( numbers[3], numbers[4], numbers[5] ); temp = tt / numbers[0]; //divide by miles convertToMinSec( &numbers[1], temp ); //convert to min and seconds retval = DoubleToStr( numbers[2] ); if( retval.size() == 1 ) retval = "0" + retval; retval = DoubleToStr( numbers[1] ) + " " + retval; break; case 4: case 3: case 5: double tempM; //multiply miles by pace min adn sec temp = numbers[0] * numbers[1]; if( temp > 59 ) { numbers[3] = (int)temp / 60; tempM = (int)temp % 60; } temp = numbers[0] * numbers[2]; if( temp > 60 ) { tempM += (int)temp / 60; if (tempM > 59){ numbers[3]++; tempM -= 60;} numbers[5] = (int)temp %60; } retval = DoubleToStr( numbers[3] ) + " " + DoubleToStr( numbers[4] )+ " " + DoubleToStr( numbers[5] ); break; } return retval; }