[Bf-blender-cvs] [b7a8ef4b9f9] functions: replace IdMultiMap with more generic IndexToRefMultiMap
Jacques Lucke
noreply at git.blender.org
Sat Jan 4 16:38:35 CET 2020
Commit: b7a8ef4b9f96bf97a9580111f13904060a62407e
Author: Jacques Lucke
Date: Fri Jan 3 14:16:58 2020 +0100
Branches: functions
https://developer.blender.org/rBb7a8ef4b9f96bf97a9580111f13904060a62407e
replace IdMultiMap with more generic IndexToRefMultiMap
===================================================================
M source/blender/blenlib/BLI_index_to_ref_map.h
M source/blender/functions/FN_node_tree_multi_function_network.h
M source/blender/functions/intern/node_tree_multi_function_network/builder.cc
M source/blender/functions/intern/node_tree_multi_function_network/builder.h
===================================================================
diff --git a/source/blender/blenlib/BLI_index_to_ref_map.h b/source/blender/blenlib/BLI_index_to_ref_map.h
index e8e2d697a09..a4a6e514b0b 100644
--- a/source/blender/blenlib/BLI_index_to_ref_map.h
+++ b/source/blender/blenlib/BLI_index_to_ref_map.h
@@ -2,6 +2,7 @@
#define __BLI_INDEX_TO_REF_MAP_H__
#include "BLI_array_cxx.h"
+#include "BLI_multi_map.h"
namespace BLI {
@@ -48,6 +49,68 @@ template<typename T, uint N = 4, typename Allocator = GuardedAllocator> class In
}
};
+#define IndexToRefMultiMap_UNMAPPED nullptr
+#define IndexToRefMultiMap_MULTIMAPPED ((T *)1)
+
+template<typename T, uint N = 4, typename Allocator = GuardedAllocator> class IndexToRefMultiMap {
+ private:
+ Array<T *> m_array;
+ MultiMap<uint, T *> m_fallback_multimap;
+
+ public:
+ IndexToRefMultiMap(uint size) : m_array(size, IndexToRefMultiMap_UNMAPPED)
+ {
+ }
+
+ bool contains(uint key) const
+ {
+ return m_array[key] != IndexToRefMultiMap_UNMAPPED;
+ }
+
+ ArrayRef<T *> lookup(uint key) const
+ {
+ T *const *stored_value_addr = &m_array[key];
+ const T *stored_value = *stored_value_addr;
+ if (stored_value == IndexToRefMultiMap_UNMAPPED) {
+ return {};
+ }
+ else if (stored_value == IndexToRefMultiMap_MULTIMAPPED) {
+ return m_fallback_multimap.lookup(key);
+ }
+ else {
+ return ArrayRef<T *>(stored_value_addr, 1);
+ }
+ }
+
+ T &lookup_single(uint key)
+ {
+ T *stored_value = m_array[key];
+ BLI_assert(stored_value != IndexToRefMultiMap_UNMAPPED &&
+ stored_value != IndexToRefMultiMap_MULTIMAPPED);
+ return *stored_value;
+ }
+
+ void add(uint key, T &value)
+ {
+ T **stored_value_addr = &m_array[key];
+ T *stored_value = *stored_value_addr;
+ if (stored_value == IndexToRefMultiMap_UNMAPPED) {
+ *stored_value_addr = &value;
+ }
+ else if (stored_value == IndexToRefMultiMap_MULTIMAPPED) {
+ m_fallback_multimap.add(key, &value);
+ }
+ else {
+ T *other_value = stored_value;
+ *stored_value_addr = IndexToRefMultiMap_MULTIMAPPED;
+ m_fallback_multimap.add_multiple_new(key, {other_value, &value});
+ }
+ }
+};
+
+#undef IndexToRefMultiMap_UNMAPPED
+#undef IndexToRefMultiMap_MULTIMAPPED
+
} // namespace BLI
#endif /* __BLI_INDEX_TO_REF_MAP_H__ */
diff --git a/source/blender/functions/FN_node_tree_multi_function_network.h b/source/blender/functions/FN_node_tree_multi_function_network.h
index fb2519ff866..1bd33acd70c 100644
--- a/source/blender/functions/FN_node_tree_multi_function_network.h
+++ b/source/blender/functions/FN_node_tree_multi_function_network.h
@@ -13,68 +13,6 @@ namespace FN {
using BLI::IndexToRefMap;
using BLI::MultiMap;
-#define IdMultiMap_UNMAPPED UINT_MAX
-#define IdMultiMap_MULTIMAPPED (UINT_MAX - 1)
-
-class IdMultiMap {
- private:
- Array<uint> m_single_mapping;
- MultiMap<uint, uint> m_fallback_multimap;
-
- public:
- IdMultiMap(uint max_key_id) : m_single_mapping(max_key_id, IdMultiMap_UNMAPPED)
- {
- }
-
- bool contains(uint key_id) const
- {
- return m_single_mapping[key_id] != IdMultiMap_UNMAPPED;
- }
-
- ArrayRef<uint> lookup(uint key_id) const
- {
- const uint &stored_value = m_single_mapping[key_id];
- switch (stored_value) {
- case IdMultiMap_UNMAPPED: {
- return {};
- }
- case IdMultiMap_MULTIMAPPED: {
- return m_fallback_multimap.lookup(key_id);
- }
- default:
- return ArrayRef<uint>(&stored_value, 1);
- }
- }
-
- uint lookup_single(uint key_id) const
- {
- uint stored_value = m_single_mapping[key_id];
- BLI_assert(stored_value != IdMultiMap_UNMAPPED && stored_value != IdMultiMap_MULTIMAPPED);
- return stored_value;
- }
-
- void add(uint key_id, uint value_id)
- {
- uint &stored_value = m_single_mapping[key_id];
- switch (stored_value) {
- case IdMultiMap_UNMAPPED: {
- stored_value = value_id;
- break;
- }
- case IdMultiMap_MULTIMAPPED: {
- m_fallback_multimap.add(key_id, value_id);
- break;
- }
- default: {
- uint other_value_id = stored_value;
- stored_value = IdMultiMap_MULTIMAPPED;
- m_fallback_multimap.add_multiple_new(key_id, {other_value_id, value_id});
- break;
- }
- }
- }
-};
-
class InlinedTreeMFSocketMap {
private:
const FunctionNodeTree *m_function_tree;
diff --git a/source/blender/functions/intern/node_tree_multi_function_network/builder.cc b/source/blender/functions/intern/node_tree_multi_function_network/builder.cc
index f77e3e860cb..8ce3a721704 100644
--- a/source/blender/functions/intern/node_tree_multi_function_network/builder.cc
+++ b/source/blender/functions/intern/node_tree_multi_function_network/builder.cc
@@ -13,8 +13,8 @@ FunctionTreeMFNetworkBuilder::FunctionTreeMFNetworkBuilder(
m_preprocessed_function_tree_data(preprocessed_function_tree_data),
m_function_tree_mappings(function_tree_mappings),
m_resources(resources),
- m_socket_by_fsocket(function_tree.socket_count()),
- m_socket_by_group_input(function_tree.all_group_inputs().size()),
+ m_sockets_by_fsocket_id(function_tree.socket_count()),
+ m_socket_by_group_input_id(function_tree.all_group_inputs().size()),
m_builder(BLI::make_unique<MFNetworkBuilder>())
{
}
@@ -79,7 +79,7 @@ void FunctionTreeMFNetworkBuilder::map_data_sockets(const FNode &fnode, MFBuilde
}
}
-void FunctionTreeMFNetworkBuilder::assert_fnode_is_mapped_correctly(const FNode &fnode) const
+void FunctionTreeMFNetworkBuilder::assert_fnode_is_mapped_correctly(const FNode &fnode)
{
UNUSED_VARS_NDEBUG(fnode);
#ifdef DEBUG
@@ -89,7 +89,7 @@ void FunctionTreeMFNetworkBuilder::assert_fnode_is_mapped_correctly(const FNode
}
void FunctionTreeMFNetworkBuilder::assert_data_sockets_are_mapped_correctly(
- ArrayRef<const FSocket *> fsockets) const
+ ArrayRef<const FSocket *> fsockets)
{
for (const FSocket *fsocket : fsockets) {
if (this->is_data_socket(*fsocket)) {
@@ -98,7 +98,7 @@ void FunctionTreeMFNetworkBuilder::assert_data_sockets_are_mapped_correctly(
}
}
-void FunctionTreeMFNetworkBuilder::assert_fsocket_is_mapped_correctly(const FSocket &fsocket) const
+void FunctionTreeMFNetworkBuilder::assert_fsocket_is_mapped_correctly(const FSocket &fsocket)
{
BLI_assert(this->fsocket_is_mapped(fsocket));
MFDataType fsocket_type = this->try_get_data_type(fsocket).value();
@@ -204,22 +204,30 @@ std::unique_ptr<FunctionTreeMFNetwork> FunctionTreeMFNetworkBuilder::build()
{
// m_builder->to_dot__clipboard();
- IndexToRefMap<const MFSocket> dummy_socket_by_fsocket_id(m_function_tree.socket_count());
- IndexToRefMap<const FSocket> fsocket_by_dummy_socket_id(m_builder->sockets_by_id().size());
-
- auto network = BLI::make_unique<MFNetwork>(std::move(m_builder));
-
- for (const FSocket *fsocket : m_function_tree.all_sockets()) {
- ArrayRef<uint> mapped_ids = m_socket_by_fsocket.lookup(fsocket->id());
- for (uint mapped_id : mapped_ids) {
- const MFSocket &socket = network->socket_by_id(mapped_id);
+ Vector<std::pair<uint, uint>> m_dummy_mappings;
+ for (uint fsocket_id : IndexRange(m_function_tree.socket_count())) {
+ ArrayRef<MFBuilderSocket *> mapped_sockets = m_sockets_by_fsocket_id.lookup(fsocket_id);
+ if (mapped_sockets.size() == 1) {
+ MFBuilderSocket &socket = *mapped_sockets[0];
if (socket.node().is_dummy()) {
- dummy_socket_by_fsocket_id.add_new(fsocket->id(), socket);
- fsocket_by_dummy_socket_id.add_new(socket.id(), *fsocket);
+ m_dummy_mappings.append({fsocket_id, socket.id()});
}
}
}
+ auto network = BLI::make_unique<MFNetwork>(std::move(m_builder));
+
+ IndexToRefMap<const MFSocket> dummy_socket_by_fsocket_id(m_function_tree.socket_count());
+ IndexToRefMap<const FSocket> fsocket_by_dummy_socket_id(network->socket_ids().size());
+
+ for (auto pair : m_dummy_mappings) {
+ const FSocket &fsocket = m_function_tree.socket_by_id(pair.first);
+ const MFSocket &socket = network->socket_by_id(pair.second);
+
+ dummy_socket_by_fsocket_id.add_new(pair.first, socket);
+ fsocket_by_dummy_socket_id.add_new(pair.second, fsocket);
+ }
+
InlinedTreeMFSocketMap socket_map(m_function_tree,
*network,
std::move(dummy_socket_by_fsocket_id),
diff --git a/source/blender/functions/intern/node_tree_multi_function_network/builder.h b/source/blender/functions/intern/node_tree_multi_function_network/builder.h
index ad8ba56dded..164f1cf5aa6 100644
--- a/source/blender/functions/intern/node_tree_multi_function_network/builder.h
+++ b/source/blender/functions/intern/node_tree_multi_function_network/builder.h
@@ -10,6 +10,7 @@
namespace FN {
using BKE::VSocket;
+using BLI::IndexToRefMultiMap;
using BLI::MultiMap;
class PreprocessedVTreeMFData {
@@ -64,8 +65,8 @@ class FunctionTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
const VTreeMultiFunctionMappings &m_function_tree_mappings;
ResourceCollector &m_resources;
- IdMultiMap m_socket_by_fsocket;
- IndexToRefMap<MFBuilderOutputSocket> m_socket_by_group_input;
+ IndexToRefMultiMap<MFBuilderSocket> m_sockets_by_fsocket_id;
+ IndexToRefMap<MFBuilderOutputSocket> m_socket_by_group_input_id;
std::unique_ptr<MFNetworkBuilder> m_builder;
@@ -146,12 +147,12 @@ class FunctionTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
void map_sockets(const FInputSocket &fsocket, MFBuilderInputSocket &socket)
{
- m_socket_by_fsocket.add(fsocket.id(), socket.id());
+ m_sockets_by_fsocket_id.add(fsocket.id(), socket);
}
void map_sockets(const FOutputSocket &fsocket, MFBuilderOutputSocket &socket)
{
- m_socket_by_fsocket.add(fsocket.id(), socket.id());
+ m_sockets_by_fsocket_id.add(fsocket.id(), socket);
}
void map_sockets(ArrayRef<const FInputSocket *> fsockets,
@@ -174,48 +175,38 @@ class FunctionTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
void map_group_input(const FGroupInput &group_input, MFBuilderOutputSocket &socket)
{
- m_socket_by_group_input.add_new(group_input.id(), socket);
+ m_socket_by_group_
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list