Commit: bf1791ba92d280392cc3f00709d7da395b2a58f4 Author: Jacques Lucke Date: Fri Dec 9 12:00:37 2022 +0100 Branches: master https://developer.blender.org/rBbf1791ba92d280392cc3f00709d7da395b2a58f4
BLI: add clear-and-shrink method to more data structures Also renames the existing `clear_and_make_inline` to `clear_and_shrink` which is more concise. =================================================================== M source/blender/blenkernel/intern/curves_geometry.cc M source/blender/blenlib/BLI_map.hh M source/blender/blenlib/BLI_multi_value_map.hh M source/blender/blenlib/BLI_set.hh M source/blender/blenlib/BLI_stack.hh M source/blender/blenlib/BLI_vector.hh M source/blender/blenlib/BLI_vector_set.hh M source/blender/compositor/intern/COM_WorkScheduler.cc M source/blender/io/wavefront_obj/exporter/obj_export_mesh.cc =================================================================== diff --git a/source/blender/blenkernel/intern/curves_geometry.cc b/source/blender/blenkernel/intern/curves_geometry.cc index 94ab5ceeace..5cbb0709c91 100644 --- a/source/blender/blenkernel/intern/curves_geometry.cc +++ b/source/blender/blenkernel/intern/curves_geometry.cc @@ -519,7 +519,7 @@ void CurvesGeometry::ensure_evaluated_offsets() const this->runtime->bezier_evaluated_offsets.resize(this->points_num()); } else { - this->runtime->bezier_evaluated_offsets.clear_and_make_inline(); + this->runtime->bezier_evaluated_offsets.clear_and_shrink(); } calculate_evaluated_offsets( @@ -605,7 +605,7 @@ Span<float3> CurvesGeometry::evaluated_positions() const this->runtime->position_cache_mutex.ensure([&]() { if (this->is_single_type(CURVE_TYPE_POLY)) { this->runtime->evaluated_positions_span = this->positions(); - this->runtime->evaluated_position_cache.clear_and_make_inline(); + this->runtime->evaluated_position_cache.clear_and_shrink(); return; } diff --git a/source/blender/blenlib/BLI_map.hh b/source/blender/blenlib/BLI_map.hh index fb048102153..e7958ee49ac 100644 --- a/source/blender/blenlib/BLI_map.hh +++ b/source/blender/blenlib/BLI_map.hh @@ -990,6 +990,15 @@ class Map { occupied_and_removed_slots_ = 0; } + /** + * Removes all key-value-pairs from the map and frees any allocated memory. + */ + void clear_and_shrink() + { + std::destroy_at(this); + new (this) Map(NoExceptConstructor{}); + } + /** * Get the number of collisions that the probing strategy has to go through to find the key or * determine that it is not in the map. diff --git a/source/blender/blenlib/BLI_multi_value_map.hh b/source/blender/blenlib/BLI_multi_value_map.hh index 81b536e7d3c..99fc7dffe3b 100644 --- a/source/blender/blenlib/BLI_multi_value_map.hh +++ b/source/blender/blenlib/BLI_multi_value_map.hh @@ -150,6 +150,11 @@ template<typename Key, typename Value> class MultiValueMap { { map_.clear(); } + + void clear_and_shrink() + { + map_.clear_and_shrink(); + } }; } // namespace blender diff --git a/source/blender/blenlib/BLI_set.hh b/source/blender/blenlib/BLI_set.hh index 548195e48f7..3e5e6fabb42 100644 --- a/source/blender/blenlib/BLI_set.hh +++ b/source/blender/blenlib/BLI_set.hh @@ -542,6 +542,15 @@ class Set { occupied_and_removed_slots_ = 0; } + /** + * Removes all keys from the set and frees any allocated memory. + */ + void clear_and_shrink() + { + std::destroy_at(this); + new (this) Set(NoExceptConstructor{}); + } + /** * Creates a new slot array and reinserts all keys inside of that. This method can be used to get * rid of removed slots. Also this is useful for benchmarking the grow function. diff --git a/source/blender/blenlib/BLI_stack.hh b/source/blender/blenlib/BLI_stack.hh index ed123f43a6b..a9db671e7ac 100644 --- a/source/blender/blenlib/BLI_stack.hh +++ b/source/blender/blenlib/BLI_stack.hh @@ -329,6 +329,15 @@ class Stack { top_ = top_chunk_->begin; } + /** + * Removes all elements from the stack and frees any allocated memory. + */ + void clear_and_shrink() + { + std::destroy_at(this); + new (this) Stack(NoExceptConstructor{}); + } + /* This should only be called by unit tests. */ bool is_invariant_maintained() const { diff --git a/source/blender/blenlib/BLI_vector.hh b/source/blender/blenlib/BLI_vector.hh index 6bc785c322a..be594377eb3 100644 --- a/source/blender/blenlib/BLI_vector.hh +++ b/source/blender/blenlib/BLI_vector.hh @@ -410,7 +410,7 @@ class Vector { * Afterwards the vector has 0 elements and any allocated memory * will be freed. */ - void clear_and_make_inline() + void clear_and_shrink() { destruct_n(begin_, this->size()); if (!this->is_inline()) { diff --git a/source/blender/blenlib/BLI_vector_set.hh b/source/blender/blenlib/BLI_vector_set.hh index 9805e8a7d59..1be21ccb5d1 100644 --- a/source/blender/blenlib/BLI_vector_set.hh +++ b/source/blender/blenlib/BLI_vector_set.hh @@ -560,6 +560,15 @@ class VectorSet { occupied_and_removed_slots_ = 0; } + /** + * Removes all keys from the set and frees any allocated memory. + */ + void clear_and_shrink() + { + std::destroy_at(this); + new (this) VectorSet(NoExceptConstructor{}); + } + /** * Get the number of collisions that the probing strategy has to go through to find the key or * determine that it is not in the set. diff --git a/source/blender/compositor/intern/COM_WorkScheduler.cc b/source/blender/compositor/intern/COM_WorkScheduler.cc index 9067807d98c..539d23ff6b5 100644 --- a/source/blender/compositor/intern/COM_WorkScheduler.cc +++ b/source/blender/compositor/intern/COM_WorkScheduler.cc @@ -266,7 +266,7 @@ static void opencl_initialize(const bool use_opencl) static void opencl_deinitialize() { - g_work_scheduler.opencl.devices.clear_and_make_inline(); + g_work_scheduler.opencl.devices.clear_and_shrink(); if (g_work_scheduler.opencl.program) { clReleaseProgram(g_work_scheduler.opencl.program); @@ -364,7 +364,7 @@ static void threading_model_queue_deinitialize() { /* deinitialize CPU threads */ if (g_work_scheduler.queue.initialized) { - g_work_scheduler.queue.devices.clear_and_make_inline(); + g_work_scheduler.queue.devices.clear_and_shrink(); BLI_thread_local_delete(g_thread_device); g_work_scheduler.queue.initialized = false; diff --git a/source/blender/io/wavefront_obj/exporter/obj_export_mesh.cc b/source/blender/io/wavefront_obj/exporter/obj_export_mesh.cc index 86518bd09f2..181180267db 100644 --- a/source/blender/io/wavefront_obj/exporter/obj_export_mesh.cc +++ b/source/blender/io/wavefront_obj/exporter/obj_export_mesh.cc @@ -82,11 +82,11 @@ void OBJMesh::clear() owned_export_mesh_ = nullptr; } export_mesh_ = nullptr; - uv_indices_.clear_and_make_inline(); - uv_coords_.clear_and_make_inline(); - loop_to_normal_index_.clear_and_make_inline(); - normal_coords_.clear_and_make_inline(); - poly_order_.clear_and_make_inline(); + uv_indices_.clear_and_shrink(); + uv_coords_.clear_and_shrink(); + loop_to_normal_index_.clear_and_shrink(); + normal_coords_.clear_and_shrink(); + poly_order_.clear_and_shrink(); if (poly_smooth_groups_) { MEM_freeN(poly_smooth_groups_); poly_smooth_groups_ = nullptr; _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs