- unsigned i;
- for (i = m_digits.size()-1; (i > 0 && m_digits[i] != 0L); --i);
- unsigned result = m_digits.size() - i;
- m_digits.resize(i);
- return result;
+
+ unsigned shrunk = 0;
+ while (m_digits.size() > 1 && m_digits[m_digits.size()-1] == 0L)
+ {
+ //Debug("Shrink 1");
+ m_digits.pop_back();
+ shrunk++;
+ }
+ return shrunk;
+}
+
+void Arbint::GrowDigit(digit_t new_msd)
+{
+ static unsigned total_grows = 0;
+ static unsigned biggest_arbint = 1;
+ m_digits.push_back(new_msd);
+ total_grows++;
+ if (m_digits.size() > biggest_arbint)
+ {
+ biggest_arbint = m_digits.size();
+ Warn("New biggest Arbint of size %u", m_digits.size());
+ }
+ //Warn("Arbint grows digit (%.16lx), this->m_digits.size() = %u, total grown = %u", new_msd, m_digits.size(), ++total_grows);
+ //if (total_grows++ > 10000)
+ //{
+ // Fatal("Too many GrowDigit calls!");
+ //}