20 #ifndef ABSTRACT_PROPERTY_H
21 #define ABSTRACT_PROPERTY_H
26 #include <tulip/tulipconf.h>
27 #include <tulip/StoredType.h>
28 #include <tulip/MutableContainer.h>
29 #include <tulip/PropertyInterface.h>
30 #include <tulip/Iterator.h>
31 #include <tulip/DataSet.h>
32 #include <tulip/Graph.h>
54 template <
class Tnode,
class Tedge,
class Tprop = PropertyInterface>
57 friend class GraphView;
66 typename Tnode::RealType getNodeDefaultValue()
const;
72 typename Tedge::RealType getEdgeDefaultValue()
const;
82 typename tlp::StoredType<typename Tnode::RealType>::ReturnedConstValue
83 getNodeValue(
const node n)
const;
93 typename tlp::StoredType<typename Tedge::RealType>::ReturnedConstValue
94 getEdgeValue(
const edge e)
const;
102 getNodesEqualTo(
typename tlp::StoredType<typename Tnode::RealType>::ReturnedConstValue v,
103 const Graph *g =
nullptr)
const;
111 getEdgesEqualTo(
typename tlp::StoredType<typename Tedge::RealType>::ReturnedConstValue v,
112 const Graph *g =
nullptr)
const;
121 setNodeValue(
const node n,
122 typename tlp::StoredType<typename Tnode::RealType>::ReturnedConstValue v);
131 setEdgeValue(
const edge e,
132 typename tlp::StoredType<typename Tedge::RealType>::ReturnedConstValue v);
143 setAllNodeValue(
typename tlp::StoredType<typename Tnode::RealType>::ReturnedConstValue v);
151 virtual void resetAllNodeValue();
164 setNodeDefaultValue(
typename tlp::StoredType<typename Tnode::RealType>::ReturnedConstValue v);
183 setValueToGraphNodes(
typename tlp::StoredType<typename Tnode::RealType>::ReturnedConstValue v,
197 setEdgeDefaultValue(
typename tlp::StoredType<typename Tedge::RealType>::ReturnedConstValue v);
208 setAllEdgeValue(
typename tlp::StoredType<typename Tedge::RealType>::ReturnedConstValue v);
216 virtual void resetAllEdgeValue();
235 setValueToGraphEdges(
typename tlp::StoredType<typename Tedge::RealType>::ReturnedConstValue v,
246 setNodeValue(n, nodeDefaultValue);
257 setEdgeValue(e, edgeDefaultValue);
274 if (Tprop::graph ==
nullptr)
275 Tprop::graph = prop.Tprop::graph;
277 if (Tprop::graph == prop.Tprop::graph) {
291 for (
auto n : Tprop::graph->nodes()) {
292 if (prop.Tprop::graph->isElement(n))
296 for (
auto e : Tprop::graph->edges()) {
297 if (prop.Tprop::graph->isElement(e))
310 typename Tnode::RealType v = getNodeDefaultValue();
311 return Tnode::toString(v);
314 typename Tedge::RealType v = getEdgeDefaultValue();
315 return Tedge::toString(v);
318 typename Tnode::RealType v = getNodeValue(n);
319 return Tnode::toString(v);
322 typename Tedge::RealType v = getEdgeValue(e);
323 return Tedge::toString(v);
326 typename Tnode::RealType v;
328 if (!Tnode::fromString(v, inV))
331 setNodeValue(inN, v);
335 typename Tedge::RealType v;
337 if (!Tedge::fromString(v, inV))
340 setEdgeValue(inE, v);
344 typename Tnode::RealType v;
346 if (!Tnode::fromString(v, inV))
349 setNodeDefaultValue(v);
353 typename Tnode::RealType v;
355 if (!Tnode::fromString(v, inV))
362 typename Tnode::RealType v;
364 if (!Tnode::fromString(v, inV))
367 setValueToGraphNodes(v, graph);
371 typename Tedge::RealType v;
373 if (!Tedge::fromString(v, inV))
376 setEdgeDefaultValue(v);
380 typename Tedge::RealType v;
382 if (!Tedge::fromString(v, inV))
389 typename Tedge::RealType v;
391 if (!Tedge::fromString(v, inV))
394 setValueToGraphEdges(v, graph);
398 bool hasNonDefaultValuatedNodes(
const Graph *g =
nullptr)
const override;
399 unsigned int numberOfNonDefaultValuatedNodes(
const Graph *g =
nullptr)
const override;
400 unsigned int nodeValueSize()
const override;
401 void writeNodeDefaultValue(std::ostream &)
const override;
402 void writeNodeValue(std::ostream &,
node)
const override;
403 bool readNodeDefaultValue(std::istream &)
override;
404 bool readNodeValue(std::istream &,
node)
override;
406 bool hasNonDefaultValuatedEdges(
const Graph *g =
nullptr)
const override;
407 unsigned int numberOfNonDefaultValuatedEdges(
const Graph * =
nullptr)
const override;
408 unsigned int edgeValueSize()
const override;
409 void writeEdgeDefaultValue(std::ostream &)
const override;
410 void writeEdgeValue(std::ostream &,
edge)
const override;
411 bool readEdgeDefaultValue(std::istream &)
override;
412 bool readEdgeValue(std::istream &,
edge)
override;
414 bool ifNotDefault =
false)
override {
415 if (property ==
nullptr)
422 typename StoredType<typename Tnode::RealType>::ReturnedValue value =
423 tp->nodeProperties.get(source.
id, notDefault);
425 if (ifNotDefault && !notDefault)
428 setNodeValue(destination, value);
432 bool ifNotDefault =
false)
override {
433 if (property ==
nullptr)
440 typename StoredType<typename Tedge::RealType>::ReturnedValue value =
441 tp->edgeProperties.get(source.
id, notDefault);
443 if (ifNotDefault && !notDefault)
446 setEdgeValue(destination, value);
452 assert(prop !=
nullptr);
457 return new TypedValueContainer<typename Tnode::RealType>(getNodeDefaultValue());
460 return new TypedValueContainer<typename Tedge::RealType>(getEdgeDefaultValue());
463 return new TypedValueContainer<typename Tnode::RealType>(getNodeValue(n));
466 return new TypedValueContainer<typename Tedge::RealType>(getEdgeValue(e));
470 typename StoredType<typename Tnode::RealType>::ReturnedValue value =
471 nodeProperties.get(n.
id, notDefault);
474 return new TypedValueContainer<typename Tnode::RealType>(value);
480 typename StoredType<typename Tedge::RealType>::ReturnedValue value =
481 edgeProperties.get(e.
id, notDefault);
484 return new TypedValueContainer<typename Tedge::RealType>(value);
489 setNodeValue(n,
static_cast<const TypedValueContainer<typename Tnode::RealType> *
>(v)->value);
492 setEdgeValue(e,
static_cast<const TypedValueContainer<typename Tedge::RealType> *
>(v)->value);
495 setAllNodeValue(
static_cast<const TypedValueContainer<typename Tnode::RealType> *
>(v)->value);
498 setAllEdgeValue(
static_cast<const TypedValueContainer<typename Tedge::RealType> *
>(v)->value);
505 if (Tprop::metaValueCalculator)
507 Tprop::metaValueCalculator)
508 ->computeMetaValue(
this, n, sg, mg);
513 if (Tprop::metaValueCalculator)
515 Tprop::metaValueCalculator)
516 ->computeMetaValue(
this, e, itE, mg);
523 <<
"Warning : " << __PRETTY_FUNCTION__ <<
" ... invalid conversion of "
524 <<
typeid(mvCalc).name() <<
"into "
531 Tprop::metaValueCalculator = mvCalc;
534 int compare(
const node n1,
const node n2)
const override;
535 int compare(
const edge e1,
const edge e2)
const override;
561 MutableContainer<typename Tnode::RealType> nodeProperties;
562 MutableContainer<typename Tedge::RealType> edgeProperties;
563 typename Tnode::RealType nodeDefaultValue;
564 typename Tedge::RealType edgeDefaultValue;
567 template <
typename vectType,
typename eltType,
typename propType = VectorPropertyInterface>
568 class TLP_SCOPE AbstractVectorProperty :
public AbstractProperty<vectType, vectType, propType> {
570 AbstractVectorProperty(Graph *,
const std::string &name =
"");
573 bool tokenize(
const std::string &str, std::vector<std::string> &vect,
char openChar =
'(',
574 char sepChar =
',',
char closeChar =
')')
override;
576 bool setNodeStringValueAsVector(
const node n,
const std::vector<std::string> &values)
override;
578 bool setNodeStringValueAsVector(
const node,
const std::string &,
char,
char,
char)
override;
580 bool setEdgeStringValueAsVector(
const edge e,
const std::vector<std::string> &values)
override;
582 bool setEdgeStringValueAsVector(
const edge,
const std::string &,
char,
char,
char)
override;
592 void setNodeEltValue(
const node n,
unsigned int i,
593 typename tlp::StoredType<typename eltType::RealType>::ReturnedConstValue v);
601 typename tlp::StoredType<typename eltType::RealType>::ReturnedConstValue
602 getNodeEltValue(
const node n,
unsigned int i)
const;
612 pushBackNodeEltValue(
const node n,
613 typename tlp::StoredType<typename eltType::RealType>::ReturnedConstValue v);
621 void popBackNodeEltValue(
const node n);
631 void resizeNodeValue(
const node n,
size_t size,
632 typename eltType::RealType elt = eltType::defaultValue());
641 void setEdgeEltValue(
const edge e,
unsigned int i,
642 typename tlp::StoredType<typename eltType::RealType>::ReturnedConstValue v);
650 typename tlp::StoredType<typename eltType::RealType>::ReturnedConstValue
651 getEdgeEltValue(
const edge n,
unsigned int i)
const;
661 pushBackEdgeEltValue(
const edge e,
662 typename tlp::StoredType<typename eltType::RealType>::ReturnedConstValue v);
670 void popBackEdgeEltValue(
const edge e);
680 void resizeEdgeValue(
const edge e,
size_t size,
681 typename eltType::RealType elt = eltType::defaultValue());
684 #if !defined(_MSC_VER) || defined(DLL_TULIP) // When using VC++, we only want to include this when
687 #include "cxx/AbstractProperty.cxx"