Euler C++ Implementation
All problems are solved in C++98. It is tested on clang, g++, and msvc (the Visual Studios compiler).
Organization
All C++ files share a common prefix with their problem number. All shared functions are moved to header files in the include subfolder
Makefile
There are four main recipes in this Makefile
dependencies
This recipe installs all the required and test dependencies. See the Dependencies section for more info
test
This recipe runs tests in a single thread and performs benchmarks on each. This test infrastructure is recycled from the python section.
test_*
This recipe runs tests in multiple threads, using however many are
specified by the number after the _. For example, test_3
would
spawn three python processes. Because benchmark disables itself when
running in children processes, benchmark info is not available with this
recipe.
native
This recipe borrows the C test infrastructure. This is entirely to allow CodeQL to analyze my C++ code. It is not actually a supported test runner. In future, it will be replaced with a C++-native test runner.
Tests
Compiler Detection Macros
There are a set of macros which detect which compiler is being used.
These macros are mostly used to route around issues with particular
compilers. For instance, PCC does not allow me to include <stdlib.h>
or <math.h>
on the systems I've tested it on, so I need to route
around that. This test checks that those macros are correct.
Prime Infrastructure Test
(Note that this is in progress, and these tests will be run only when there is an implementation to refer to. Since they are identical to the test in the c folder, the test is already written and ready to go.)
This test checks five things:
It checks
is_prime()
for numbers up toMAX_PRIME
, where that is defined in the testIt checks that
is_composite()
returns truthy values on composites in that range, and falsey values on primesIt checks that
is_composite()
returns the smallest prime factor on composite numbersIt checks that the prime numbers are generated in the correct order
It checks that all these operations are completed in less than 200ns *
MAX_PRIME
Generic Problems
For each problem it will check the answer against a known dictionary. If the problem is not in the "known slow" category (meaning that I generate the correct answer with a poor solution), it will run it as many times as the benchmark plugin wants. Otherwise it is run exactly once.
A test fails if it gets the wrong answer or if it takes more than 1 minute.
Dependencies
I try to keep the dependencies of this project as small as possible, except for test plugins. At the moment there are no non-test dependencies for this section.
Note that there are optional test that leverage the Python
infrastructure. If you want these tests to work you need to go to the
python folder and run make dependencies
or define the
NO_OPTIONAL_TESTS environment variable.
Environment Variables
COMPILER_OVERRIDE
If this variable is defined, it should contain a comma-separated list of the compilers you would like to test from the following list (case insensitive):
aocc (AMD Optimized C Compiler)
cl (Visual Studios compiler)
clang
gcc
icc (Intel C Compiler)
pcc (Portable C Compiler)
tcc (Tiny C Compiler)
If this variable is not defined, compilers will be auto-detected using
which()
.
AOCC_OVERRIDE
If this variable is defined, it should hold a string representing the AMD compiler binary you would like to use. One case you may want this in is to test both the AMD compiler and traditional clang by renaming the AMD compiler's executable.
GCC_OVERRIDE
If this variable is defined, it should hold a string representing the
gcc
binary you would like to use. One case you may want this in is
on OSX or Termux, where gcc
is often remapped to clang
.
NO_OPTIONAL_TESTS
If this variable is defined to something other than 0 or an empty string, the test suite will skip any tests which are not directly related to Project Euler problems. This value will default to the same value as ONLY_SLOW.
NO_SLOW
If this variable is defined to something other than 0 or an empty string, problems in the known_slow group will not be tested. This variable defaults to True on Termux systems. If both NO_SLOW and ONLY_SLOW are truthy, they will be ignored and a warning will be issued.
ONLY_SLOW
If this variable is defined to something other than 0 or an empty string, only problems in the known_slow group will be tested. If both NO_SLOW and ONLY_SLOW are truthy, they will be ignored and a warning will be issued.
Library Code
Problems Solved
- C++ Implementation of Problem 1
- C++ Implementation of Problem 2
- C++ Implementation of Problem 3
- C++ Implementation of Problem 4
- C++ Implementation of Problem 5
- C++ Implementation of Problem 6
- C++ Implementation of Problem 7
- C++ Implementation of Problem 8
- C++ Implementation of Problem 9
- C++ Implementation of Problem 10
- C++ Implementation of Problem 11
- C++ Implementation of Problem 13
- C++ Implementation of Problem 14
- C++ Implementation of Problem 15
- C++ Implementation of Problem 16
- C++ Implementation of Problem 17
- C++ Implementation of Problem 19
- C++ Implementation of Problem 20
- C++ Implementation of Problem 22
- C++ Implementation of Problem 34
- C++ Implementation of Problem 76
- C++ Implementation of Problem 836