Skip to content

Commit 5473b7c

Browse files
committed
Add Node::getHashOfName().
This should help name comparisons from outside Axmol.
1 parent dfd5645 commit 5473b7c

File tree

2 files changed

+17
-8
lines changed

2 files changed

+17
-8
lines changed

core/2d/Node.cpp

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,13 @@ THE SOFTWARE.
5454
# define RENDER_IN_SUBPIXEL(__ARGS__) (ceil(__ARGS__))
5555
#endif
5656

57-
/*
58-
* 4.5x faster than std::hash in release mode
59-
*/
60-
#define AX_HASH_NODE_NAME(name) (!name.empty() ? XXH3_64bits(name.data(), name.length()) : 0)
61-
6257
namespace ax
6358
{
59+
AX_DLL uint64_t hashNodeName(std::string_view name)
60+
{
61+
// 4.5x faster than std::hash in release mode.
62+
return !name.empty() ? XXH3_64bits(name.data(), name.length()) : 0;
63+
}
6464

6565
// FIXME:: Yes, nodes might have a sort problem once every 30 days if the game runs at 60 FPS and each frame sprites are
6666
// reordered.
@@ -717,6 +717,11 @@ void Node::setName(std::string_view name)
717717
_name = name;
718718
}
719719

720+
uint64_t Node::getHashOfName() const
721+
{
722+
return _hashOfName;
723+
}
724+
720725
void Node::updateParentChildrenIndexer(int tag)
721726
{
722727
auto parentChildrenIndexer = getParentChildrenIndexer();
@@ -730,11 +735,11 @@ void Node::updateParentChildrenIndexer(int tag)
730735

731736
void Node::updateParentChildrenIndexer(std::string_view name)
732737
{
733-
uint64_t newHash = AX_HASH_NODE_NAME(name);
738+
uint64_t newHash = hashNodeName(name);
734739
auto parentChildrenIndexer = getParentChildrenIndexer();
735740
if (parentChildrenIndexer)
736741
{
737-
auto oldHash = AX_HASH_NODE_NAME(_name);
742+
auto oldHash = hashNodeName(_name);
738743
if (oldHash != newHash)
739744
parentChildrenIndexer->erase(oldHash);
740745
(*parentChildrenIndexer)[newHash] = this;
@@ -831,7 +836,7 @@ Node* Node::getChildByTag(int tag) const
831836
Node* Node::getChildByName(std::string_view name) const
832837
{
833838
// AXASSERT(!name.empty(), "Invalid name");
834-
auto hash = AX_HASH_NODE_NAME(name);
839+
auto hash = hashNodeName(name);
835840
if (_childrenIndexer)
836841
{
837842
auto it = _childrenIndexer->find(hash);

core/2d/Node.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ class EventListener;
8686

8787
typedef std::map<uint64_t, Node*> NodeIndexerMap_t;
8888

89+
AX_DLL uint64_t hashNodeName(std::string_view);
90+
8991
/** @class Node
9092
* @brief Node is the base element of the Scene Graph. Elements of the Scene Graph must be Node objects or subclasses of
9193
it. The most common Node objects are: Scene, Layer, Sprite, Menu, Label.
@@ -981,6 +983,8 @@ class AX_DLL Node : public Object
981983
*/
982984
virtual void setName(std::string_view name);
983985

986+
uint64_t getHashOfName() const;
987+
984988
/**
985989
* Returns a custom user data pointer.
986990
*

0 commit comments

Comments
 (0)