+template < typename T >
+number< T >& number< T >::operator+= (const number< T >& n)
+{
+ atomic_type c = 0;
+ size_type ini = 0;
+ size_type fin = std::min(chunk.size(), n.chunk.size());
+ // "intersección" entre ambos chunks
+ // +-----+-----+------+------+
+ // | | | | | <--- mio
+ // +-----+-----+------+------+
+ // +-----+-----+------+
+ // | | | | <--- chunk de n
+ // +-----+-----+------+
+ //
+ // |------------------|
+ // Esto se procesa en este for
+ for (size_type i = ini; i < fin; ++i)
+ {
+ chunk[i] += n.chunk[i] + c;
+ if (chunk[i] || (!n.chunk[i] && !c)) c = 0; // OK
+ else c = 1; // Overflow
+ }
+ // si mi chunk es más grande que el del otro, sólo me queda
+ // propagar el carry
+ if (chunk.size() >= n.chunk.size())
+ {
+ if (c) carry(fin); // Propago carry
+ return *this;
+ }
+ // Hay más
+ // +-----+-----+------+
+ // | | | | <--- mío
+ // +-----+-----+------+
+ // +-----+-----+------+------+
+ // | | | | | <--- chunk de n
+ // +-----+-----+------+------+
+ //
+ // |------|
+ // Esto se procesa en este for
+ // (suma los chunks de n propagando algún carry si lo había)
+ ini = fin;
+ fin = n.chunk.size();
+ for (size_type i = ini; i < fin; ++i)
+ {
+ chunk.push_back(n.chunk[i] + c); // Agrego nuevo átomo
+ if (chunk[i] || !c) c = 0; // OK
+ else c = 1; // Overflow
+ }
+ // Si me queda algún carry colgado, hay que agregar un "átomo"
+ // más al chunk.
+ if (c) chunk.push_back(1); // Último carry
+ return *this;
+}
+