Blender V4.3
BKE_lib_remap.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4#pragma once
5
23#include "BLI_compiler_attrs.h"
24#include "BLI_function_ref.hh"
25#include "BLI_map.hh"
26#include "BLI_set.hh"
27#include "BLI_span.hh"
28#include "BLI_utildefines.h"
29
30struct ID;
31struct Main;
32
33namespace blender::bke::id {
34class IDRemapper;
35}
36
37/* BKE_libblock_free, delete are declared in BKE_lib_id.hh for convenience. */
38
39/* Also IDRemap->flag. */
40enum {
89
96
126};
127
135
143 const int remap_flags);
144
147 const int remap_flags);
148
160 const int remap_flags);
168void BKE_libblock_remap_locked(Main *bmain, void *old_idv, void *new_idv, int remap_flags)
169 ATTR_NONNULL(1, 2);
170void BKE_libblock_remap(Main *bmain, void *old_idv, void *new_idv, int remap_flags)
171 ATTR_NONNULL(1, 2);
172
177void BKE_libblock_unlink(Main *bmain, void *idv, bool do_skip_indirect) ATTR_NONNULL();
178
188void BKE_libblock_relink_ex(Main *bmain, void *idv, void *old_idv, void *new_idv, int remap_flags)
189 ATTR_NONNULL(2);
195 const blender::Span<ID *> ids,
196 eIDRemapType remap_type,
197 blender::bke::id::IDRemapper &id_remapper,
198 int remap_flags);
199
209void BKE_libblock_relink_to_newid(Main *bmain, ID *id, int remap_flag) ATTR_NONNULL();
210
211using BKE_library_free_notifier_reference_cb = void (*)(const void *);
213 void (*)(const blender::bke::id::IDRemapper &mappings);
214
218
219/* IDRemapper */
230
262
263using IDRemapperIterFunction = void (*)(ID *old_id, ID *new_id, void *user_data);
265
266namespace blender::bke::id {
267
269 Map<ID *, ID *> mappings_;
270 IDTypeFilter source_types_ = 0;
271
276 Set<ID *> never_null_users_;
277
278 public:
283 bool allow_idtype_mismatch = false;
284
285 public:
286 void clear()
287 {
288 mappings_.clear();
289 never_null_users_.clear();
290 source_types_ = 0;
291 }
292
293 bool is_empty() const
294 {
295 return mappings_.is_empty();
296 }
297
299 {
300 return (source_types_ & filter) != 0;
301 }
302
304 void add(ID *old_id, ID *new_id);
306 void add_overwrite(ID *old_id, ID *new_id);
307
309 IDRemapperApplyResult get_mapping_result(ID *id,
311 const ID *id_self) const;
312
321 IDRemapperApplyResult apply(ID **r_id_ptr,
323 ID *id_self = nullptr) const;
324
326 {
327 never_null_users_.add(id);
328 }
329
331 {
332 return never_null_users_;
333 }
334
336 void iter(FunctionRef<void(ID *old_id, ID *new_id)> func) const
337 {
338 for (auto item : mappings_.items()) {
339 func(item.key, item.value);
340 }
341 }
342
344 static const StringRefNull result_to_string(const IDRemapperApplyResult result);
345
347 void print() const;
348};
349
350} // namespace blender::bke::id
void BKE_libblock_remap_multiple_raw(Main *bmain, blender::bke::id::IDRemapper &mappings, const int remap_flags)
Definition lib_remap.cc:669
void BKE_libblock_remap_multiple_locked(Main *bmain, blender::bke::id::IDRemapper &mappings, const int remap_flags)
Definition lib_remap.cc:645
void BKE_library_callback_remap_editor_id_reference_set(BKE_library_remap_editor_id_reference_cb func)
Definition lib_remap.cc:54
void(*)(const blender::bke::id::IDRemapper &mappings) BKE_library_remap_editor_id_reference_cb
@ ID_REMAP_SKIP_USER_CLEAR
@ ID_REMAP_SKIP_USER_REFCOUNT
@ ID_REMAP_FORCE_INTERNAL_RUNTIME_POINTERS
@ ID_REMAP_SKIP_OVERRIDE_LIBRARY
@ ID_REMAP_FORCE_USER_REFCOUNT
@ ID_REMAP_SKIP_NEVER_NULL_USAGE
@ ID_REMAP_DO_LIBRARY_POINTERS
@ ID_REMAP_FORCE_OBDATA_IN_EDITMODE
@ ID_REMAP_FORCE_UI_POINTERS
@ ID_REMAP_SKIP_INDIRECT_USAGE
@ ID_REMAP_FORCE_NEVER_NULL_USAGE
@ ID_REMAP_STORE_NEVER_NULL_USAGE
@ ID_REMAP_ALLOW_IDTYPE_MISMATCH
@ ID_REMAP_SKIP_UPDATE_TAGGING
@ ID_REMAP_NO_ORIG_POINTERS_ACCESS
void BKE_libblock_relink_to_newid(Main *bmain, ID *id, int remap_flag) ATTR_NONNULL()
Definition lib_remap.cc:921
IDRemapperApplyResult
@ ID_REMAP_RESULT_SOURCE_REMAPPED
@ ID_REMAP_RESULT_SOURCE_UNASSIGNED
@ ID_REMAP_RESULT_SOURCE_NOT_MAPPABLE
@ ID_REMAP_RESULT_SOURCE_UNAVAILABLE
void BKE_libblock_relink_multiple(Main *bmain, const blender::Span< ID * > ids, eIDRemapType remap_type, blender::bke::id::IDRemapper &id_remapper, int remap_flags)
Definition lib_remap.cc:782
uint64_t IDTypeFilter
IDRemapperApplyOptions
@ ID_REMAP_APPLY_UPDATE_REFCOUNT
@ ID_REMAP_APPLY_UNMAP_WHEN_REMAPPING_TO_SELF
@ ID_REMAP_APPLY_ENSURE_REAL
@ ID_REMAP_APPLY_DEFAULT
void BKE_library_callback_free_notifier_reference_set(BKE_library_free_notifier_reference_cb func)
Definition lib_remap.cc:47
eIDRemapType
@ ID_REMAP_TYPE_REMAP
@ ID_REMAP_TYPE_CLEANUP
void BKE_libblock_remap_multiple(Main *bmain, blender::bke::id::IDRemapper &mappings, const int remap_flags)
Definition lib_remap.cc:701
void void void BKE_libblock_unlink(Main *bmain, void *idv, bool do_skip_indirect) ATTR_NONNULL()
Definition lib_remap.cc:710
void(*)(const void *) BKE_library_free_notifier_reference_cb
void BKE_libblock_remap_locked(Main *bmain, void *old_idv, void *new_idv, int remap_flags) ATTR_NONNULL(1
void BKE_libblock_relink_ex(Main *bmain, void *idv, void *old_idv, void *new_idv, int remap_flags) ATTR_NONNULL(2)
Definition lib_remap.cc:844
void void BKE_libblock_remap(Main *bmain, void *old_idv, void *new_idv, int remap_flags) ATTR_NONNULL(1
void(*)(ID *old_id, ID *new_id, void *user_data) IDRemapperIterFunction
#define ATTR_NONNULL(...)
#define ENUM_OPERATORS(_type, _max)
void clear()
Definition BLI_map.hh:989
ItemIterator items() const
Definition BLI_map.hh:864
bool is_empty() const
Definition BLI_map.hh:937
bool add(const Key &key)
Definition BLI_set.hh:248
void clear()
Definition BLI_set.hh:532
void iter(FunctionRef< void(ID *old_id, ID *new_id)> func) const
bool contains_mappings_for_any(IDTypeFilter filter) const
const Set< ID * > & never_null_users() const
CCL_NAMESPACE_BEGIN struct Options options
static void add(blender::Map< std::string, std::string > &messages, Message &msg)
Definition msgfmt.cc:227
unsigned __int64 uint64_t
Definition stdint.h:90
Definition DNA_ID.h:413