www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

directions.hh (4250B)


      1 #ifndef _GEOMETRY_DIRECTIONS_HH_
      2 #define _GEOMETRY_DIRECTIONS_HH_
      3 
      4 class EnsembleCardinaux {
      5 protected:
      6 	char v;
      7 	EnsembleCardinaux(char _v) : v(_v) {}
      8 public:
      9 	friend EnsembleCardinaux operator| (const EnsembleCardinaux ec1, const EnsembleCardinaux ec2) {
     10 		return EnsembleCardinaux(ec1.v | ec2.v);
     11 	}
     12 	friend EnsembleCardinaux operator& (const EnsembleCardinaux ec1, const EnsembleCardinaux ec2) {
     13 		return EnsembleCardinaux(ec1.v & ec2.v);
     14 	}
     15 	friend bool operator== (const EnsembleCardinaux ec1, const EnsembleCardinaux ec2) {
     16 		return (ec1.v == ec2.v);
     17 	}
     18 	friend bool operator!= (const EnsembleCardinaux ec1, const EnsembleCardinaux ec2) {
     19 		return (ec1.v != ec2.v);
     20 	}
     21 };
     22 
     23 class Cardinal : public EnsembleCardinaux {
     24 private:
     25 	static const char rotationTable[9];
     26 public:
     27 	Cardinal(int x) : EnsembleCardinaux((char)(1 << (x & 3))) {}
     28 	operator int () const {
     29 		return rotationTable[(int)v];
     30 	}
     31 	friend Cardinal operator+ (const Cardinal c, const int n) {
     32 		return Cardinal(rotationTable[(int)c.v] + n);
     33 	}
     34 	friend Cardinal operator- (const Cardinal c, const int n) {
     35 		return Cardinal(rotationTable[(int)c.v] - n);
     36 	}
     37 };
     38 
     39 const Cardinal N = Cardinal(0);
     40 const Cardinal E = Cardinal(1);
     41 const Cardinal S = Cardinal(2);
     42 const Cardinal W = Cardinal(3);
     43 
     44 // Plus ou moins la même chose que Cardinal.
     45 class Coin {
     46 private:
     47 	char v;
     48 	static const char rotationTable[9];
     49 public:
     50 	Coin(int x) : v((char)(1 << (x & 3))) {}
     51 	operator int () const {
     52 		return (int)rotationTable[(int)v];
     53 	}
     54 	friend Coin operator+ (const Coin c, const int n) {
     55 		return Coin(rotationTable[(int)c.v] + n);
     56 	}
     57 	friend Coin operator- (const Coin c, const int n) {
     58 		return Coin(rotationTable[(int)c.v] - n);
     59 	}
     60 	friend bool operator== (const Coin c1, const Coin c2) {
     61 		return (c1.v == c2.v);
     62 	}
     63 	friend bool operator!= (const Coin c1, const Coin c2) {
     64 		return (c1.v != c2.v);
     65 	}
     66 };
     67 
     68 const Coin NE = Coin(0);
     69 const Coin SE = Coin(1);
     70 const Coin SW = Coin(2);
     71 const Coin NW = Coin(3);
     72 
     73 // Pour les triangles, c'est quasiment identique, il y a sûrement moyen de factoriser ça.
     74 
     75 class EnsembleCotesTriangle {
     76 protected:
     77 	char v;
     78 	EnsembleCotesTriangle(char _v) : v(_v) {}
     79 public:
     80 	friend EnsembleCotesTriangle operator| (const EnsembleCotesTriangle ec1, const EnsembleCotesTriangle ec2) {
     81 		return EnsembleCotesTriangle(ec1.v | ec2.v);
     82 	}
     83 	friend EnsembleCotesTriangle operator& (const EnsembleCotesTriangle ec1, const EnsembleCotesTriangle ec2) {
     84 		return EnsembleCotesTriangle(ec1.v & ec2.v);
     85 	}
     86 	friend bool operator== (const EnsembleCotesTriangle ec1, const EnsembleCotesTriangle ec2) {
     87 		return (ec1.v == ec2.v);
     88 	}
     89 	friend bool operator!= (const EnsembleCotesTriangle ec1, const EnsembleCotesTriangle ec2) {
     90 		return (ec1.v != ec2.v);
     91 	}
     92 };
     93 
     94 class CoteTriangle : public EnsembleCotesTriangle {
     95 private:
     96 	static const char rotationTable[5];
     97 public:
     98 	CoteTriangle(int x) : EnsembleCotesTriangle((char)(1 << (((x % 3) + 3) % 3))) {}
     99 	operator int () const {
    100 		return rotationTable[(int)v];
    101 	}
    102 	friend CoteTriangle operator+ (const CoteTriangle c, const int n) {
    103 		return CoteTriangle(rotationTable[(int)c.v] + n);
    104 	}
    105 	friend CoteTriangle operator- (const CoteTriangle c, const int n) {
    106 		return CoteTriangle(rotationTable[(int)c.v] - n);
    107 	}
    108 };
    109 
    110 const CoteTriangle LEFTSIDE = CoteTriangle(0);
    111 const CoteTriangle RIGHTSIDE = CoteTriangle(1);
    112 const CoteTriangle BASE = CoteTriangle(2);
    113 
    114 // Plus ou moins la même chose que CoteTriangle.
    115 class SommetTriangle {
    116 private:
    117 	char v;
    118 	static const char rotationTable[5];
    119 public:
    120 	SommetTriangle(int x) : v((char)(1 << (((x % 3) + 3) % 3))) {}
    121 	operator int () const {
    122 		return (int)rotationTable[(int)v];
    123 	}
    124 	friend SommetTriangle operator+ (const SommetTriangle c, const int n) {
    125 		return SommetTriangle(rotationTable[(int)c.v] + n);
    126 	}
    127 	friend SommetTriangle operator- (const SommetTriangle c, const int n) {
    128 		return SommetTriangle(rotationTable[(int)c.v] - n);
    129 	}
    130 	friend bool operator== (const SommetTriangle c1, const SommetTriangle c2) {
    131 		return (c1.v == c2.v);
    132 	}
    133 	friend bool operator!= (const SommetTriangle c1, const SommetTriangle c2) {
    134 		return (c1.v != c2.v);
    135 	}
    136 };
    137 
    138 const SommetTriangle LEFT = SommetTriangle(0);
    139 const SommetTriangle TOP = SommetTriangle(1);
    140 const SommetTriangle RIGHT = SommetTriangle(2);
    141 
    142 #endif