Go to the documentation of this file.00001
00002
00003
00004
00005 #ifndef Connector_hh
00006 #define Connector_hh
00007
00008 #include "basics/typedefs.hh"
00009 #include "basics/outputOperator.hh"
00010 #include <iostream>
00011
00012 namespace concepts {
00013
00014
00015
00021 class Attribute {
00022 friend std::ostream& operator<<(std::ostream& os, const Attribute& a);
00023 public:
00028 inline Attribute(uint attrib = 0) : attrib_(attrib) {}
00029
00031 int operator==(const Attribute& a) const { return attrib_ == a.attrib_; }
00032
00034 inline operator uint() const { return attrib_; }
00035
00037 inline uint attrib() const { return attrib_; }
00038 private:
00040 uint attrib_;
00041 };
00042
00043
00044
00049 class Key {
00050 friend std::ostream& operator<<(std::ostream& os, const Key& k);
00051 public:
00053 inline Key(uint key = 0) : key_(key) {}
00054
00056 inline int operator==(const Key& key) const { return key_ == key.key_; }
00057
00059 inline operator uint() const { return key_; }
00060
00062 inline uint key() const { return key_; }
00063
00065 inline static uint noKey() { return (uint)-1; }
00066 private:
00067 uint key_;
00068 };
00069
00070
00071
00081 class Connector : public OutputOperator {
00082 public:
00084 Connector(const uint key, const Attribute attrib) :
00085 key_(key), attrib_(attrib) {}
00086
00094 virtual Connector* child(uint i, bool mode = 0) = 0;
00095 virtual const Connector* child(uint i) const = 0;
00096
00098 int operator==(const Connector& cntr) const { return key_ == cntr.key_; }
00099
00101 const Key& key() const { return key_; }
00102
00104 const Attribute& attrib() const { return attrib_; }
00105
00115 int related(const Connector& conn) const;
00116 protected:
00117 virtual std::ostream& info(std::ostream& os) const;
00118
00120 Key key_;
00121
00123 Attribute attrib_;
00124 };
00125
00129 bool operator<(const Connector& cntr_x, const Connector& cntr_y);
00130
00131
00132
00138 class Connector0 : public Connector {
00139 public:
00144 inline Connector0(Attribute attrib) : Connector(cnt_++, attrib) {}
00145
00146 virtual Connector0* child(uint i, bool mode = 0) = 0;
00147 virtual const Connector0* child(uint i) const = 0;
00148 protected:
00153 inline Connector0(const Attribute attrib, const Key& key)
00154 : Connector(key, attrib) {};
00155
00159 static uint cnt_;
00160 };
00161
00162
00163
00173 class Connector1 : public Connector {
00174 public:
00179 inline Connector1(Attribute attrib) : Connector(cnt_++, attrib) {}
00180
00187 virtual Connector0* vertex(uint i) const = 0;
00188
00189 virtual Connector1* child(uint i, bool mode = 0) = 0;
00190 virtual const Connector1* child(uint i) const = 0;
00191 protected:
00196 inline Connector1(const Attribute attrib, const Key& key)
00197 : Connector(key, attrib) {};
00198
00202 static uint cnt_;
00203 };
00204
00205
00206
00217 class Connector2 : public Connector {
00218 public:
00223 inline Connector2(Attribute attrib) : Connector(cnt_++, attrib) {}
00224
00225 virtual Connector2* child(uint i, bool mode = 0) = 0;
00226 virtual const Connector2* child(uint i) const = 0;
00227
00234 virtual Connector1* edge(uint i) const = 0;
00235
00242 virtual Connector0* vertex(uint i) const = 0;
00243 protected:
00248 inline Connector2(const Attribute attrib, const Key& key)
00249 : Connector(key, attrib) {};
00250
00254 static uint cnt_;
00255 };
00256
00257
00258
00268 class Connector3 : public Connector {
00269 public:
00274 inline Connector3(Attribute attrib) : Connector(cnt_++, attrib) {}
00275
00276 virtual Connector3* child(uint i, bool mode = 0) = 0;
00277 virtual const Connector3* child(uint i) const = 0;
00278
00285 virtual Connector1* edge(uint i) const = 0;
00286
00293 virtual Connector2* face(uint i) const = 0;
00294
00301 virtual Connector0* vertex(uint i) const = 0;
00302 protected:
00307 inline Connector3(const Attribute attrib, const Key& key)
00308 : Connector(key, attrib) {};
00309
00313 static uint cnt_;
00314 };
00315
00316 }
00317
00318
00319 namespace test {
00320
00321
00322
00323
00334 class ResetConnector0 : public concepts::Connector0 {
00335 public:
00336 static void reset() { cnt_ = 0; }
00337 static uint cnt() { return cnt_; }
00338 };
00339 class ResetConnector1 : public concepts::Connector1 {
00340 public:
00341 static void reset() { cnt_ = 0; }
00342 static uint cnt() { return cnt_; }
00343 };
00344 class ResetConnector2 : public concepts::Connector2 {
00345 public:
00346 static void reset() { cnt_ = 0; }
00347 static uint cnt() { return cnt_; }
00348 };
00349 class ResetConnector3 : public concepts::Connector3 {
00350 public:
00351 static void reset() { cnt_ = 0; }
00352 static uint cnt() { return cnt_; }
00353 };
00354 }
00355
00356 #endif // Connector_hh