diff --git a/CMakeLists.txt b/CMakeLists.txt index 88f743b..4c108a3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -87,7 +87,7 @@ if(NUMBERS_TEST) ) # Provide only the minimum source files needed by downstream users - set(package_files src/ CMakeLists.txt LICENSE.txt) + set(package_files src/ CMakeLists.txt README.md LICENSE.txt) set(packaged_zip ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-src.zip) add_custom_command( OUTPUT ${packaged_zip} diff --git a/README.md b/README.md index d3665c2..ea27cc3 100644 --- a/README.md +++ b/README.md @@ -14,12 +14,52 @@ numbers - **Support for Multiple Toolchains**: GCC, Clang, MSVC -- Same as **Primitive Types** (WIP) - - **Support for Various Integer Type**: i8, i16, i32, i64, u8, u16, u32, u64, even i128 & u128 +## Documents +
-Usage +Show More + +### Background + +When performing arithmetic operations in C++, handling integer overflow can be time-consuming and frustrating. To simplify this process, we have developed this library - `numbers`. + +### Supported Functions + +`numbers` provides various integer types, consisting of i8, i16, i32, i64, i128, u8, u16, u32, u64, u128. + +To ease the difficulty of handling integer overflow, all integer types support the following five types of operations: + +1. Vanilla arithmetic operations include +, -, *, /, abs, and unary -. + + If an overflow occurs, they'll throw an exception. + + > NOTE: The abs operator is only support by signed integers. The unsigned integers don't need the abs operation. The following abs variants adhere to the same principle. + +2. Checked operations include `checked_add`, `checked_sub`, `checked_div`, `checked_mul`, `checked_neg`, and `checked_abs`. + + They return `std::optional` if no overflow occurs, or `std::nullopt` if an overflow occurs. + +3. Overflowing operations include `overflowing_add`, `overflowing_sub`, `overflowing_div`, `overflowing_mul`, `overflowing_neg`, and `overflowing_abs`. + + They return a `std::tuple` of the operation result and a boolean indicating whether an overflow would occur. If an overflow would have occurred then the wrapped value is returned. +4. Saturating operations include `saturating_add`, `saturating_sub`, `saturating_div`, `saturating_mul`, `saturating_neg`, and `saturating_abs`. + + They return the saturating value at the numeric bounds instead of overflowing. + + > NOTE: The `saturating_neg` isn't supported by unsigned integers. +5. Wrapping (modular) arithmetic operations include `wrapping_add`, `wrapping_sub`, `wrapping_div`, `wrapping_mul`, `wrapping_neg`, and `wrapping_abs`. + + The return values of them are wrapping around at the boundary of the type. + + +
+ +## Examples + +
+Show More ### operator + ```c++ @@ -75,6 +115,64 @@ std::cout << ret << '\n'; ```
+## How to build +
+Show More + +### Prerequisite + +Make sure that `CMake` and `GCC`/`Clang`/`MSVC` are installed on your machine. + +The source code, example code and test code are located in the [`src`](https://github.com/guuzaa/numbers/tree/main/src), [`examples`](https://github.com/guuzaa/numbers/tree/main/examples) and [`tests`](https://github.com/guuzaa/numbers/tree/main/tests) directory, respectively. + +### Generate build recipe + +```shell +cmake -B build +# If you are keen on Ninja +cmake -B build -G Ninja +``` + +### Build and run all examples + +```shell +cmake --build build -t example +``` + +#### Build and run an exact example + +```shell +cmake --build build -t example-[filename] +# If you want to run the file examples/hash.cc +cmake --build build -t example-hash +# If you want to run a new file you are writing in the ./examples +cmake --build build -t example-your-file-name-with-no-extensions +``` + +### Build and run all tests + +```shell +cmake --build build -t run-tests +``` + +There are two test binaries: integer_test, uinteger_test. To run them, type the following commands: + +```shell +cmake --build build -t test-integer +cmake --build build -t test-uinteger +``` + +### Format code + +> It requires that your machine has `clang-format` installed + +```shell +cmake --build build -t check-format +cmake --build build -t format +``` + +
+ ## Contribute If you'd like to contribute, it's a good idea to discuss your plans with the project maintainers before starting work.