1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
|
#ifndef __TAddress__
#define __TAddress__
#include "TPrintable.hh"
#include "TType.hh"
#include "TIndex.hh"
#include <list>
struct TAddress : public TPrintable {
virtual ~TAddress() {}
virtual TType* getType() = 0;
virtual TAddress* rewriteAddress(list<TAddress*>& address_list) = 0;
virtual TAddress* linearizeAddress(list<TAddress*>& address_list) = 0;
};
#ifdef ALT_VECTOR
struct TVectorAddress : public TAddress
{
TType* fType;
int fSize;
string fName;
TVectorAddress(const string& name, TType* type, int size):fName(name), fType(type), fSize(size){}
virtual ~TVectorAddress() {}
virtual void generate(ostream* dst, int n);
virtual void generateCPP(ostream* dst, int n);
virtual void generateCPPNoAlias(ostream* dst, int n);
virtual TType* getType();
virtual TAddress* rewriteAddress(list<TAddress*>& address_list);
virtual TAddress* linearizeAddress(list<TAddress*>& address_list);
};
#else
struct TNamedAddress : public TAddress
{
TType* fType;
string fName;
TNamedAddress(const string& name, TType* type):fName(name), fType(type)
{
assert(dynamic_cast<TVectorType*>(type));
}
virtual ~TNamedAddress() {}
virtual void generate(ostream* dst, int n);
virtual void generateCPP(ostream* dst, int n);
virtual void generateCPPNoAlias(ostream* dst, int n);
virtual TType* getType();
virtual TAddress* rewriteAddress(list<TAddress*>& address_list);
virtual TAddress* linearizeAddress(list<TAddress*>& address_list);
};
#endif
struct TCastAddress : public TAddress
{
TAddress* fAddress;
TType* fType;
TCastAddress(TAddress* address, TType* type):fAddress(address), fType(type)
{}
virtual ~TCastAddress() {}
virtual void generate(ostream* dst, int n);
virtual void generateCPP(ostream* dst, int n);
virtual void generateCPPNoAlias(ostream* dst, int n);
virtual TType* getType();
virtual TAddress* rewriteAddress(list<TAddress*>& address_list);
virtual TAddress* linearizeAddress(list<TAddress*>& address_list);
};
struct TIndexAddress : public TAddress
{
TAddress* fAddress;
TIndex* fIndex;
TIndexAddress(TAddress* address, TIndex* index):fAddress(address), fIndex(index){}
virtual ~TIndexAddress() {}
virtual void generate(ostream* dst, int n);
virtual void generateCPP(ostream* dst, int n);
virtual void generateCPPNoAlias(ostream* dst, int n);
virtual TType* getType();
virtual TAddress* rewriteAddress(list<TAddress*>& address_list);
virtual TAddress* linearizeAddress(list<TAddress*>& address_list);
};
#endif
|