From: Matt McCutchen Date: Sat, 27 Jan 2007 21:06:18 +0000 (-0500) Subject: Old snapshot `bigint-2006.04.24'; see the ChangeLog file. X-Git-Tag: v2007.07.07~10 X-Git-Url: https://mattmccutchen.net/bigint/bigint.git/commitdiff_plain/918d66f23e6b2528010db6f121e229f488fe3410 Old snapshot `bigint-2006.04.24'; see the ChangeLog file. --- diff --git a/.cdtproject b/.cdtproject deleted file mode 100644 index 8b05cc4..0000000 --- a/.cdtproject +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/.project b/.project deleted file mode 100644 index d6e8622..0000000 --- a/.project +++ /dev/null @@ -1,89 +0,0 @@ - - - bigint - - - - - - org.eclipse.cdt.make.core.makeBuilder - - - org.eclipse.cdt.make.core.build.arguments - - - - org.eclipse.cdt.core.errorOutputParser - org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser; - - - org.eclipse.cdt.make.core.enableAutoBuild - true - - - org.eclipse.cdt.make.core.environment - - - - org.eclipse.cdt.make.core.enableFullBuild - true - - - org.eclipse.cdt.make.core.build.target.inc - all - - - org.eclipse.cdt.make.core.enabledIncrementalBuild - true - - - org.eclipse.cdt.make.core.build.location - - - - org.eclipse.cdt.make.core.build.target.clean - clean - - - org.eclipse.cdt.make.core.build.command - make - - - org.eclipse.cdt.make.core.enableCleanBuild - true - - - org.eclipse.cdt.make.core.append_environment - true - - - org.eclipse.cdt.make.core.build.target.full - clean all - - - org.eclipse.cdt.make.core.useDefaultBuildCmd - true - - - org.eclipse.cdt.make.core.build.target.auto - all - - - org.eclipse.cdt.make.core.stopOnError - false - - - - - org.eclipse.cdt.make.core.ScannerConfigBuilder - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.make.core.makeNature - org.eclipse.cdt.make.core.ScannerConfigNature - org.eclipse.cdt.core.ccnature - - diff --git a/BigUnsigned.cc b/BigUnsigned.cc index a2ab58c..10c47db 100644 --- a/BigUnsigned.cc +++ b/BigUnsigned.cc @@ -752,8 +752,10 @@ void BigUnsigned::operator ++() { } if (carry) { // Matt fixed a bug 2004.12.24: next 2 lines used to say allocateAndCopy(len + 1) + // Matt fixed another bug 2006.04.24: + // old number only has len blocks, so copy before increasing length + allocateAndCopy(len + 1); len++; - allocateAndCopy(len); blk[i] = 1; } } diff --git a/BigUnsigned.hh b/BigUnsigned.hh index a587b7c..a62b7db 100644 --- a/BigUnsigned.hh +++ b/BigUnsigned.hh @@ -104,8 +104,14 @@ class BigUnsigned : protected NumberlikeArray { // Compares this to x like Perl's <=> CmpRes compareTo(const BigUnsigned &x) const; // Normal comparison operators - NumberlikeArray::operator ==; // (NlA) The body used to be `{ return compareTo(x) == equal; }'. For performance reasons we use NumberlikeArray code that only worries about (in)equality and doesn't waste time determining which is bigger - NumberlikeArray::operator !=; // (NlA) Ditto. + // Bug fixed 2006.04.24: Only we, not the user, can pass a BigUnsigned off as a + // NumberlikeArray, so we have to wrap == and !=. + bool operator ==(const BigUnsigned &x) const { + return NumberlikeArray::operator ==(x); + } + bool operator !=(const BigUnsigned &x) const { + return NumberlikeArray::operator !=(x); + } bool operator < (const BigUnsigned &x) const { return compareTo(x) == less ; } bool operator <=(const BigUnsigned &x) const { return compareTo(x) != greater; } bool operator >=(const BigUnsigned &x) const { return compareTo(x) != less ; } diff --git a/ChangeLog b/ChangeLog index d711fd8..25bc9fc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6,6 +6,10 @@ Change Log ========== These entries tell you what was added, fixed, or improved in each version as compared to the previous one. In case you haven't noticed, a version number roughly corresponds to the release date of that version in `YYYY.MM.DD[.N]' format, where `.N' goes `.2', `.3', etc. if there are multiple versions on the same day. +2006.04.24 +---------- +Two bug fixes: BigUnsigned "++x" no longer segfaults when x grows in length, and BigUnsigned == and != are now redeclared so as to be usable. I redid the Makefile: I removed the *.tag mechanism and hard-coded the library's header dependencies, I added comments, and I made the Makefile more useful for building one's own programs instead of just the sample. + 2006.02.26 ---------- A few tweaks in preparation for a group to distribute the library. The project Web site has moved; I updated the references. I fixed a typo and added a missing function in NumberlikeArray.hh. I'm using Eclipse now, so you get Eclipse project files. diff --git a/Makefile b/Makefile index 626b7f9..c99cf54 100644 --- a/Makefile +++ b/Makefile @@ -3,55 +3,51 @@ # http://hashproduct.metaesthetics.net/bigint/ # -# The implicit rules we need -%.tag : % - touch $@ +# Mention default target. +all : + +# Implicit rule to compile C++ files. Modify to your taste. %.o : %.cc g++ -c -O -Wall -Wextra -pedantic $< -# Default target -all : library sample +# Components of the library. +library-objects = BigUnsigned.o BigInteger.o BigUnsignedInABase.o BigIntegerUtils.o +library-headers = NumberlikeArray.hh BigUnsigned.hh BigUnsignedInABase.hh BigInteger.hh BigIntegerLibrary.hh + +# To ``make the library'', make all its objects using the implicit rule. +library : $(library-objects) + +# Extra dependencies from `#include'. +BigUnsigned.o : NumberlikeArray.hh BigUnsigned.hh +BigInteger.o : NumberlikeArray.hh BigUnsigned.hh BigInteger.hh +BigUnsignedInABase.o : NumberlikeArray.hh BigUnsigned.hh BigUnsignedInABase.hh +BigIntegerUtils.o : NumberlikeArray.hh BigUnsigned.hh BigUnsignedInABase.hh BigInteger.hh -library : BigUnsigned.o BigInteger.o BigUnsignedInABase.o BigIntegerUtils.o +# The rules below build a program that uses the library. They are preset to +# build ``sample'' from ``sample.cc''. You can change the name(s) of the +# source file(s) and program file to build your own program, or you can write +# your own Makefile. -# Extra dependencies from `#include' -BigUnsigned.hh.tag : NumberlikeArray.hh.tag -BigUnsigned.o : BigUnsigned.hh.tag -BigInteger.hh.tag : BigUnsigned.hh.tag -BigInteger.o : BigInteger.hh.tag -BigUnsignedInABase.hh.tag : BigUnsigned.hh.tag -BigUnsignedInABase.o : BigUnsignedInABase.hh.tag -BigIntegerUtils.hh.tag : BigInteger.hh.tag -BigIntegerUtils.o : BigIntegerUtils.hh.tag +# Components of the program. +program = sample +program-objects = sample.o -# sample program -sample : library sample.cc - g++ -osample *.o sample.cc +# Conservatively assume all the program source files depend on all the library +# headers. You can change this if it is not the case. +$(program-objects) : $(library-headers) +# How to link the program. The implicit rule covers individual objects. +$(program) : $(program-objects) $(library-objects) + g++ $(program-objects) $(library-objects) -o $(program) + +# Delete all generated files we know about. clean : - rm -f *.tag *.o sample + rm -f $(library-objects) $(program-objects) $(program) -# The `.tag' mechanism allows for proper recompilation when a header file -# changes, considering that some header files may include others. -# -# If a header file X includes other header -# files Y and Z, we create a file X.tag that depends -# on X, Y.tag, and Z.tag. Other headers that include X should -# depend on X.tag. -# -# Suppose Y is subsequently changed. X doesn't get ``recompiled'', -# but anything that includes X should be recompiled. Well, Y.tag becomes -# out-of-date, so X.tag becomes out-of-date, so anything depending on X.tag -# (that is, anything including X) becomes out-of-date. Magic! -# -# In this system, the tag files are empty files used only for their -# timestamps. If one wished to use precompiled headers, one could use -# ``.gch'' files exactly how ``.tag'' files are used now, except that -# their contents would be meaningful. -# -# However, the same sort of ``deadly diamond'' problem that surfaces with -# multiple inheritance also applies to precompiled headers. The ``#ifndef'' -# mechanism that prevents multiple inclusion doesn't work when headers are -# compiled independently in a hierarchical structure, since the second -# inclusion of a file won't even know there was a first inclusion. For -# this reason, I just use ``.tag''s. +# I removed the *.tag dependency tracking system because it had few advantages +# over manually entering all the dependencies. If there were a portable, +# reliable dependency tracking system, I'd use it, but I know of no such; +# cons and depcomp are almost good enough. + +# Come back and define default target. +all : library $(program)