Fixed watchers that could be added twice to the same definition node
This commit is contained in:
parent
c51d6d2d35
commit
63eb7b53eb
5 changed files with 51 additions and 1 deletions
|
@ -181,6 +181,18 @@ void DefinitionNode::addWatcher(DefinitionWatcher *watcher, bool init_diff)
|
|||
}
|
||||
}
|
||||
|
||||
int DefinitionNode::getWatcherCount() const
|
||||
{
|
||||
if (root && root->diffs)
|
||||
{
|
||||
return root->diffs->getWatcherCount(this);
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
void DefinitionNode::save(PackStream* stream) const
|
||||
{
|
||||
int children_count = (int)children.size();
|
||||
|
|
|
@ -77,6 +77,11 @@ public:
|
|||
*/
|
||||
void addWatcher(DefinitionWatcher *watcher, bool init_diff=false);
|
||||
|
||||
/**
|
||||
* Get the current number of watchers.
|
||||
*/
|
||||
int getWatcherCount() const;
|
||||
|
||||
protected:
|
||||
void addChild(DefinitionNode* child);
|
||||
void removeChild(DefinitionNode* child);
|
||||
|
|
|
@ -20,9 +20,17 @@ DiffManager::~DiffManager()
|
|||
}
|
||||
|
||||
void DiffManager::addWatcher(const DefinitionNode *node, DefinitionWatcher *watcher)
|
||||
{
|
||||
if (std::find(watchers[node].begin(), watchers[node].end(), watcher) == watchers[node].end())
|
||||
{
|
||||
watchers[node].push_back(watcher);
|
||||
}
|
||||
}
|
||||
|
||||
int DiffManager::getWatcherCount(const DefinitionNode *node)
|
||||
{
|
||||
return watchers[node].size();
|
||||
}
|
||||
|
||||
void DiffManager::addDiff(DefinitionNode *node, const DefinitionDiff *diff)
|
||||
{
|
||||
|
|
|
@ -27,6 +27,11 @@ public:
|
|||
*/
|
||||
void addWatcher(const DefinitionNode *node, DefinitionWatcher *watcher);
|
||||
|
||||
/**
|
||||
* Get the number of watchers registered for a given node.
|
||||
*/
|
||||
int getWatcherCount(const DefinitionNode *node);
|
||||
|
||||
/**
|
||||
* Add a new diff of a node to the change flow.
|
||||
*/
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
#include "DefinitionNode.h"
|
||||
#include "FloatNode.h"
|
||||
#include "PackStream.h"
|
||||
#include "DefinitionWatcher.h"
|
||||
|
||||
TEST(DefinitionNode, toString)
|
||||
{
|
||||
|
@ -26,6 +27,25 @@ TEST(DefinitionNode, getPath)
|
|||
EXPECT_EQ("/branch/leaf", leaf.getPath());
|
||||
}
|
||||
|
||||
class FakeWatcher: public DefinitionWatcher
|
||||
{
|
||||
virtual void nodeChanged(const DefinitionNode *, const DefinitionDiff *) override
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
TEST(DefinitionNode, addWatcher)
|
||||
{
|
||||
DefinitionNode root(NULL, "root");
|
||||
FakeWatcher watcher;
|
||||
|
||||
EXPECT_EQ(0, root.getWatcherCount());
|
||||
root.addWatcher(&watcher);
|
||||
EXPECT_EQ(1, root.getWatcherCount());
|
||||
root.addWatcher(&watcher);
|
||||
EXPECT_EQ(1, root.getWatcherCount());
|
||||
}
|
||||
|
||||
TEST(DefinitionNode, findByPath)
|
||||
{
|
||||
DefinitionNode root(NULL, "root");
|
||||
|
|
Loading…
Reference in a new issue