diff options
| author | Adrian Boguszewski <adrbogus1@student.pg.gda.pl> | 2016-06-06 10:29:05 +0000 |
|---|---|---|
| committer | Adrian Boguszewski <adrbogus1@student.pg.gda.pl> | 2016-06-06 10:29:05 +0000 |
| commit | b98472931f26e998969d9ffa49dbe12c4fada097 (patch) | |
| tree | 1858b70f0c09c71d3031893b459c5e70b712e418 | |
| parent | Added object set (diff) | |
| parent | [Bug #1588983] Finish up German tutorials for 0.92. (diff) | |
| download | inkscape-b98472931f26e998969d9ffa49dbe12c4fada097.tar.gz inkscape-b98472931f26e998969d9ffa49dbe12c4fada097.zip | |
Replaced Object by SPObject
(bzr r14954.1.2)
| -rw-r--r-- | src/object-set.cpp | 67 | ||||
| -rw-r--r-- | src/object-set.h | 26 | ||||
| -rw-r--r-- | test/src/object-set-test.cpp | 138 |
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()); } |
