21 #ifndef TULIP_SORTITERATOR_H
22 #define TULIP_SORTITERATOR_H
25 #include <tulip/Iterator.h>
26 #include <tulip/StableIterator.h>
27 #include <tulip/NumericProperty.h>
28 #include <tulip/Graph.h>
29 #include <tulip/Vector.h>
34 #ifndef DOXYGEN_NOTFOR_DEVEL
39 bool operator() (
const node &n1,
const node &n2)
const {
40 return (metric->getNodeDoubleValue(n1) < metric->getNodeDoubleValue(n2));
42 bool operator() (
const edge &e1,
const edge &e2)
const {
43 return (metric->getEdgeDoubleValue(e1) < metric->getEdgeDoubleValue(e2));
47 struct LessThanEdgeTargetMetric {
49 metric(metric), sg(sg) {
51 bool operator() (
const edge &e1,
const edge &e2)
const {
52 return (metric->getNodeDoubleValue(sg->target(e1)) < metric->getNodeDoubleValue(sg->target(e2)));
59 struct LessThanEdgeSourceMetric {
61 metric(metric), sg(sg) {
63 bool operator() (
const edge &e1,
const edge &e2)
const {
64 return (metric->getNodeDoubleValue(sg->source(e1)) < metric->getNodeDoubleValue(sg->source(e2)));
71 struct LessThanEdgeExtremitiesMetric {
73 metric(metric), sg(sg) {
75 bool operator() (
const edge &e1,
const edge &e2)
const {
76 Vec2d v1(metric->getNodeDoubleValue(sg->source(e1)), metric->getNodeDoubleValue(sg->target(e1)));
77 Vec2d v2(metric->getNodeDoubleValue(sg->source(e2)), metric->getNodeDoubleValue(sg->target(e2)));
85 #endif // DOXYGEN_NOTFOR_DEVEL
91 struct SortNodeIterator :
public StableIterator<tlp::node> {
93 SortNodeIterator(Iterator<tlp::node> *itIn,
tlp::NumericProperty* metric,
bool ascendingOrder =
true) : StableIterator<tlp::node>(itIn) {
95 sort(sequenceCopy.begin(),sequenceCopy.end(),tmp);
97 if (!ascendingOrder) {
98 reverse(sequenceCopy.begin(),sequenceCopy.end());
101 copyIterator=sequenceCopy.begin();
104 ~SortNodeIterator() {}
110 struct SortEdgeIterator :
public StableIterator<tlp::edge> {
112 SortEdgeIterator(Iterator<tlp::edge> *itIn,
tlp::NumericProperty* metric,
bool ascendingOrder =
true) : StableIterator<tlp::edge>(itIn) {
113 LessThan tmp(metric);
114 sort(sequenceCopy.begin(),sequenceCopy.end(),tmp);
116 if (!ascendingOrder) {
117 reverse(sequenceCopy.begin(),sequenceCopy.end());
120 copyIterator=sequenceCopy.begin();
123 ~SortEdgeIterator() {}
129 struct SortTargetEdgeIterator :
public StableIterator<tlp::edge> {
131 SortTargetEdgeIterator(Iterator<tlp::edge> *itIn, Graph* sg,
tlp::NumericProperty* metric,
bool ascendingOrder =
true) : StableIterator<tlp::edge>(itIn) {
132 LessThanEdgeTargetMetric tmp(sg,metric);
133 sort(sequenceCopy.begin(),sequenceCopy.end(),tmp);
135 if (!ascendingOrder) {
136 reverse(sequenceCopy.begin(),sequenceCopy.end());
139 copyIterator=sequenceCopy.begin();
142 ~SortTargetEdgeIterator() {}
148 struct SortSourceEdgeIterator :
public StableIterator<tlp::edge> {
150 SortSourceEdgeIterator(Iterator<tlp::edge> *itIn, Graph* sg,
tlp::NumericProperty* metric,
bool ascendingOrder =
true) : StableIterator<tlp::edge>(itIn) {
151 LessThanEdgeSourceMetric tmp(sg,metric);
152 sort(sequenceCopy.begin(),sequenceCopy.end(),tmp);
154 if (!ascendingOrder) {
155 reverse(sequenceCopy.begin(),sequenceCopy.end());
158 copyIterator=sequenceCopy.begin();
161 ~SortSourceEdgeIterator() {}
167 struct SortExtremitiesEdgeIterator :
public StableIterator<tlp::edge> {
169 SortExtremitiesEdgeIterator(Iterator<tlp::edge> *itIn, Graph* sg,
tlp::NumericProperty* metric,
bool ascendingOrder =
true) : StableIterator<tlp::edge>(itIn) {
170 LessThanEdgeExtremitiesMetric tmp(sg,metric);
171 sort(sequenceCopy.begin(),sequenceCopy.end(),tmp);
173 if (!ascendingOrder) {
174 reverse(sequenceCopy.begin(),sequenceCopy.end());
177 copyIterator=sequenceCopy.begin();
180 ~SortExtremitiesEdgeIterator() {}
Interface all numerical properties. Property values are always returned as double.