Example #1
0
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!");
		}
	}
}
Example #2
0
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));
        }
    }
}
Example #3
0
int History::Depth(int i)
{
    return HISTORY_DEPTH*Divisor(i);
}