00001 /* Sets for Connectors. 00002 */ 00003 00004 #ifndef ConnectorSequence_hh 00005 #define ConnectorSequence_hh 00006 00007 #include "connector.hh" 00008 #include "toolbox/sequence.hh" 00009 00010 namespace concepts { 00011 00012 // ************************************************** Sequence<const Key*> ** 00013 00014 template<> 00015 class Sequence<const Key*> : public BaseSequence<const Key*> { 00016 public: 00017 Sequence() : BaseSequence<const Key*>() {} 00018 template<class F> 00019 Sequence(const F& seq) : BaseSequence<const Key*>(seq) {} 00020 virtual ~Sequence() {} 00021 00022 Sequence<uint> key() const; 00023 }; 00024 00025 // ******************************************* Sequence<const Connector0*> ** 00026 00027 template<> 00028 class Sequence<const Connector0*> : 00029 public BaseSequence<const Connector0*> { 00030 public: 00031 Sequence() : BaseSequence<const Connector0*>() {} 00032 template<class F> 00033 Sequence(const F& seq) : BaseSequence<const Connector0*>(seq) {} 00034 virtual ~Sequence() {} 00035 00036 Sequence<const Key*> key() const; 00037 }; 00038 00039 // ************************************************* Sequence<Connector0*> ** 00040 00041 template<> 00042 class Sequence<Connector0*> : public BaseSequence<Connector0*> { 00043 public: 00044 Sequence() : BaseSequence<Connector0*>() {} 00045 template<class F> 00046 Sequence(const F& seq) : BaseSequence<Connector0*>(seq) {} 00047 virtual ~Sequence() {} 00048 00049 Sequence<const Key*> key() const; 00050 }; 00051 00052 // ******************************************* Sequence<const Connector1*> ** 00053 00054 template<> 00055 class Sequence<const Connector1*> : 00056 public BaseSequence<const Connector1*> { 00057 public: 00058 Sequence() : BaseSequence<const Connector1*>() {} 00059 template<class F> 00060 Sequence(const F& seq) : BaseSequence<const Connector1*>(seq) {} 00061 virtual ~Sequence() {} 00062 00063 Sequence<const Key*> key() const; 00064 Sequence<Connector0*> vertex(uint i) const; 00065 Sequence<const Connector1*> child(uint i) const; 00066 }; 00067 00068 // ************************************************* Sequence<Connector1*> ** 00069 00070 template<> 00071 class Sequence<Connector1*> : public BaseSequence<Connector1*> { 00072 public: 00073 Sequence() : BaseSequence<Connector1*>() {} 00074 template<class F> 00075 Sequence(const F& seq) : BaseSequence<Connector1*>(seq) {} 00076 virtual ~Sequence() {} 00077 00078 Sequence<const Key*> key() const; 00079 Sequence<Connector0*> vertex(uint i) const; 00080 Sequence<const Connector1*> child(uint i) const; 00081 }; 00082 00083 // ******************************************* Sequence<const Connector2*> ** 00084 00085 template<> 00086 class Sequence<const Connector2*> : 00087 public BaseSequence<const Connector2*> { 00088 public: 00089 Sequence() : BaseSequence<const Connector2*>() {} 00090 template<class F> 00091 Sequence(const F& seq) : BaseSequence<const Connector2*>(seq) {} 00092 virtual ~Sequence() {} 00093 00094 Sequence<const Key*> key() const; 00095 Sequence<Connector0*> vertex(uint i) const; 00096 Sequence<Connector1*> edge(uint i) const; 00097 Sequence<const Connector2*> child(uint i) const; 00098 }; 00099 00100 // ************************************************* Sequence<Connector2*> ** 00101 00102 template<> 00103 class Sequence<Connector2*> : public BaseSequence<Connector2*> { 00104 public: 00105 Sequence() : BaseSequence<Connector2*>() {} 00106 template<class F> 00107 Sequence(const F& seq) : BaseSequence<Connector2*>(seq) {} 00108 virtual ~Sequence() {} 00109 00110 Sequence<const Key*> key() const; 00111 Sequence<Connector0*> vertex(uint i) const; 00112 Sequence<Connector1*> edge(uint i) const; 00113 Sequence<const Connector2*> child(uint i) const; 00114 }; 00115 00116 // ********************************************************* allConnectors ** 00117 00123 template<class F, class G> 00124 Sequence<G*> allConnectors(const F& cntr, G* (F::*fun)(uint) const) { 00125 Sequence<G*> seq; 00126 G* cntri; // connectors inside cntr 00127 uint i = 0; 00128 while ((cntri = (cntr.*fun)(i++)) != 0) seq.push_back(cntri); 00129 return seq; 00130 } 00131 00132 } // namespace concepts 00133 00134 #endif // ConnectorSequence_hh 00135