summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdrian Boguszewski <adrbogus1@student.pg.gda.pl>2016-06-06 10:29:05 +0000
committerAdrian Boguszewski <adrbogus1@student.pg.gda.pl>2016-06-06 10:29:05 +0000
commitb98472931f26e998969d9ffa49dbe12c4fada097 (patch)
tree1858b70f0c09c71d3031893b459c5e70b712e418
parentAdded object set (diff)
parent[Bug #1588983] Finish up German tutorials for 0.92. (diff)
downloadinkscape-b98472931f26e998969d9ffa49dbe12c4fada097.tar.gz
inkscape-b98472931f26e998969d9ffa49dbe12c4fada097.zip
Replaced Object by SPObject
(bzr r14954.1.2)
-rw-r--r--src/object-set.cpp67
-rw-r--r--src/object-set.h26
-rw-r--r--test/src/object-set-test.cpp138
3 files changed, 128 insertions, 103 deletions
diff --git a/src/object-set.cpp b/src/object-set.cpp
index f071aa4d6..df4bc1435 100644
--- a/src/object-set.cpp
+++ b/src/object-set.cpp
@@ -11,14 +11,14 @@
#include "object-set.h"
-bool ObjectSet::add(Object* object) {
+bool ObjectSet::add(SPObject* object) {
// any ancestor is in the set - do nothing
if (_anyAncestorIsInSet(object)) {
return false;
}
// check if there is mutual ancestor for some elements, which can replace all of them in the set
- Object* o = _getMutualAncestor(object);
+ SPObject* o = _getMutualAncestor(object);
// remove all descendants from the set
_removeDescendantsFromSet(o);
@@ -27,24 +27,27 @@ bool ObjectSet::add(Object* object) {
return true;
}
-bool ObjectSet::remove(Object* object) {
+void ObjectSet::remove(SPObject* object) {
// object is the top of subtree
if (contains(object)) {
_remove(object);
- return true;
+ // TODO
+// return true;
}
// any ancestor of object is in the set
if (_anyAncestorIsInSet(object)) {
_removeAncestorsFromSet(object);
- return true;
+ // TODO
+// return true;
}
// no object nor any parent in the set
- return false;
+ // TODO
+// return false;
}
-bool ObjectSet::contains(Object* object) {
+bool ObjectSet::contains(SPObject* object) {
return container.get<hashed>().find(object) != container.get<hashed>().end();
}
@@ -58,48 +61,48 @@ int ObjectSet::size() {
return container.size();
}
-bool ObjectSet::_anyAncestorIsInSet(Object *object) {
- Object* o = object;
+bool ObjectSet::_anyAncestorIsInSet(SPObject *object) {
+ SPObject* o = object;
while (o != nullptr) {
if (contains(o)) {
return true;
}
- o = o->getParent();
+ o = o->parent;
}
return false;
}
-void ObjectSet::_removeDescendantsFromSet(Object *object) {
- for (auto& child: object->getChildren()) {
- if (contains(&child)) {
- _remove(&child);
+void ObjectSet::_removeDescendantsFromSet(SPObject *object) {
+ for (auto& child: object->childList(false)) {
+ if (contains(child)) {
+ _remove(child);
// there is certainly no children of this child in the set
continue;
}
- _removeDescendantsFromSet(&child);
+ _removeDescendantsFromSet(child);
}
}
-void ObjectSet::_remove(Object *object) {
+void ObjectSet::_remove(SPObject *object) {
releaseConnections[object].disconnect();
releaseConnections.erase(object);
container.get<hashed>().erase(object);
}
-void ObjectSet::_add(Object *object) {
+void ObjectSet::_add(SPObject *object) {
releaseConnections[object] = object->connectRelease(sigc::mem_fun(*this, &ObjectSet::remove));
container.push_back(object);
}
-Object *ObjectSet::_getMutualAncestor(Object *object) {
- Object *o = object;
+SPObject *ObjectSet::_getMutualAncestor(SPObject *object) {
+ SPObject *o = object;
bool flag = true;
- while (o->getParent() != nullptr) {
- for (auto &child: o->getParent()->getChildren()) {
- if(&child != o && !contains(&child)) {
+ while (o->parent != nullptr) {
+ for (auto &child: o->parent->childList(false)) {
+ if(child != o && !contains(child)) {
flag = false;
break;
}
@@ -107,24 +110,24 @@ Object *ObjectSet::_getMutualAncestor(Object *object) {
if (!flag) {
break;
}
- o = o->getParent();
+ o = o->parent;
}
return o;
}
-void ObjectSet::_removeAncestorsFromSet(Object *object) {
- Object* o = object;
- while (o->getParent() != nullptr) {
- for (auto &child: o->getParent()->getChildren()) {
- if (&child != o) {
- _add(&child);
+void ObjectSet::_removeAncestorsFromSet(SPObject *object) {
+ SPObject* o = object;
+ while (o->parent != nullptr) {
+ for (auto &child: o->parent->childList(false)) {
+ if (child != o) {
+ _add(child);
}
}
- if (contains(o->getParent())) {
- _remove(o->getParent());
+ if (contains(o->parent)) {
+ _remove(o->parent);
break;
}
- o = o->getParent();
+ o = o->parent;
}
}
diff --git a/src/object-set.h b/src/object-set.h
index a3962356b..2b9c5efe3 100644
--- a/src/object-set.h
+++ b/src/object-set.h
@@ -12,7 +12,6 @@
#ifndef INKSCAPE_PROTOTYPE_OBJECTSET_H
#define INKSCAPE_PROTOTYPE_OBJECTSET_H
-#include "object.h"
#include <string>
#include <unordered_map>
#include <boost/multi_index_container.hpp>
@@ -20,38 +19,39 @@
#include <boost/multi_index/sequenced_index.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <sigc++/connection.h>
+#include "sp-object.h"
struct hashed{};
typedef boost::multi_index_container<
- Object*,
+ SPObject*,
boost::multi_index::indexed_by<
boost::multi_index::sequenced<>,
boost::multi_index::hashed_unique<
boost::multi_index::tag<hashed>,
- boost::multi_index::identity<Object*>>
+ boost::multi_index::identity<SPObject*>>
>> multi_index_container;
class ObjectSet {
public:
ObjectSet() {};
~ObjectSet();
- bool add(Object* object);
- bool remove(Object* object);
- bool contains(Object* object);
+ bool add(SPObject* object);
+ void remove(SPObject* object);
+ bool contains(SPObject* object);
void clear();
int size();
private:
- void _add(Object* object);
- void _remove(Object* object);
- bool _anyAncestorIsInSet(Object *object);
- void _removeDescendantsFromSet(Object *object);
- void _removeAncestorsFromSet(Object *object);
- Object *_getMutualAncestor(Object *object);
+ void _add(SPObject* object);
+ void _remove(SPObject* object);
+ bool _anyAncestorIsInSet(SPObject *object);
+ void _removeDescendantsFromSet(SPObject *object);
+ void _removeAncestorsFromSet(SPObject *object);
+ SPObject *_getMutualAncestor(SPObject *object);
multi_index_container container;
- std::unordered_map<Object*, sigc::connection> releaseConnections;
+ std::unordered_map<SPObject*, sigc::connection> releaseConnections;
};
diff --git a/test/src/object-set-test.cpp b/test/src/object-set-test.cpp
index 20d0c9474..eaf1c68f9 100644
--- a/test/src/object-set-test.cpp
+++ b/test/src/object-set-test.cpp
@@ -1,18 +1,20 @@
#include <gtest/gtest.h>
#include "object-set.h"
+#include "document.h"
+#include "xml/simple-document.h"
class ObjectSetTest: public testing::Test {
public:
ObjectSetTest() {
- A = new Object("A");
- B = new Object("B");
- C = new Object("C");
- D = new Object("D");
- E = new Object("E");
- F = new Object("F");
- G = new Object("G");
- H = new Object("H");
- X = new Object("X");
+ A = new SPObject();
+ B = new SPObject();
+ C = new SPObject();
+ D = new SPObject();
+ E = new SPObject();
+ F = new SPObject();
+ G = new SPObject();
+ H = new SPObject();
+ X = new SPObject();
}
~ObjectSetTest() {
delete X;
@@ -25,15 +27,15 @@ public:
delete B;
delete A;
}
- Object* A;
- Object* B;
- Object* C;
- Object* D;
- Object* E;
- Object* F;
- Object* G;
- Object* H;
- Object* X;
+ SPObject* A;
+ SPObject* B;
+ SPObject* C;
+ SPObject* D;
+ SPObject* E;
+ SPObject* F;
+ SPObject* G;
+ SPObject* H;
+ SPObject* X;
ObjectSet set;
ObjectSet set2;
};
@@ -58,18 +60,22 @@ TEST_F(ObjectSetTest, Basics) {
}
TEST_F(ObjectSetTest, Autoremoving) {
- Object* Q = new Object("Q");
+ SPObject* Q = new SPObject();
+ // TODO temporary
+ SPDocument *document = new SPDocument();
+ Inkscape::XML::Node *rroot = new Inkscape::XML::SimpleDocument();
+ Q->invoke_build(document, rroot, 0);
set.add(Q);
EXPECT_TRUE(set.contains(Q));
EXPECT_EQ(1, set.size());
- delete Q;
+ Q->releaseReferences();
EXPECT_EQ(0, set.size());
}
TEST_F(ObjectSetTest, BasicDescendants) {
- A->addChild(B);
- B->addChild(C);
- A->addChild(D);
+ A->attach(B, nullptr);
+ B->attach(C, nullptr);
+ A->attach(D, nullptr);
bool resultB = set.add(B);
bool resultB2 = set.add(B);
EXPECT_TRUE(resultB);
@@ -87,17 +93,19 @@ TEST_F(ObjectSetTest, BasicDescendants) {
}
TEST_F(ObjectSetTest, AdvancedDescendants) {
- A->addChild(B);
- A->addChild(C);
- A->addChild(X);
- B->addChild(D);
- B->addChild(E);
- C->addChild(F);
- C->addChild(G);
- C->addChild(H);
+ A->attach(B, nullptr);
+ A->attach(C, nullptr);
+ A->attach(X, nullptr);
+ B->attach(D, nullptr);
+ B->attach(E, nullptr);
+ C->attach(F, nullptr);
+ C->attach(G, nullptr);
+ C->attach(H, nullptr);
set.add(A);
- bool resultF = set.remove(F);
- EXPECT_TRUE(resultF);
+// bool resultF = set.remove(F);
+// EXPECT_TRUE(resultF);
+ // TODO temporary
+ set.remove(F);
EXPECT_EQ(4, set.size());
EXPECT_FALSE(set.contains(F));
EXPECT_TRUE(set.contains(B));
@@ -111,41 +119,55 @@ TEST_F(ObjectSetTest, AdvancedDescendants) {
}
TEST_F(ObjectSetTest, Removing) {
- A->addChild(B);
- A->addChild(C);
- A->addChild(X);
- B->addChild(D);
- B->addChild(E);
- C->addChild(F);
- C->addChild(G);
- C->addChild(H);
- bool removeH = set.remove(H);
- EXPECT_FALSE(removeH);
+ A->attach(B, nullptr);
+ A->attach(C, nullptr);
+ A->attach(X, nullptr);
+ B->attach(D, nullptr);
+ B->attach(E, nullptr);
+ C->attach(F, nullptr);
+ C->attach(G, nullptr);
+ C->attach(H, nullptr);
+// bool removeH = set.remove(H);
+// EXPECT_FALSE(removeH);
+ // TODO temporary
+ set.remove(H);
set.add(A);
- bool removeX = set.remove(X);
- EXPECT_TRUE(removeX);
+// bool removeX = set.remove(X);
+// EXPECT_TRUE(removeX);
+ // TODO temporary
+ set.remove(X);
EXPECT_EQ(2, set.size());
EXPECT_TRUE(set.contains(B));
EXPECT_TRUE(set.contains(C));
EXPECT_FALSE(set.contains(X));
EXPECT_FALSE(set.contains(A));
- bool removeX2 = set.remove(X);
- EXPECT_FALSE(removeX2);
+// bool removeX2 = set.remove(X);
+// EXPECT_FALSE(removeX2);
+ // TODO temporary
+ set.remove(X);
EXPECT_EQ(2, set.size());
- bool removeA = set.remove(A);
- EXPECT_FALSE(removeA);
+// bool removeA = set.remove(A);
+// EXPECT_FALSE(removeA);
+ // TODO temporary
+ set.remove(A);
EXPECT_EQ(2, set.size());
- bool removeC = set.remove(C);
- EXPECT_TRUE(removeC);
+// bool removeC = set.remove(C);
+// EXPECT_TRUE(removeC);
+ // TODO temporary
+ set.remove(C);
EXPECT_EQ(1, set.size());
EXPECT_TRUE(set.contains(B));
EXPECT_FALSE(set.contains(C));
}
TEST_F(ObjectSetTest, TwoSets) {
- Object* Q = new Object("Q");
- A->addChild(B);
- A->addChild(Q);
+ SPObject* Q = new SPObject();
+ // TODO temporary
+ SPDocument *document = new SPDocument();
+ Inkscape::XML::Node *rroot = new Inkscape::XML::SimpleDocument();
+ Q->invoke_build(document, rroot, 0);
+ A->attach(B, nullptr);
+ A->attach(Q, nullptr);
set.add(A);
set2.add(A);
EXPECT_EQ(1, set.size());
@@ -155,7 +177,7 @@ TEST_F(ObjectSetTest, TwoSets) {
EXPECT_TRUE(set.contains(Q));
EXPECT_EQ(1, set2.size());
EXPECT_TRUE(set2.contains(A));
- delete Q;
+ Q->releaseReferences();
EXPECT_EQ(0, set.size());
EXPECT_EQ(1, set2.size());
EXPECT_TRUE(set2.contains(A));
@@ -163,11 +185,11 @@ TEST_F(ObjectSetTest, TwoSets) {
TEST_F(ObjectSetTest, SetRemoving) {
ObjectSet *objectSet = new ObjectSet();
- A->addChild(B);
+ A->attach(B, nullptr);
objectSet->add(A);
objectSet->add(C);
EXPECT_EQ(2, objectSet->size());
delete objectSet;
- EXPECT_EQ("A", A->getName());
- EXPECT_EQ("C", C->getName());
+ EXPECT_STREQ(nullptr, A->getId());
+ EXPECT_STREQ(nullptr, C->getId());
}