2 * Copyright (c) 2024 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <dali/internal/update/manager/scene-graph-traveler.h>
22 #include <dali/internal/update/manager/update-manager.h>
23 #include <dali/internal/update/nodes/node.h>
29 SceneGraphTraveler::SceneGraphTraveler(SceneGraph::UpdateManager& updateManager, SceneGraph::Node& rootNode)
30 : SceneGraphTravelerInterface(updateManager),
34 mRootNode.AddObserver(*this);
38 SceneGraphTraveler::~SceneGraphTraveler()
42 mRootNode.RemoveObserver(*this);
46 SceneGraph::Node* SceneGraphTraveler::FindNode(uint32_t id)
48 SceneGraph::Node* node = nullptr;
52 // Find node in cached map
53 auto iter = mTravledNodeMap.find(id);
54 if(iter != mTravledNodeMap.end())
60 SceneGraph::Node* currentNode = mUpdateManager.GetNodePointerById(id);
62 bool isNodeUnderRootNode = false;
64 std::vector<std::pair<uint32_t, SceneGraph::Node*>> nodeStack;
66 SceneGraph::Node* iterateNode = currentNode;
70 uint32_t iterateNodeId = iterateNode->GetId();
72 auto iter = mTravledNodeMap.find(iterateNodeId);
73 if(iter != mTravledNodeMap.end())
75 // iter->second could be nullptr if it was failed item before.
76 if(iter->second != nullptr)
78 isNodeUnderRootNode = true;
82 nodeStack.push_back({iterateNodeId, iterateNode});
85 iterateNode = iterateNode->GetParent();
88 // Store current found result.
89 for(auto&& idPair : nodeStack)
91 mTravledNodeMap.insert({idPair.first, isNodeUnderRootNode ? idPair.second : nullptr});
94 if(isNodeUnderRootNode)
104 void SceneGraphTraveler::Clear()
106 mTravledNodeMap.clear();
107 mTravledNodeMap.rehash(0u); ///< Note : We have to reduce capacity of hash map. Without this line, clear() API will be slow downed.
110 mTravledNodeMap.insert({mRootNode.GetId(), &mRootNode});
114 } // namespace Internal