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