Cleanup: Use none-const get_single_value for setting values

This patch adds a none-const variant of the get_single_value method and
use that in the set_single_value method, which will reduce code
duplication. This is also needed for a future change.
This commit is contained in:
Omar Emara
2025-01-28 13:38:28 +02:00
parent 2ae06ac16e
commit a9abb5254e

View File

@@ -5,6 +5,7 @@
#pragma once
#include <type_traits>
#include <utility>
#include "BLI_assert.h"
#include "BLI_math_base.hh"
@@ -384,7 +385,8 @@ class Result {
/* Gets the single value stored in the result. Assumes the result stores a value of the given
* template type. */
template<typename T> T get_single_value() const;
template<typename T> const T &get_single_value() const;
template<typename T> T &get_single_value();
/* Gets the single value stored in the result, if the result is not a single value, the given
* default value is returned. Assumes the result stores a value of the same type as the template
@@ -560,7 +562,7 @@ inline void *Result::data() const
return nullptr;
}
template<typename T> inline T Result::get_single_value() const
template<typename T> inline const T &Result::get_single_value() const
{
BLI_assert(this->is_single_value());
static_assert(Result::is_supported_type<T>());
@@ -594,6 +596,11 @@ template<typename T> inline T Result::get_single_value() const
}
}
template<typename T> inline T &Result::get_single_value()
{
return const_cast<T &>(std::as_const(*this).get_single_value<T>());
}
template<typename T> inline T Result::get_single_value_default(const T &default_value) const
{
if (this->is_single_value()) {
@@ -608,30 +615,7 @@ template<typename T> inline void Result::set_single_value(const T &value)
BLI_assert(this->is_single_value());
static_assert(Result::is_supported_type<T>());
if constexpr (std::is_same_v<T, float>) {
BLI_assert(type_ == ResultType::Float);
float_value_ = value;
}
else if constexpr (std::is_same_v<T, int>) {
BLI_assert(type_ == ResultType::Int);
int_value_ = value;
}
else if constexpr (std::is_same_v<T, float2>) {
BLI_assert(type_ == ResultType::Float2);
float2_value_ = value;
}
else if constexpr (std::is_same_v<T, float3>) {
BLI_assert(type_ == ResultType::Float3);
float3_value_ = value;
}
else if constexpr (std::is_same_v<T, float4>) {
BLI_assert(ELEM(type_, ResultType::Color, ResultType::Vector));
color_value_ = value;
}
else if constexpr (std::is_same_v<T, int2>) {
BLI_assert(type_ == ResultType::Int2);
int2_value_ = value;
}
this->get_single_value<T>() = value;
switch (storage_type_) {
case ResultStorageType::GPU: