00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef PPL_Constraint_System_defs_hh
00025 #define PPL_Constraint_System_defs_hh 1
00026
00027 #include "Constraint_System.types.hh"
00028 #include "Linear_Expression.types.hh"
00029 #include "Linear_System.defs.hh"
00030 #include "Generator.types.hh"
00031 #include "Polyhedron.types.hh"
00032 #include "Constraint.types.hh"
00033 #include "Congruence_System.types.hh"
00034 #include <iterator>
00035 #include <iosfwd>
00036
00037 namespace Parma_Polyhedra_Library {
00038
00039 namespace IO_Operators {
00040
00042
00047 std::ostream& operator<<(std::ostream& s, const Constraint_System& cs);
00048
00049 }
00050
00051
00053 bool operator==(const Polyhedron& x, const Polyhedron& y);
00054
00055 }
00056
00057
00058 namespace std {
00059
00061
00062 void swap(Parma_Polyhedra_Library::Constraint_System& x,
00063 Parma_Polyhedra_Library::Constraint_System& y);
00064
00065 }
00066
00068
00128 class Parma_Polyhedra_Library::Constraint_System : private Linear_System {
00129 public:
00131 Constraint_System();
00132
00134 explicit Constraint_System(const Constraint& c);
00135
00137 explicit Constraint_System(const Congruence_System& cgs);
00138
00140 Constraint_System(const Constraint_System& cs);
00141
00143 ~Constraint_System();
00144
00146 Constraint_System& operator=(const Constraint_System& y);
00147
00149 static dimension_type max_space_dimension();
00150
00152 dimension_type space_dimension() const;
00153
00158 bool has_equalities() const;
00159
00164 bool has_strict_inequalities() const;
00165
00170 void clear();
00171
00176 void insert(const Constraint& c);
00177
00179 static void initialize();
00180
00182 static void finalize();
00183
00187 static const Constraint_System& zero_dim_empty();
00188
00190
00204 class const_iterator
00205 : public std::iterator<std::forward_iterator_tag,
00206 Constraint,
00207 ptrdiff_t,
00208 const Constraint*,
00209 const Constraint&> {
00210 public:
00212 const_iterator();
00213
00215 const_iterator(const const_iterator& y);
00216
00218 ~const_iterator();
00219
00221 const_iterator& operator=(const const_iterator& y);
00222
00224 const Constraint& operator*() const;
00225
00227 const Constraint* operator->() const;
00228
00230 const_iterator& operator++();
00231
00233 const_iterator operator++(int);
00234
00239 bool operator==(const const_iterator& y) const;
00240
00245 bool operator!=(const const_iterator& y) const;
00246
00247 private:
00248 friend class Constraint_System;
00249
00251 Linear_System::const_iterator i;
00252
00254 const Linear_System* csp;
00255
00257 const_iterator(const Linear_System::const_iterator& iter,
00258 const Constraint_System& csys);
00259
00261 void skip_forward();
00262 };
00263
00265 bool empty() const;
00266
00272 const_iterator begin() const;
00273
00275 const_iterator end() const;
00276
00278 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
00279
00283 #endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
00284 bool OK() const;
00285
00286 PPL_OUTPUT_DECLARATIONS
00287
00293 bool ascii_load(std::istream& s);
00294
00296 memory_size_type total_memory_in_bytes() const;
00297
00299 memory_size_type external_memory_in_bytes() const;
00300
00302 void swap(Constraint_System& y);
00303
00304 private:
00309 static const Constraint_System* zero_dim_empty_p;
00310
00311 friend class const_iterator;
00312 friend class Parma_Polyhedra_Library::Polyhedron;
00313
00314 friend bool operator==(const Polyhedron& x, const Polyhedron& y);
00315
00317 explicit Constraint_System(Topology topol);
00318
00324 Constraint_System(Topology topol,
00325 dimension_type n_rows, dimension_type n_columns);
00326
00335 bool adjust_topology_and_space_dimension(Topology topol,
00336 dimension_type num_dimensions);
00337
00339 Constraint& operator[](dimension_type k);
00340
00342 const Constraint& operator[](dimension_type k) const;
00343
00345 bool satisfies_all_constraints(const Generator& g) const;
00346
00348
00382 void affine_preimage(dimension_type v,
00383 const Linear_Expression& expr,
00384 Coefficient_traits::const_reference denominator);
00385
00387 dimension_type num_equalities() const;
00388
00390 dimension_type num_inequalities() const;
00391
00398 void simplify();
00399
00405 void insert_pending(const Constraint& c);
00406
00408 void add_low_level_constraints();
00409 };
00410
00411
00412
00413 #endif // !defined(PPL_Constraint_System_defs_hh)