SuperNumber<integerType>::SuperNumber(const std::string &value, unsigned short radix) : SuperNumber<integerType>() { if (radix > 36) { throw std::out_of_range("The radix was " + std::to_string(radix) + ". That is bigger than 36. The maxiumum radix."); } else if (radix < 2) { throw std::out_of_range("The radix was " + std::to_string(radix) + ". That is less than 2. The minimum radix."); } std::map<char, SuperNumber<integerType>> allowedCharacters; SuperNumber<integerType> minus1(-1); char i; for (i = 0; i < 10; i++) { allowedCharacters['0' + i] = i; } for (i = 10; i < radix; i++) { allowedCharacters['7' + i] = i; allowedCharacters['W' + i] = i; } allowedCharacters['.'] = minus1; std::map<char, SuperNumber<integerType>>::const_iterator it; std::map<char, SuperNumber<integerType>>::const_iterator end(allowedCharacters.end()); size_t stringSize = value.size(); bool commaFound = false; SuperNumber<integerType> Radix(radix); SuperNumber<integerType> Divisor(1); for (size_t i = 0; i < stringSize; i++) { it = allowedCharacters.find(value[i]); if (it != end) { if (commaFound) { if (it->second == minus1) { throw invalid_argument("\"" + value + "\" could not be parsed as a number!"); } Divisor *= Radix; *this += it->second / Divisor; } else { if (it->second == minus1) { commaFound = true; } else{ *this *= Radix; *this += it->second; } } } else { throw invalid_argument("\"" + value + "\" could not be parsed as a number!"); } } }
void History::AddData(double value, time_t ticks, bool resolve) { if(ticks == 0) ticks = wxDateTime::Now().GetTicks(); // don't allow more than one entree per tick if(data[0].data.size() && data[0].data.front().ticks == ticks) return; AddData(0, HistoryAtom(value, ticks)); // push data into average buffer? for(int i=1; i<HISTORY_BUCKETS; i++) { time_t lticks; if(data[i].data.size()) lticks = data[i].data.front().ticks; else lticks = data[i-1].data.back().ticks; if(ticks - lticks > Divisor(i)) { double total = 0, count = 0, lv = NAN; for(std::list<HistoryAtom>::iterator it = data[i-1].data.begin(); it != data[i-1].data.end(); it++) { if(it->ticks < lticks) break; double v = it->value; if(resolve) { if(v - lv > 180) v -= 360; else if(lv - v > 180) v += 360; } total += v; lv = v; count++; } if(count > 0) AddData(i, HistoryAtom(total / count, ticks)); } } }
int History::Depth(int i) { return HISTORY_DEPTH*Divisor(i); }