FLOPC++
MP_index.hpp
Go to the documentation of this file.
1 // ******************** FlopCpp **********************************************
2 // File: MP_index.hpp
3 // $Id$
4 // Author: Tim Helge Hultberg (thh@mat.ua.pt)
5 // Copyright (C) 2003 Tim Helge Hultberg
6 // All Rights Reserved.
7 // ****************************************************************************
8 
9 #ifndef _MP_index_hpp_
10 #define _MP_index_hpp_
11 
12 #include "MP_utilities.hpp"
13 #include "MP_constant.hpp"
14 
15 namespace flopc {
16 
17  class MP_index;
18  class MP_domain;
19  class MP_set;
20 
26  class MP_index_base {
27  friend class Handle<MP_index_base*>;
28  friend class MP_index_exp;
29  public:
30  virtual int evaluate() const = 0;
31  virtual MP_index* getIndex() const = 0;
32  virtual MP_domain getDomain(MP_set* s) const = 0;
33 // virtual void display()const;
34  protected:
35  MP_index_base() : count(0) {}
36  virtual ~MP_index_base() {}
37  private:
38  int count;
39  };
40 
53  class MP_index : public MP_index_base {
54  friend class MP_domain_set;
55  template<int nbr> friend class MP_domain_subset;
56  public:
58  MP_index() : index(0), instantiated(false) {}
59  int evaluate() const {
60  return index;
61  }
63  static MP_index &getEmpty();
65  static MP_index &Any();
66  private:
69  bool isInstantiated() const {
70  return instantiated;
71  }
75  void assign(int i) {
76  index = i;
77  }
80  void unInstantiate() {
81  instantiated = false;
82  }
85  void instantiate() {
86  instantiated = true;
87  }
91  MP_index* getIndex() const {
92  return const_cast<MP_index*>(this);
93  }
95  virtual MP_domain getDomain(MP_set* s) const;
96 
97  static MP_index& Empty;
99  int index;
101  };
102 
103 
108 
112  MP_index_exp operator-(MP_index& i,const int& j);
116  MP_index_exp operator+(MP_index& i,const int& j);
125 
126  class SUBSETREF;
127 
141  class MP_index_exp : public Handle<MP_index_base*> {
142  public:
146  MP_index_exp(int i=0);
148  MP_index_exp(const Constant& c);
154  MP_index_exp(const SUBSETREF& d);
156  MP_index_exp(const MP_index_exp& other);
157  virtual ~MP_index_exp() {}
159  static const MP_index_exp &getEmpty();
160  private:
162  };
163 
170  class MP_index_mult : public MP_index_base {
171  friend MP_index_exp operator*(MP_index& i,const Constant& j);
172  private:
173  MP_index_mult(MP_index& i, const Constant& j) : left(i), right(j) {}
174 
175  int evaluate() const {
176  return left->evaluate()*int(right->evaluate());
177  }
178  MP_index* getIndex() const {
179  return left->getIndex();
180  }
181  virtual MP_domain getDomain(MP_set* s) const;
184  };
185 
192  class MP_index_sum : public MP_index_base {
193  friend MP_index_exp operator+(MP_index& i,const Constant& j);
194  friend MP_index_exp operator+(MP_index& i,const int& j);
195  private:
196  MP_index_sum(MP_index& i, const Constant& j) : left(i), right(j) {}
197 
198  int evaluate() const {
199  return left->evaluate()+int(right->evaluate());
200  }
201  MP_index* getIndex() const {
202  return left->getIndex();
203  }
204  virtual MP_domain getDomain(MP_set* s) const;
207  };
208 
215  class MP_index_dif : public MP_index_base {
216  friend MP_index_exp operator-(MP_index& i,const Constant& j);
217  friend MP_index_exp operator-(MP_index& i,const int& j);
218  private:
219  MP_index_dif(MP_index& i, const Constant& j) : left(i), right(j) {}
220 
221  int evaluate() const {
222  return left->evaluate()-int(right->evaluate());
223  }
224  MP_index* getIndex() const {
225  return left->getIndex();
226  }
227  virtual MP_domain getDomain(MP_set* s) const;
230  };
231 
232 } // End of namespace flopc
233 #endif
MP_index_exp left
Definition: MP_index.hpp:182
virtual MP_domain getDomain(MP_set *s) const
Getter for domain over which this index is applied.
Definition: MP_index.cpp:89
int evaluate() const
Definition: MP_index.hpp:198
static MP_index & Empty
Definition: MP_index.hpp:97
Internal representation of an index expression.
Definition: MP_index.hpp:170
Internal representation of an index expression.
Definition: MP_index.hpp:192
virtual ~MP_index_base()
Definition: MP_index.hpp:36
MP_index * getIndex() const
Definition: MP_index.hpp:91
friend MP_index_exp operator*(MP_index &i, const Constant &j)
Definition: MP_index.cpp:79
virtual MP_index * getIndex() const =0
static MP_index & getEmpty()
returns a reference to the distinct "empty" index.
Definition: MP_index.cpp:20
virtual MP_domain getDomain(MP_set *s) const
Definition: MP_index.cpp:93
int evaluate() const
Definition: MP_index.hpp:175
static MP_index & Any_index
Definition: MP_index.hpp:98
int evaluate() const
Definition: MP_index.hpp:221
Representation of an index.This is one of the main public interface classes. It is used to iterate th...
Definition: MP_index.hpp:53
Internal representation of a "set".
Definition: MP_set.hpp:269
MP_index_sum(MP_index &i, const Constant &j)
Definition: MP_index.hpp:196
MP_index_exp left
Definition: MP_index.hpp:205
int evaluate() const
Definition: MP_index.hpp:59
static MP_index & Any()
returns a reference to the distinct "wildcard" index.
Definition: MP_index.cpp:23
Utility for doing reference counted pointers.
Constant operator+(const Constant &a, const Constant &b)
Returns the sum of two constants.This is used in the formation of an expression.
Internal representation of an index expression.
Definition: MP_index.hpp:215
Representation of an expression involving an index.This is one of the main public interface classes...
Definition: MP_index.hpp:141
MP_index_exp left
Definition: MP_index.hpp:228
Range over which some other constuct is defined.This is one of the main public interface classes...
Definition: MP_domain.hpp:111
virtual MP_domain getDomain(MP_set *s) const
Definition: MP_index.cpp:97
MP_index * getIndex() const
Definition: MP_index.hpp:201
static const MP_index_exp & getEmpty()
Return the unique empty expression.
Definition: MP_index.cpp:26
MP_index * getIndex() const
Definition: MP_index.hpp:224
Range over which some other constuct is defined. Uses subsetting.This is one of the main public inter...
Definition: MP_domain.hpp:135
bool isInstantiated() const
Definition: MP_index.hpp:69
Constant operator-(const Constant &a, const Constant &b)
Returns the difference of two constants.This is used in the formation of an expression.
All flopc++ code is contained within the flopc namespace.
Definition: flopc.cpp:11
virtual ~MP_index_exp()
Definition: MP_index.hpp:157
MP_index_mult(MP_index &i, const Constant &j)
Definition: MP_index.hpp:173
Range over which some other constuct is defined.This is one of the main public interface classes...
Definition: MP_domain.hpp:61
MP_index_dif(MP_index &i, const Constant &j)
Definition: MP_index.hpp:219
void unInstantiate()
Definition: MP_index.hpp:80
MP_index_exp(MP_index_base *r)
For internal use.
Definition: MP_index.hpp:144
Representation of a set for indexing into some other construct.This is one of the main public interfa...
Definition: MP_set.hpp:79
Reference counted class for all "constant" types of data.
Definition: MP_constant.hpp:49
Constant operator*(const Constant &a, const Constant &b)
Returns the product of two constants.This is used in the formation of an expression.
virtual MP_domain getDomain(MP_set *s) const
Definition: MP_index.cpp:101
virtual MP_domain getDomain(MP_set *s) const =0
virtual int evaluate() const =0
Internal representation of a index.
Definition: MP_index.hpp:26
MP_index * getIndex() const
Definition: MP_index.hpp:178
friend MP_index_exp operator-(MP_index &i, const Constant &j)
Definition: MP_index.cpp:71
static MP_index_exp Empty
Definition: MP_index.hpp:161
friend MP_index_exp operator+(MP_index &i, const Constant &j)
Definition: MP_index.cpp:63
void instantiate()
Definition: MP_index.hpp:85
MP_index()
Default constructor.
Definition: MP_index.hpp:58
void assign(int i)
Definition: MP_index.hpp:75