Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/real-time-cpp-snippets.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ jobs:
- name: host-snippets-all
run: |
cd ${{ matrix.chapter }}
./${{ matrix.chapter }}.sh ${{ matrix.compiler }} c++20
./${{ matrix.chapter }}.sh ${{ matrix.compiler }} c++23
working-directory: ./code_snippets
host-snippets-chapter06:
runs-on: ubuntu-latest
Expand Down
8 changes: 7 additions & 1 deletion code_snippets/chapter03/chapter03.sh
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,10 @@ ${GCC} -std=${STD} -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address
${GCC} -std=${STD} -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter03_21-001_span.cpp -o ./bin/chapter03_21-001_span.exe
${GCC} -std=${STD} -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter03_22-001_mersenne_twister_19937.cpp -o ./bin/chapter03_22-001_mersenne_twister_19937.exe
${GCC} -std=${STD} -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter03_22-002_test_random_engines.cpp -o ./bin/chapter03_22-002_test_random_engines.exe
if [[ "${GCC}" == "g++" ]]; then
${GCC} -std=${STD} -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter03_23-001_expected_div_int.cpp -o ./bin/chapter03_23-001_expected_div_int.exe
${GCC} -std=${STD} -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter03_23-002_expected_div_integral.cpp -o ./bin/chapter03_23-002_expected_div_integral.exe
fi

if [[ "${GCC}" == "g++" ]]; then
ls -la \
Expand Down Expand Up @@ -112,7 +116,9 @@ ls -la \
./bin/chapter03_20-002_alias.exe \
./bin/chapter03_21-001_span.exe \
./bin/chapter03_22-001_mersenne_twister_19937.exe \
./bin/chapter03_22-002_test_random_engines.exe
./bin/chapter03_22-002_test_random_engines.exe \
./bin/chapter03_23-001_expected_div_int.exe \
./bin/chapter03_23-002_expected_div_integral.exe
else
ls -la \
./bin/chapter03_01-001_declare_locals.exe \
Expand Down
61 changes: 61 additions & 0 deletions code_snippets/chapter03/chapter03_23-001_expected_div_int.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
///////////////////////////////////////////////////////////////////////////////
// Copyright Christopher Kormanyos 2025.
// Distributed under the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt
// or copy at http://www.boost.org/LICENSE_1_0.txt)
//

#include <expected>
#include <iostream>

// chapter03_23-001_expected_div_int.cpp

enum class div_error
{
div_none,
div_by_zero
};

auto safe_divide(int a, int b) noexcept -> std::expected<int, div_error>
{
if (b == 0)
{
return std::unexpected(div_error::div_by_zero);
}
else
{
return a / b;
}
}

auto do_something() -> void
{
// Division by zero.
auto result = safe_divide(10, 0);

if (result.error() == div_error::div_by_zero)
{
std::cout << "Division by zero" << std::endl;
}
else
{
std::cout << "Division ok, result: " << *result << std::endl;
}

result = safe_divide(10, 2);

if (result.error() == div_error::div_by_zero)
{
std::cout << "Division by zero" << std::endl;
}
else
{
// Division ok, result: 5
std::cout << "Division ok, result: " << *result << std::endl;
}
}

auto main() -> int
{
do_something();
}
64 changes: 64 additions & 0 deletions code_snippets/chapter03/chapter03_23-002_expected_div_integral.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
///////////////////////////////////////////////////////////////////////////////
// Copyright Christopher Kormanyos 2025.
// Distributed under the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt
// or copy at http://www.boost.org/LICENSE_1_0.txt)
//

#include <expected>
#include <iostream>

// chapter03_23-001_expected_div_int.cpp

enum class div_error
{
div_none,
div_by_zero
};

template<typename T>
auto safe_divide(T a, T b)
-> std::enable_if_t<std::is_integral_v<T>,
std::expected<T, div_error>>
{
if (b == T { 0 })
{
return std::unexpected(div_error::div_by_zero);
}
else
{
return a / b;
}
}

auto do_something() -> void
{
// Division by zero.
auto result = safe_divide(10U, 0U);

if (result.error() == div_error::div_by_zero)
{
std::cout << "Division by zero" << std::endl;
}
else
{
std::cout << "Division ok, result: " << *result << std::endl;
}

result = safe_divide(10, 2);

if (result.error() == div_error::div_by_zero)
{
std::cout << "Division by zero" << std::endl;
}
else
{
// Division ok, result: 5
std::cout << "Division ok, result: " << *result << std::endl;
}
}

auto main() -> int
{
do_something();
}
16 changes: 10 additions & 6 deletions code_snippets/chapter05/chapter05.sh
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,18 @@ $GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_05-002_template_point.cpp -o ./bin/chapter05_05-002_template_point.exe
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_05-003_template_point.cpp -o ./bin/chapter05_05-003_template_point.exe
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_06-001_template_specialization.cpp -o ./bin/chapter05_06-001_template_specialization.exe
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_06-002_template_point.cpp -o ./bin/chapter05_06-002_template_point.exe
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_06-002_template_enable_if.cpp -o ./bin/chapter05_06-002_template_enable_if.exe
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_06-003_template_concepts.cpp -o ./bin/chapter05_06-003_template_concepts.exe
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_06-004_template_point.cpp -o ./bin/chapter05_06-004_template_point.exe
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_07-001_led_static_polymorphism.cpp -o ./bin/chapter05_07-001_led_static_polymorphism.exe
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_08-001_using_the_stl.cpp -o ./bin/chapter05_08-001_using_the_stl.exe
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_08-002_using_the_stl_algo.cpp -o ./bin/chapter05_08-002_using_the_stl_algo.exe
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_08-003_std_for_each.cpp -o ./bin/chapter05_08-003_std_for_each.exe
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_09-001_factory_simple.cpp -o ./bin/chapter05_09-001_factory_simple.exe
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_09-002_factory_variadic_template.cpp -o ./bin/chapter05_09-002_factory_variadic_template.exe
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_10-001_metaprogram_factorial.cpp -o ./bin/chapter05_10-001_metaprogram_factorial.exe
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_10-002_metaprogram_pow10.cpp -o ./bin/chapter05_10-002_metaprogram_pow10.exe
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_10-003_metaprogram_inner_product.cpp -o ./bin/chapter05_10-003_metaprogram_inner_product.exe
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_10-002_const_eval_pow10.cpp -o ./bin/chapter05_10-002_const_eval_pow10.exe
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_10-003_const_eval_inner_product.cpp -o ./bin/chapter05_10-003_const_eval_inner_product.exe
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_11-001_tuple_things_simple.cpp -o ./bin/chapter05_11-001_tuple_things_simple.exe
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_11-002_tuple_things_metaprogram.cpp -o ./bin/chapter05_11-002_tuple_things_metaprogram.exe
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_11-003_tuple_things_metaprogram.cpp -o ./bin/chapter05_11-003_tuple_things_metaprogram.exe
Expand All @@ -67,16 +69,18 @@ ls -la \
./bin/chapter05_05-002_template_point.exe \
./bin/chapter05_05-003_template_point.exe \
./bin/chapter05_06-001_template_specialization.exe \
./bin/chapter05_06-002_template_point.exe \
./bin/chapter05_06-002_template_enable_if.exe \
./bin/chapter05_06-003_template_concepts.exe \
./bin/chapter05_06-004_template_point.exe \
./bin/chapter05_07-001_led_static_polymorphism.exe \
./bin/chapter05_08-001_using_the_stl.exe \
./bin/chapter05_08-002_using_the_stl_algo.exe \
./bin/chapter05_08-003_std_for_each.exe \
./bin/chapter05_09-001_factory_simple.exe \
./bin/chapter05_09-002_factory_variadic_template.exe \
./bin/chapter05_10-001_metaprogram_factorial.exe \
./bin/chapter05_10-002_metaprogram_pow10.exe \
./bin/chapter05_10-003_metaprogram_inner_product.exe \
./bin/chapter05_10-002_const_eval_pow10.exe \
./bin/chapter05_10-003_const_eval_inner_product.exe \
./bin/chapter05_11-001_tuple_things_simple.exe \
./bin/chapter05_11-002_tuple_things_metaprogram.exe \
./bin/chapter05_11-003_tuple_things_metaprogram.exe \
Expand Down
Original file line number Diff line number Diff line change
@@ -1,52 +1,34 @@
///////////////////////////////////////////////////////////////////////////////
// Copyright Christopher Kormanyos 2017 - 2018.
// Copyright Christopher Kormanyos 2017 - 2025.
// Distributed under the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt
// or copy at http://www.boost.org/LICENSE_1_0.txt)
//

#include <iostream>
#include <string>

// chapter05_06-001_template_specialization.cpp

// The original add template function.
// Generic add template function.
template<typename T>
T add(const T& a, const T& b)
auto add(T a, T b) -> T
{
return a + b;
}

// Make template specializations of add() with
// easy-to-detect errors for float, double
// and long double.

template<>
float add<float>(const float&, const float&)
{
// Explicitly create an erroneous result!
return 0.0F;
}

// Specialize add() for the type int.
template<>
double add<double>(const double&, const double&)
auto add<int>(int a, int b) -> int
{
// Explicitly create an erroneous result!
return 0.0;
return a + b;
}

template<>
long double add<long double>(const long double&,
const long double&)
auto main() -> int
{
// Explicitly create an erroneous result!
return 0.0L;
}
// Add with generic template to get result "abcxyz".
std::cout << add(std::string("abc"), std::string("xyz")) << std::endl;

int main()
{
// 3
// Add with specialized template to get result 3.
std::cout << add(1, 2) << std::endl;

// 0
std::cout << add(1.0F, 2.0F) << std::endl;
}
40 changes: 40 additions & 0 deletions code_snippets/chapter05/chapter05_06-002_template_enable_if.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
///////////////////////////////////////////////////////////////////////////////
// Copyright Christopher Kormanyos 2017 - 2025.
// Distributed under the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt
// or copy at http://www.boost.org/LICENSE_1_0.txt)
//

#include <iostream>

// chapter05_06-002_template_enable_if.cpp

// The original add template function.
template<typename T>
auto add(T a, T b) noexcept
-> std::enable_if_t<!std::is_floating_point_v<T>, T>
{
return a + b;
}

// Easy-to-detect errors for float, double
// and long double.

template<typename T>
auto add(T, T) noexcept
-> std::enable_if_t<std::is_floating_point_v<T>, T>
{
// Explicitly create an erroneous result!
return T { 0.0F };
}

auto main() -> int;

auto main() -> int
{
// 3
std::cout << add(1, 2) << std::endl;

// 0
std::cout << add(1.0F, 2.0F) << std::endl;
}
Loading