Files
test2/source/blender/blenkernel/BKE_outliner_treehash.hh
Campbell Barton e955c94ed3 License Headers: Set copyright to "Blender Authors", add AUTHORS
Listing the "Blender Foundation" as copyright holder implied the Blender
Foundation holds copyright to files which may include work from many
developers.

While keeping copyright on headers makes sense for isolated libraries,
Blender's own code may be refactored or moved between files in a way
that makes the per file copyright holders less meaningful.

Copyright references to the "Blender Foundation" have been replaced with
"Blender Authors", with the exception of `./extern/` since these this
contains libraries which are more isolated, any changed to license
headers there can be handled on a case-by-case basis.

Some directories in `./intern/` have also been excluded:

- `./intern/cycles/` it's own `AUTHORS` file is planned.
- `./intern/opensubdiv/`.

An "AUTHORS" file has been added, using the chromium projects authors
file as a template.

Design task: #110784

Ref !110783.
2023-08-16 00:20:26 +10:00

79 lines
2.1 KiB
C++

/* SPDX-FileCopyrightText: 2023 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
#pragma once
/** \file
* \ingroup bke
*
* Hash table of tree-store elements (#TreeStoreElem) for fast lookups via a (id, type, index)
* tuple as key.
*
* The Outliner may have to perform many lookups for rebuilding complex trees, so this should be
* treated as performance sensitive.
*/
#include <memory>
#include "BLI_map.hh"
struct BLI_mempool;
struct ID;
struct TreeStoreElem;
namespace blender::bke::outliner::treehash {
/* -------------------------------------------------------------------- */
class TreeStoreElemKey {
public:
ID *id = nullptr;
short type = 0;
short nr = 0;
explicit TreeStoreElemKey(const TreeStoreElem &elem);
TreeStoreElemKey(ID *id, short type, short nr);
uint64_t hash() const;
friend bool operator==(const TreeStoreElemKey &a, const TreeStoreElemKey &b);
};
/* -------------------------------------------------------------------- */
class TreeHash {
Map<TreeStoreElemKey, std::unique_ptr<class TseGroup>> elem_groups_;
public:
~TreeHash();
/** Create and fill hash-table with treestore elements */
static std::unique_ptr<TreeHash> create_from_treestore(BLI_mempool &treestore);
/** Full rebuild for already allocated hash-table. */
void rebuild_from_treestore(BLI_mempool &treestore);
/** Clear element usage flags. */
void clear_used();
/** Add hash-table element. */
void add_element(TreeStoreElem &elem);
/** Remove hash-table element. */
void remove_element(TreeStoreElem &elem);
/** Find first unused element with specific type, nr and id. */
TreeStoreElem *lookup_unused(short type, short nr, ID *id) const;
/** Find user or unused element with specific type, nr and id. */
TreeStoreElem *lookup_any(short type, short nr, ID *id) const;
private:
TreeHash() = default;
TseGroup *lookup_group(const TreeStoreElemKey &key) const;
TseGroup *lookup_group(const TreeStoreElem &elem) const;
TseGroup *lookup_group(short type, short nr, ID *id) const;
void fill_treehash(BLI_mempool &treestore);
};
} // namespace blender::bke::outliner::treehash