1 ////////////////////////////////////////////////////////////////////////////////
2 //
3 // TriangFlips.hh
4 //
5 //    produced: 27/05/98 jr
6 // last change: 18/06/98 jr
7 //
8 ////////////////////////////////////////////////////////////////////////////////
9 #ifndef TRIANGFLIPS_HH
10 #define TRIANGFLIPS_HH
11 
12 #include "Pair.hh"
13 #include "HashSet.hh"
14 #include "SimplicialComplex.hh"
15 
16 #include "CommandlineOptions.hh"
17 
18 #include "Chirotope.hh"
19 #include "Circuits.hh"
20 #include "Flip.hh"
21 #include "MarkedFlips.hh"
22 #include "TriangNode.hh"
23 #include "Symmetry.hh"
24 
25 class TriangFlips {
26 private:
27   parameter_type   _no;
28   parameter_type   _rank;
29   MarkedFlips      _flips;
30 public:
31   // constructors:
32   inline TriangFlips();
33   inline TriangFlips(const TriangFlips&);
34   inline TriangFlips(const Chirotope&,
35 		     const TriangNode&,
36 		     const SymmetryGroup&,
37 		     const bool = false);
38   inline TriangFlips(const Chirotope&,
39 		     const TriangNode&,
40 		     const TriangFlips&,
41 		     const TriangNode&,
42 		     const Flip&,
43 		     const SymmetryGroup&,
44 		     const SymmetryGroup&,
45 		     const bool = false);
46   // destructor:
47   inline ~TriangFlips();
48   // assignment:
49   inline TriangFlips& operator=(const TriangFlips& tf);
50   // accessors:
no() const51   inline const parameter_type no()        const { return _no; }
rank() const52   inline const parameter_type rank()      const { return _rank; }
flips() const53   inline const MarkedFlips&   flips()     const { return _flips; }
54   // modifiers:
55   inline void mark_flip       (const FlipRep&);
56   inline void mark_all_flips  ();
57   // internal algorithms:
58   void _remove_destroyed_flips(const TriangNode& tn,
59 			       const Flip&,
60 			       const SymmetryGroup&);
61   void _add_new_flips         (const Chirotope& chiro,
62 			       const TriangNode& tn,
63 			       const SimplicialComplex&,
64 			       const SymmetryGroup&,
65 			       const SymmetryGroup&,
66 			       const bool = false,
67 			       const bool = false);
68   // stream input/output:
69   inline std::ostream& write  (std::ostream&) const;
70   inline std::istream& read   (std::istream&);
71   inline friend std::ostream& operator<<(std::ostream&, const TriangFlips&);
72   inline friend std::istream& operator<<(std::istream&, TriangFlips&);
73 };
74 
75 // constructors:
TriangFlips()76 inline TriangFlips::TriangFlips() : _no(0), _rank(0), _flips() {}
TriangFlips(const TriangFlips & tf)77 inline TriangFlips::TriangFlips(const TriangFlips& tf) :
78   _no(tf._no), _rank(tf._rank), _flips(tf._flips) {}
TriangFlips(const Chirotope & chiro,const TriangNode & tn,const SymmetryGroup & node_symmetries,const bool forbid_vertex_removal)79 inline TriangFlips::TriangFlips(const Chirotope& chiro,
80 				const TriangNode& tn,
81 				const SymmetryGroup& node_symmetries,
82 				const bool forbid_vertex_removal) :
83   _no(tn.no()), _rank(tn.rank()), _flips() {
84   _add_new_flips(chiro, tn, tn, SymmetryGroup(tn.no()), node_symmetries, forbid_vertex_removal);
85 }
TriangFlips(const Chirotope & chiro,const TriangNode & tn_before_flip,const TriangFlips & tf_before_flip,const TriangNode & tn_after_flip,const Flip & flip,const SymmetryGroup & symmetries,const SymmetryGroup & tn_after_symmetries,const bool forbid_vertex_removal)86 inline TriangFlips::TriangFlips(const Chirotope&     chiro,
87 				const TriangNode&    tn_before_flip,
88 				const TriangFlips&   tf_before_flip,
89 				const TriangNode&    tn_after_flip,
90 				const Flip&          flip,
91 				const SymmetryGroup& symmetries,
92 				const SymmetryGroup& tn_after_symmetries,
93 				const bool           forbid_vertex_removal) :
94   _no(tf_before_flip._no), _rank(tf_before_flip._rank),
95   _flips(tf_before_flip._flips) {
96   _remove_destroyed_flips(tn_before_flip, flip, symmetries);
97   _flips.unmark_all();
98   _add_new_flips(chiro,
99 		 tn_after_flip,
100 		 flip.second,
101 		 symmetries,
102 		 tn_after_symmetries,
103 		 forbid_vertex_removal);
104 }
105 
106 // destructor:
~TriangFlips()107 inline TriangFlips::~TriangFlips() {}
108 // assignment:
operator =(const TriangFlips & tf)109 inline TriangFlips& TriangFlips::operator=(const TriangFlips& tf) {
110   if (this == &tf) {
111     return *this;
112   }
113   _no        = tf._no;
114   _rank      = tf._rank;
115   _flips     = tf._flips;
116   return *this;
117 }
118 
119 // modifiers:
mark_flip(const FlipRep & fliprep)120 inline void TriangFlips::mark_flip(const FlipRep& fliprep) {
121   _flips.mark(fliprep);
122 }
mark_all_flips()123 inline void TriangFlips::mark_all_flips() {
124   _flips.mark_all();
125 }
126 
127 // stream input/output:
write(std::ostream & ost) const128 inline std::ostream& TriangFlips::write(std::ostream& ost) const {
129 #ifndef STL_FLIPS
130   ost << '[' << _no << ',' << _rank << ":" << _flips << ']';
131 #else
132 #endif
133   return ost;
134 }
135 
read(std::istream & ist)136 inline std::istream& TriangFlips::read(std::istream& ist) {
137 #ifndef STL_FLIPS
138   char c;
139 
140   ist >> std::ws >> c
141       >> std::ws >> _no
142       >> std::ws >> c
143       >> std::ws >> _rank
144       >> std::ws >> c
145       >> std::ws >> _flips
146       >> std::ws >> c;
147 #else
148 #endif
149   return ist;
150 }
151 
operator <<(std::ostream & ost,const TriangFlips & tf)152 inline std::ostream& operator<<(std::ostream& ost, const TriangFlips& tf) {
153   return tf.write(ost);
154 }
155 
operator >>(std::istream & ist,TriangFlips & tf)156 inline std::istream& operator>>(std::istream& ist, TriangFlips& tf) {
157   return tf.read(ist);
158 }
159 #endif
160 
161 // eof TriangFlips.hh
162