From 8cbbdedaf4dfec9e320e7e2be58b75d256950df1 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Mon, 20 Jul 2020 12:16:20 +0200 Subject: Refactor: Update integer type usage This updates the usage of integer types in code I wrote according to our new style guides. Major changes: * Use signed instead of unsigned integers in many places. * C++ containers in blenlib use `int64_t` for size and indices now (instead of `uint`). * Hash values for C++ containers are 64 bit wide now (instead of 32 bit). I do hope that I broke no builds, but it is quite likely that some compiler reports slightly different errors. Please let me know when there are any errors. If the fix is small, feel free to commit it yourself. I compiled successfully on linux with gcc and on windows. --- source/blender/functions/intern/attributes_ref.cc | 6 +-- .../functions/intern/multi_function_builder.cc | 10 ++--- .../functions/intern/multi_function_network.cc | 20 +++++----- .../intern/multi_function_network_evaluation.cc | 20 +++++----- .../intern/multi_function_network_optimization.cc | 46 +++++++++++----------- 5 files changed, 51 insertions(+), 51 deletions(-) (limited to 'source/blender/functions/intern') diff --git a/source/blender/functions/intern/attributes_ref.cc b/source/blender/functions/intern/attributes_ref.cc index f61a9165c47..7bfcc69671a 100644 --- a/source/blender/functions/intern/attributes_ref.cc +++ b/source/blender/functions/intern/attributes_ref.cc @@ -20,7 +20,7 @@ namespace blender::fn { AttributesInfoBuilder::~AttributesInfoBuilder() { - for (uint i : defaults_.index_range()) { + for (int i : defaults_.index_range()) { types_[i]->destruct(defaults_[i]); } } @@ -45,7 +45,7 @@ void AttributesInfoBuilder::add(StringRef name, const CPPType &type, const void AttributesInfo::AttributesInfo(const AttributesInfoBuilder &builder) { - for (uint i : builder.types_.index_range()) { + for (int i : builder.types_.index_range()) { StringRefNull name = allocator_.copy_string(builder.names_[i]); const CPPType &type = *builder.types_[i]; const void *default_value = builder.defaults_[i]; @@ -62,7 +62,7 @@ AttributesInfo::AttributesInfo(const AttributesInfoBuilder &builder) AttributesInfo::~AttributesInfo() { - for (uint i : defaults_.index_range()) { + for (int i : defaults_.index_range()) { type_by_index_[i]->destruct(defaults_[i]); } } diff --git a/source/blender/functions/intern/multi_function_builder.cc b/source/blender/functions/intern/multi_function_builder.cc index 7797c19d563..06084247e66 100644 --- a/source/blender/functions/intern/multi_function_builder.cc +++ b/source/blender/functions/intern/multi_function_builder.cc @@ -37,7 +37,7 @@ void CustomMF_GenericConstant::call(IndexMask mask, type_.fill_uninitialized_indices(value_, output.buffer(), mask); } -uint CustomMF_GenericConstant::hash() const +uint64_t CustomMF_GenericConstant::hash() const { return type_.hash(value_); } @@ -58,8 +58,8 @@ static std::string gspan_to_string(GSpan array) { std::stringstream ss; ss << "["; - uint max_amount = 5; - for (uint i : IndexRange(std::min(max_amount, array.size()))) { + const int64_t max_amount = 5; + for (int64_t i : IndexRange(std::min(max_amount, array.size()))) { array.type().debug_print(array[i], ss); ss << ", "; } @@ -82,7 +82,7 @@ void CustomMF_GenericConstantArray::call(IndexMask mask, MFContext UNUSED(context)) const { GVectorArray &vectors = params.vector_output(0); - for (uint i : mask) { + for (int64_t i : mask) { vectors.extend(i, array_); } } @@ -102,7 +102,7 @@ CustomMF_DefaultOutput::CustomMF_DefaultOutput(StringRef name, } void CustomMF_DefaultOutput::call(IndexMask mask, MFParams params, MFContext UNUSED(context)) const { - for (uint param_index : this->param_indices()) { + for (int param_index : this->param_indices()) { MFParamType param_type = this->param_type(param_index); if (!param_type.is_output()) { continue; diff --git a/source/blender/functions/intern/multi_function_network.cc b/source/blender/functions/intern/multi_function_network.cc index 1d3d3a8b5f2..cd3c38dd09f 100644 --- a/source/blender/functions/intern/multi_function_network.cc +++ b/source/blender/functions/intern/multi_function_network.cc @@ -50,9 +50,9 @@ void MFNode::destruct_sockets() */ MFFunctionNode &MFNetwork::add_function(const MultiFunction &function) { - Vector input_param_indices, output_param_indices; + Vector input_param_indices, output_param_indices; - for (uint param_index : function.param_indices()) { + for (int param_index : function.param_indices()) { switch (function.param_type(param_index).interface_type()) { case MFParamType::Input: { input_param_indices.append(param_index); @@ -77,16 +77,16 @@ MFFunctionNode &MFNetwork::add_function(const MultiFunction &function) node.is_dummy_ = false; node.id_ = node_or_null_by_id_.append_and_get_index(&node); node.function_ = &function; - node.input_param_indices_ = allocator_.construct_array_copy(input_param_indices); - node.output_param_indices_ = allocator_.construct_array_copy(output_param_indices); + node.input_param_indices_ = allocator_.construct_array_copy(input_param_indices); + node.output_param_indices_ = allocator_.construct_array_copy(output_param_indices); node.inputs_ = allocator_.construct_elements_and_pointer_array( input_param_indices.size()); node.outputs_ = allocator_.construct_elements_and_pointer_array( output_param_indices.size()); - for (uint i : input_param_indices.index_range()) { - uint param_index = input_param_indices[i]; + for (int i : input_param_indices.index_range()) { + int param_index = input_param_indices[i]; MFParamType param = function.param_type(param_index); BLI_assert(param.is_input_or_mutable()); @@ -100,8 +100,8 @@ MFFunctionNode &MFNetwork::add_function(const MultiFunction &function) socket.id_ = socket_or_null_by_id_.append_and_get_index(&socket); } - for (uint i : output_param_indices.index_range()) { - uint param_index = output_param_indices[i]; + for (int i : output_param_indices.index_range()) { + int param_index = output_param_indices[i]; MFParamType param = function.param_type(param_index); BLI_assert(param.is_output_or_mutable()); @@ -145,7 +145,7 @@ MFDummyNode &MFNetwork::add_dummy(StringRef name, node.input_names_ = allocator_.allocate_array(input_types.size()); node.output_names_ = allocator_.allocate_array(output_types.size()); - for (uint i : input_types.index_range()) { + for (int i : input_types.index_range()) { MFInputSocket &socket = *node.inputs_[i]; socket.data_type_ = input_types[i]; socket.node_ = &node; @@ -156,7 +156,7 @@ MFDummyNode &MFNetwork::add_dummy(StringRef name, node.input_names_[i] = socket.name_; } - for (uint i : output_types.index_range()) { + for (int i : output_types.index_range()) { MFOutputSocket &socket = *node.outputs_[i]; socket.data_type_ = output_types[i]; socket.node_ = &node; diff --git a/source/blender/functions/intern/multi_function_network_evaluation.cc b/source/blender/functions/intern/multi_function_network_evaluation.cc index b59cbc6a1a2..a7e1a2f42af 100644 --- a/source/blender/functions/intern/multi_function_network_evaluation.cc +++ b/source/blender/functions/intern/multi_function_network_evaluation.cc @@ -55,10 +55,10 @@ class MFNetworkEvaluationStorage { LinearAllocator<> allocator_; IndexMask mask_; Array value_per_output_id_; - uint min_array_size_; + int64_t min_array_size_; public: - MFNetworkEvaluationStorage(IndexMask mask, uint socket_id_amount); + MFNetworkEvaluationStorage(IndexMask mask, int socket_id_amount); ~MFNetworkEvaluationStorage(); /* Add the values that have been provided by the caller of the multi-function network. */ @@ -155,8 +155,8 @@ void MFNetworkEvaluator::call(IndexMask mask, MFParams params, MFContext context BLI_NOINLINE void MFNetworkEvaluator::copy_inputs_to_storage(MFParams params, Storage &storage) const { - for (uint input_index : inputs_.index_range()) { - uint param_index = input_index + 0; + for (int input_index : inputs_.index_range()) { + int param_index = input_index + 0; const MFOutputSocket &socket = *inputs_[input_index]; switch (socket.data_type().category()) { case MFDataType::Single: { @@ -178,8 +178,8 @@ BLI_NOINLINE void MFNetworkEvaluator::copy_outputs_to_storage( Storage &storage, Vector &outputs_to_initialize_in_the_end) const { - for (uint output_index : outputs_.index_range()) { - uint param_index = output_index + inputs_.size(); + for (int output_index : outputs_.index_range()) { + int param_index = output_index + inputs_.size(); const MFInputSocket &socket = *outputs_[output_index]; const MFOutputSocket &origin = *socket.origin(); @@ -263,7 +263,7 @@ BLI_NOINLINE void MFNetworkEvaluator::evaluate_function(MFContext &global_contex * function only on a single element. This can avoid many duplicate computations. */ MFParamsBuilder params{function, 1}; - for (uint param_index : function.param_indices()) { + for (int param_index : function.param_indices()) { MFParamType param_type = function.param_type(param_index); switch (param_type.category()) { case MFParamType::SingleInput: { @@ -312,7 +312,7 @@ BLI_NOINLINE void MFNetworkEvaluator::evaluate_function(MFContext &global_contex else { MFParamsBuilder params{function, storage.mask().min_array_size()}; - for (uint param_index : function.param_indices()) { + for (int param_index : function.param_indices()) { MFParamType param_type = function.param_type(param_index); switch (param_type.category()) { case MFParamType::SingleInput: { @@ -384,7 +384,7 @@ BLI_NOINLINE void MFNetworkEvaluator::initialize_remaining_outputs( MFParams params, Storage &storage, Span remaining_outputs) const { for (const MFInputSocket *socket : remaining_outputs) { - uint param_index = inputs_.size() + outputs_.first_index_of(socket); + int param_index = inputs_.size() + outputs_.first_index_of(socket); switch (socket->data_type().category()) { case MFDataType::Single: { @@ -506,7 +506,7 @@ struct OwnVectorValue : public Value { /** \name Storage methods * \{ */ -MFNetworkEvaluationStorage::MFNetworkEvaluationStorage(IndexMask mask, uint socket_id_amount) +MFNetworkEvaluationStorage::MFNetworkEvaluationStorage(IndexMask mask, int socket_id_amount) : mask_(mask), value_per_output_id_(socket_id_amount, nullptr), min_array_size_(mask.min_array_size()) diff --git a/source/blender/functions/intern/multi_function_network_optimization.cc b/source/blender/functions/intern/multi_function_network_optimization.cc index 849b24a318f..e76b2f51a15 100644 --- a/source/blender/functions/intern/multi_function_network_optimization.cc +++ b/source/blender/functions/intern/multi_function_network_optimization.cc @@ -107,7 +107,7 @@ static Vector find_nodes_based_on_mask(MFNetwork &network, bool mask_value) { Vector nodes; - for (uint id : id_mask.index_range()) { + for (int id : id_mask.index_range()) { if (id_mask[id] == mask_value) { MFNode *node = network.node_or_null_by_id(id); if (node != nullptr) { @@ -212,7 +212,7 @@ static void prepare_params_for_constant_folding(const MultiFunction &network_fn, MFParamsBuilder ¶ms, ResourceCollector &resources) { - for (uint param_index : network_fn.param_indices()) { + for (int param_index : network_fn.param_indices()) { MFParamType param_type = network_fn.param_type(param_index); MFDataType data_type = param_type.data_type(); @@ -244,7 +244,7 @@ static Array add_constant_folded_sockets(const MultiFunction & { Array folded_sockets{network_fn.param_indices().size(), nullptr}; - for (uint param_index : network_fn.param_indices()) { + for (int param_index : network_fn.param_indices()) { MFParamType param_type = network_fn.param_type(param_index); MFDataType data_type = param_type.data_type(); @@ -302,7 +302,7 @@ void constant_folding(MFNetwork &network, ResourceCollector &resources) Array folded_sockets = compute_constant_sockets_and_add_folded_nodes( network, inputs_to_fold, resources); - for (uint i : inputs_to_fold.index_range()) { + for (int i : inputs_to_fold.index_range()) { MFOutputSocket &original_socket = *inputs_to_fold[i]->origin(); network.relink(original_socket, *folded_sockets[i]); } @@ -317,12 +317,12 @@ void constant_folding(MFNetwork &network, ResourceCollector &resources) * * \{ */ -static uint32_t compute_node_hash(MFFunctionNode &node, RNG *rng, Span node_hashes) +static uint64_t compute_node_hash(MFFunctionNode &node, RNG *rng, Span node_hashes) { - uint32_t combined_inputs_hash = 394659347u; + uint64_t combined_inputs_hash = 394659347u; for (MFInputSocket *input_socket : node.inputs()) { MFOutputSocket *origin_socket = input_socket->origin(); - uint32_t input_hash; + uint64_t input_hash; if (origin_socket == nullptr) { input_hash = BLI_rng_get_uint(rng); } @@ -333,8 +333,8 @@ static uint32_t compute_node_hash(MFFunctionNode &node, RNG *rng, Span combined_inputs_hash = BLI_ghashutil_combine_hash(combined_inputs_hash, input_hash); } - uint32_t function_hash = node.function().hash(); - uint32_t node_hash = BLI_ghashutil_combine_hash(combined_inputs_hash, function_hash); + uint64_t function_hash = node.function().hash(); + uint64_t node_hash = BLI_ghashutil_combine_hash(combined_inputs_hash, function_hash); return node_hash; } @@ -342,15 +342,15 @@ static uint32_t compute_node_hash(MFFunctionNode &node, RNG *rng, Span * Produces a hash for every node. Two nodes with the same hash should have a high probability of * outputting the same values. */ -static Array compute_node_hashes(MFNetwork &network) +static Array compute_node_hashes(MFNetwork &network) { RNG *rng = BLI_rng_new(0); - Array node_hashes(network.node_id_amount()); + Array node_hashes(network.node_id_amount()); Array node_is_hashed(network.node_id_amount(), false); /* No dummy nodes are not assumed to output the same values. */ for (MFDummyNode *node : network.dummy_nodes()) { - uint32_t node_hash = BLI_rng_get_uint(rng); + uint64_t node_hash = BLI_rng_get_uint(rng); node_hashes[node->id()] = node_hash; node_is_hashed[node->id()] = true; } @@ -381,7 +381,7 @@ static Array compute_node_hashes(MFNetwork &network) continue; } - uint32_t node_hash = compute_node_hash(node, rng, node_hashes); + uint64_t node_hash = compute_node_hash(node, rng, node_hashes); node_hashes[node.id()] = node_hash; node_is_hashed[node.id()] = true; nodes_to_check.pop(); @@ -391,14 +391,14 @@ static Array compute_node_hashes(MFNetwork &network) return node_hashes; } -static Map> group_nodes_by_hash(MFNetwork &network, - Span node_hashes) +static Map> group_nodes_by_hash(MFNetwork &network, + Span node_hashes) { - Map> nodes_by_hash; - for (uint id : IndexRange(network.node_id_amount())) { + Map> nodes_by_hash; + for (int id : IndexRange(network.node_id_amount())) { MFNode *node = network.node_or_null_by_id(id); if (node != nullptr) { - uint32_t node_hash = node_hashes[id]; + uint64_t node_hash = node_hashes[id]; nodes_by_hash.lookup_or_add_default(node_hash).append(node); } } @@ -428,7 +428,7 @@ static bool nodes_output_same_values(DisjointSet &cache, const MFNode &a, const if (!functions_are_equal(a.as_function().function(), b.as_function().function())) { return false; } - for (uint i : a.inputs().index_range()) { + for (int i : a.inputs().index_range()) { const MFOutputSocket *origin_a = a.input(i).origin(); const MFOutputSocket *origin_b = b.input(i).origin(); if (origin_a == nullptr || origin_b == nullptr) { @@ -444,7 +444,7 @@ static bool nodes_output_same_values(DisjointSet &cache, const MFNode &a, const } static void relink_duplicate_nodes(MFNetwork &network, - Map> &nodes_by_hash) + Map> &nodes_by_hash) { DisjointSet same_node_cache{network.node_id_amount()}; @@ -462,7 +462,7 @@ static void relink_duplicate_nodes(MFNetwork &network, /* This is true with fairly high probability, but hash collisions can happen. So we have to * check if the node actually output the same values. */ if (nodes_output_same_values(same_node_cache, deduplicated_node, *node)) { - for (uint i : deduplicated_node.outputs().index_range()) { + for (int i : deduplicated_node.outputs().index_range()) { network.relink(node->output(i), deduplicated_node.output(i)); } } @@ -481,8 +481,8 @@ static void relink_duplicate_nodes(MFNetwork &network, */ void common_subnetwork_elimination(MFNetwork &network) { - Array node_hashes = compute_node_hashes(network); - Map> nodes_by_hash = group_nodes_by_hash(network, node_hashes); + Array node_hashes = compute_node_hashes(network); + Map> nodes_by_hash = group_nodes_by_hash(network, node_hashes); relink_duplicate_nodes(network, nodes_by_hash); } -- cgit v1.2.3