rspec/rules/S6179/cfamily/rule.adoc

43 lines
1.4 KiB
Plaintext
Raw Normal View History

== Why is this an issue?
2021-04-28 16:49:39 +02:00
{cpp}20 introduced the standard algorithms to compute the midpoint between two values and linear interpolation for a given coefficient.
``++std::midpoint(a, b)++`` computes the midpoint, or average, or arithmetic mean of two values ``++a++`` and ``++b++``: ``++(a+b)/2++``. The result is half-way from ``++a++`` to ``++b++``, and if ``++a++`` and ``++b++`` are pointers it points to the middle of a contiguous memory segment between the two. A naive midpoint computation might suffer from a possible overflow or be inefficient. That's why in most cases ``++std::midpoint++`` is preferable.
``++std::lerp(a, b, t)++`` returns linear interpolation between values ``++a++`` and ``++b++`` with a coefficient ``++t++``: ``++a+t*(a-b)++``, where ``++t++`` is between 0 and 1.
This rule reports computations that should be replaced with ``++std::midpoint++`` or ``++std::lerp++``.
=== Noncompliant code example
2021-04-28 16:49:39 +02:00
2022-02-04 17:28:24 +01:00
[source,cpp]
2021-04-28 16:49:39 +02:00
----
auto avg1 = (a + b)/2; // Noncompliant, might overflow
auto avg2 = a + (b - a)/2; // Noncompliant
auto third = a + (b - a)*0.3f; // Noncompliant
----
=== Compliant solution
2021-04-28 16:49:39 +02:00
2022-02-04 17:28:24 +01:00
[source,cpp]
2021-04-28 16:49:39 +02:00
----
auto avg1 = std::midpoint(a, b);
auto avg2 = std::midpoint(a, b);
auto third = std::lerp(a, b, 0.3f);
----
ifdef::env-github,rspecator-view[]
'''
== Implementation Specification
(visible only on this page)
include::message.adoc[]
endif::env-github,rspecator-view[]