Skip to content

Commit

Permalink
AK: Optimize performance in GenericShorthands via forwarding references
Browse files Browse the repository at this point in the history
Functions in AK/GenericShorthands used pass-by-value which results in
copying values when calling those functions. This could be expensive
for complex types. To optimize performance, we switch the functions to
use forwarding references.
  • Loading branch information
izuzak authored and gmta committed Jan 9, 2025
1 parent 49fc569 commit 36190e3
Showing 1 changed file with 19 additions and 18 deletions.
37 changes: 19 additions & 18 deletions AK/GenericShorthands.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,61 +7,62 @@
#pragma once

#include <AK/Platform.h>
#include <AK/StdLibExtras.h>

namespace AK {

template<typename T, typename... Ts>
[[nodiscard]] constexpr bool first_is_one_of(T const to_compare, Ts const... valid_values)
[[nodiscard]] constexpr bool first_is_one_of(T&& to_compare, Ts&&... valid_values)
{
return (... || (to_compare == valid_values));
return (... || (forward<T>(to_compare) == forward<Ts>(valid_values)));
}

template<typename T, typename... Ts>
[[nodiscard]] constexpr bool first_is_smaller_than_one_of(T const to_compare, Ts const... valid_values)
[[nodiscard]] constexpr bool first_is_smaller_than_one_of(T&& to_compare, Ts&&... valid_values)
{
return (... || (to_compare < valid_values));
return (... || (forward<T>(to_compare) < forward<Ts>(valid_values)));
}

template<typename T, typename... Ts>
[[nodiscard]] constexpr bool first_is_smaller_or_equal_than_one_of(T const to_compare, Ts const... valid_values)
[[nodiscard]] constexpr bool first_is_smaller_or_equal_than_one_of(T&& to_compare, Ts&&... valid_values)
{
return (... || (to_compare <= valid_values));
return (... || (forward<T>(to_compare) <= forward<Ts>(valid_values)));
}

template<typename T, typename... Ts>
[[nodiscard]] constexpr bool first_is_larger_than_one_of(T const to_compare, Ts const... valid_values)
[[nodiscard]] constexpr bool first_is_larger_than_one_of(T&& to_compare, Ts&&... valid_values)
{
return (... || (to_compare > valid_values));
return (... || (forward<T>(to_compare) > forward<Ts>(valid_values)));
}

template<typename T, typename... Ts>
[[nodiscard]] constexpr bool first_is_larger_or_equal_than_one_of(T const to_compare, Ts const... valid_values)
[[nodiscard]] constexpr bool first_is_larger_or_equal_than_one_of(T&& to_compare, Ts&&... valid_values)
{
return (... || (to_compare >= valid_values));
return (... || (forward<T>(to_compare) >= forward<Ts>(valid_values)));
}

template<typename T, typename... Ts>
[[nodiscard]] constexpr bool first_is_smaller_than_all_of(T const to_compare, Ts const... valid_values)
[[nodiscard]] constexpr bool first_is_smaller_than_all_of(T&& to_compare, Ts&&... valid_values)
{
return (... && (to_compare < valid_values));
return (... && (forward<T>(to_compare) < forward<Ts>(valid_values)));
}

template<typename T, typename... Ts>
[[nodiscard]] constexpr bool first_is_smaller_or_equal_than_all_of(T const to_compare, Ts const... valid_values)
[[nodiscard]] constexpr bool first_is_smaller_or_equal_than_all_of(T&& to_compare, Ts&&... valid_values)
{
return (... && (to_compare <= valid_values));
return (... && (forward<T>(to_compare) <= forward<Ts>(valid_values)));
}

template<typename T, typename... Ts>
[[nodiscard]] constexpr bool first_is_larger_than_all_of(T const to_compare, Ts const... valid_values)
[[nodiscard]] constexpr bool first_is_larger_than_all_of(T&& to_compare, Ts&&... valid_values)
{
return (... && (to_compare > valid_values));
return (... && (forward<T>(to_compare) > forward<Ts>(valid_values)));
}

template<typename T, typename... Ts>
[[nodiscard]] constexpr bool first_is_larger_or_equal_than_all_of(T const to_compare, Ts const... valid_values)
[[nodiscard]] constexpr bool first_is_larger_or_equal_than_all_of(T&& to_compare, Ts&&... valid_values)
{
return (... && (to_compare >= valid_values));
return (... && (forward<T>(to_compare) >= forward<Ts>(valid_values)));
}
}

Expand Down

0 comments on commit 36190e3

Please sign in to comment.