summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CMakeScripts/ConfigCompileFlags.cmake4
-rw-r--r--CMakeScripts/DefineDependsandFlags.cmake2
-rw-r--r--src/object-set.cpp28
-rw-r--r--src/object-set.h26
-rw-r--r--testfiles/src/object-set-test.cpp105
5 files changed, 116 insertions, 49 deletions
diff --git a/CMakeScripts/ConfigCompileFlags.cmake b/CMakeScripts/ConfigCompileFlags.cmake
index 453ceef21..602886219 100644
--- a/CMakeScripts/ConfigCompileFlags.cmake
+++ b/CMakeScripts/ConfigCompileFlags.cmake
@@ -1,6 +1,8 @@
set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS}")
add_definitions(-Wall -Wformat-security -W -Wpointer-arith -Wcast-align -Wsign-compare -Woverloaded-virtual -Wswitch)
-add_definitions(-O2)
+# TODO temporary flag
+add_definitions(-O0)
+add_definitions(-std=c++11)
# Define the flags for profiling if desired:
if(WITH_PROFILING)
diff --git a/CMakeScripts/DefineDependsandFlags.cmake b/CMakeScripts/DefineDependsandFlags.cmake
index 9c4d6b085..706860a00 100644
--- a/CMakeScripts/DefineDependsandFlags.cmake
+++ b/CMakeScripts/DefineDependsandFlags.cmake
@@ -10,8 +10,6 @@ list(APPEND INKSCAPE_INCS ${PROJECT_SOURCE_DIR}
# generated includes
${CMAKE_BINARY_DIR}/include
)
-# TODO temporary flag
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
# ----------------------------------------------------------------------------
# Files we include
diff --git a/src/object-set.cpp b/src/object-set.cpp
index 627544a21..518ce15a3 100644
--- a/src/object-set.cpp
+++ b/src/object-set.cpp
@@ -174,13 +174,8 @@ bool ObjectSet::isEmpty() {
return container.size() == 0;
}
-
SPObject *ObjectSet::single() {
- if (container.size() == 1) {
- return *container.begin();
- }
-
- return nullptr;
+ return container.size() == 1 ? *container.begin() : nullptr;
}
SPItem *ObjectSet::singleItem() {
@@ -257,27 +252,6 @@ void ObjectSet::set(SPObject *object) {
// _emitSignals();
}
-void ObjectSet::setList(const std::vector<SPItem *> &objs) {
- _clear();
- addList(objs);
-}
-
-void ObjectSet::addList(const std::vector<SPItem *> &objs) {
- for (std::vector<SPItem*>::const_iterator iter = objs.begin(); iter != objs.end(); ++iter) {
- SPObject *obj = *iter;
- if (!includes(obj)) {
- add(obj);
- }
- }
-}
-
-void ObjectSet::add(const std::vector<SPItem*>::iterator& from, const std::vector<SPItem*>::iterator& to) {
- for(auto it = from; it != to; ++it) {
- _add(*it);
- }
-}
-
-
Geom::OptRect ObjectSet::bounds(SPItem::BBoxType type) const
{
return (type == SPItem::GEOMETRIC_BBOX) ?
diff --git a/src/object-set.h b/src/object-set.h
index 49a875562..29083863b 100644
--- a/src/object-set.h
+++ b/src/object-set.h
@@ -21,6 +21,8 @@
#include <boost/multi_index/random_access_index.hpp>
#include <boost/range/sub_range.hpp>
#include <boost/range/any_range.hpp>
+#include <boost/type_traits.hpp>
+#include <boost/utility/enable_if.hpp>
#include <sigc++/connection.h>
#include "sp-object.h"
#include "sp-item.h"
@@ -84,7 +86,12 @@ public:
* \param from the begin iterator
* \param to the end iterator
*/
- void add(const std::vector<SPItem*>::iterator& from, const std::vector<SPItem*>::iterator& to);
+ template <typename InputIterator>
+ void add(InputIterator from, InputIterator to) {
+ for(auto it = from; it != to; ++it) {
+ _add(*it);
+ }
+ }
/**
* Removes an item from the set of selected objects.
@@ -176,14 +183,27 @@ public:
*
* @param objs the objects to select
*/
- void setList(const std::vector<SPItem *> &objs);
+ template <class T>
+ typename boost::enable_if<boost::is_base_of<SPObject, T>, void>::type
+ setList(const std::vector<T*> &objs) {
+ _clear();
+ addList(objs);
+ }
/**
* Adds the specified objects to selection, without deselecting first.
*
* @param objs the objects to select
*/
- void addList(std::vector<SPItem*> const &objs);
+ template <class T>
+ typename boost::enable_if<boost::is_base_of<SPObject, T>, void>::type
+ addList(const std::vector<T*> &objs) {
+ for (auto obj: objs) {
+ if (!includes(obj)) {
+ add(obj);
+ }
+ }
+ }
/** Returns the bounding rectangle of the selection. */
Geom::OptRect bounds(SPItem::BBoxType type) const;
diff --git a/testfiles/src/object-set-test.cpp b/testfiles/src/object-set-test.cpp
index ea953ac27..e294a5a51 100644
--- a/testfiles/src/object-set-test.cpp
+++ b/testfiles/src/object-set-test.cpp
@@ -10,6 +10,8 @@
*/
#include <gtest/gtest.h>
#include <doc-per-case-test.h>
+#include <src/sp-factory.h>
+#include <src/sp-rect.h>
#include "object-set.h"
using namespace Inkscape;
@@ -67,11 +69,98 @@ TEST_F(ObjectSetTest, Basics) {
EXPECT_TRUE(set->includes(C));
EXPECT_FALSE(set->includes(D));
EXPECT_FALSE(set->includes(X));
+ EXPECT_FALSE(set->includes(nullptr));
set->remove(A);
EXPECT_EQ(2, set->size());
EXPECT_FALSE(set->includes(A));
set->clear();
EXPECT_EQ(0, set->size());
+ bool resultNull = set->add(nullptr);
+ EXPECT_FALSE(resultNull);
+ EXPECT_EQ(0, set->size());
+ bool resultNull2 = set->remove(nullptr);
+ EXPECT_FALSE(resultNull2);
+}
+
+TEST_F(ObjectSetTest, Advanced) {
+ set->add(A);
+ set->add(B);
+ set->add(C);
+ EXPECT_TRUE(set->includes(C));
+ set->toggle(C);
+ EXPECT_EQ(2, set->size());
+ EXPECT_FALSE(set->includes(C));
+ set->toggle(D);
+ EXPECT_EQ(3, set->size());
+ EXPECT_TRUE(set->includes(D));
+ set->toggle(D);
+ EXPECT_EQ(2, set->size());
+ EXPECT_FALSE(set->includes(D));
+ EXPECT_EQ(nullptr, set->single());
+ set->set(X);
+ EXPECT_EQ(1, set->size());
+ EXPECT_TRUE(set->includes(X));
+ EXPECT_EQ(X, set->single());
+ EXPECT_FALSE(set->isEmpty());
+ set->clear();
+ EXPECT_TRUE(set->isEmpty());
+ std::vector<SPObject*> list1 {A, B, C, D};
+ std::vector<SPObject*> list2 {E, F};
+ set->addList(list1);
+ EXPECT_EQ(4, set->size());
+ set->addList(list2);
+ EXPECT_EQ(6, set->size());
+ EXPECT_TRUE(set->includes(A));
+ EXPECT_TRUE(set->includes(B));
+ EXPECT_TRUE(set->includes(C));
+ EXPECT_TRUE(set->includes(D));
+ EXPECT_TRUE(set->includes(E));
+ EXPECT_TRUE(set->includes(F));
+ set->setList(list2);
+ EXPECT_EQ(2, set->size());
+ EXPECT_TRUE(set->includes(E));
+ EXPECT_TRUE(set->includes(F));
+}
+
+TEST_F(ObjectSetTest, Items) {
+ SPRect* rect10x100 = (SPRect *) SPFactory::createObject("svg:rect");
+// rect10x100->invoke_build(_doc, _doc->rroot, 1);
+ SPRect* rect20x40 = (SPRect *) SPFactory::createObject("svg:rect");
+// rect20x40->invoke_build(_doc, _doc->rroot, 1);
+// SPRect* rect30x30 = (SPRect *) SPFactory::createObject("svg:rect");
+// rect30x30->invoke_build(_doc, _doc->rroot, 1);
+// rect10x100->width = 10;
+// rect10x100->height = 100;
+// rect20x40->width = 20;
+// rect20x40->height = 40;
+// rect30x30->width = 30;
+// rect30x30->height = 30;
+ set->add(rect10x100);
+ EXPECT_EQ(rect10x100, set->singleItem());
+ EXPECT_EQ(rect10x100->getRepr(), set->singleRepr());
+ set->add(rect20x40);
+ EXPECT_EQ(nullptr, set->singleItem());
+ EXPECT_EQ(nullptr, set->singleRepr());
+// set->add(rect30x30);
+// EXPECT_EQ(3, set->size());
+// EXPECT_EQ(rect10x100, set->smallestItem(ObjectSet::CompareSize::HORIZONTAL));
+// EXPECT_EQ(rect30x30, set->smallestItem(ObjectSet::CompareSize::VERTICAL));
+// EXPECT_EQ(rect20x40, set->smallestItem(ObjectSet::CompareSize::AREA));
+// EXPECT_EQ(rect30x30, set->largestItem(ObjectSet::CompareSize::HORIZONTAL));
+// EXPECT_EQ(rect10x100, set->largestItem(ObjectSet::CompareSize::VERTICAL));
+// EXPECT_EQ(rect10x100, set->largestItem(ObjectSet::CompareSize::AREA));
+}
+
+TEST_F(ObjectSetTest, Ranges) {
+ std::vector<SPObject*> objs {A, D, B, E, C, F};
+ set->add(objs.begin() + 1, objs.end() - 1);
+ EXPECT_EQ(4, set->size());
+ auto it = set->objects().begin();
+ EXPECT_EQ(D, *it++);
+ EXPECT_EQ(B, *it++);
+ EXPECT_EQ(E, *it++);
+ EXPECT_EQ(C, *it++);
+ EXPECT_EQ(set->objects().end(), it);
}
TEST_F(ObjectSetTest, Autoremoving) {
@@ -190,19 +279,3 @@ TEST_F(ObjectSetTest, SetRemoving) {
EXPECT_STREQ(nullptr, A->getId());
EXPECT_STREQ(nullptr, C->getId());
}
-
-TEST_F(ObjectSetTest, SetOrder) {
- set->add(A);
- set->add(D);
- set->add(B);
- set->add(E);
- set->add(C);
- EXPECT_EQ(5, set->size());
- auto it = set->objects().begin();
- EXPECT_EQ(A, *it++);
- EXPECT_EQ(D, *it++);
- EXPECT_EQ(B, *it++);
- EXPECT_EQ(E, *it++);
- EXPECT_EQ(C, *it++);
- EXPECT_EQ(set->objects().end(), it);
-} \ No newline at end of file