| Polaris: StmtRefRanges.cc Source File | ||
|
Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members
StmtRefRanges.ccGo to the documentation of this file.00001 /// 00002 /// 00003 /// \file StmtRefRanges.cc 00004 /// 00005 #include <limits.h> 00006 00007 #include "../Expression/Expression.h" 00008 #include "../Collection/Iterator.h" 00009 #include "../Collection/Mutator.h" 00010 #include "../Collection/KeyIterator.h" 00011 #include "../Collection/RefSet.h" 00012 #include "../Collection/List.h" 00013 #include "../Collection/RefList.h" 00014 #include "../utilities/expression_util.h" 00015 00016 #include "StmtRefRanges.h" 00017 #include "ExprSet.h" 00018 #include "RangeExpr.h" 00019 #include "range_util.h" 00020 00021 00022 /// StmtRefRanges 00023 00024 StmtRefRanges::StmtRefRanges(const Symtab &symtab, ExprSet &range_set) 00025 : BaseStmtRanges(symtab) 00026 { 00027 _range_set_ref = &range_set; 00028 } 00029 00030 StmtRefRanges::StmtRefRanges(const StmtRefRanges &other) 00031 : BaseStmtRanges(other) 00032 { 00033 _ranges = other._ranges; 00034 _range_set_ref = other._range_set_ref; 00035 } 00036 00037 00038 /// ~StmtRefRanges 00039 00040 StmtRefRanges::~StmtRefRanges() 00041 { 00042 /// ... nothing to do 00043 } 00044 00045 00046 00047 /// range_vars 00048 /// Return the set of variables that have ranges. 00049 00050 RefSet<Symbol> * 00051 StmtRefRanges::range_vars() const 00052 { 00053 RefSet<Symbol> *vars = new RefSet<Symbol>; 00054 KeyIterator<Symbol, Expression> iter = _ranges; 00055 00056 for ( ; iter.valid(); ++iter) 00057 vars->ins(iter.current_key()); 00058 00059 return vars; 00060 } 00061 00062 00063 /// set_range 00064 00065 void 00066 StmtRefRanges::set_range(const Symbol &var, Expression *range) 00067 { 00068 _flush_sign_caches(); 00069 00070 if (range && range->op() != OMEGA_OP) { 00071 const Expression &range_ref = _range_set_ref->ins(range); 00072 _ranges.ins(var, range_ref); 00073 } 00074 else { 00075 delete range; 00076 del_range(var); 00077 } 00078 } 00079 00080 00081 /// del_range 00082 00083 void 00084 StmtRefRanges::del_range(const Symbol &var) 00085 { 00086 Expression *var_info = _ranges.find_ref(var); 00087 00088 if (var_info) { 00089 _flush_sign_caches(); 00090 _ranges.del(CASTAWAY(Symbol &) var); 00091 } 00092 } 00093 00094 00095 /// get_range_ref_c 00096 00097 const Expression * 00098 StmtRefRanges::_get_range_ref_c(const Symbol &var) const 00099 { 00100 return _ranges.find_ref(var); 00101 } 00102 00103 00104 /// operator = 00105 00106 StmtRefRanges & 00107 StmtRefRanges::operator = (const StmtRefRanges &other) 00108 { 00109 if (this != &other) { 00110 BaseStmtRanges::operator=(other); 00111 _ranges = other._ranges; 00112 _range_set_ref = other._range_set_ref; 00113 } 00114 00115 return *this; 00116 } 00117 00118 00119 /// entries 00120 00121 int 00122 StmtRefRanges::entries() const 00123 { 00124 return _ranges.entries(); 00125 } 00126 00127 00128 /// clear 00129 00130 void 00131 StmtRefRanges::clear() 00132 { 00133 _ranges.clear(); 00134 } 00135 00136 00137 /// listable_clone 00138 00139 Listable * 00140 StmtRefRanges::listable_clone(void) const 00141 { 00142 return new StmtRefRanges(*this); 00143 } 00144 00145 00146 /// structures_OK 00147 00148 int 00149 StmtRefRanges::structures_OK() const 00150 { 00151 if (! _range_set_ref) { 00152 cout << "StmtRefRanges::structures_OK(): field _range_set_ref is NULL.\n"; 00153 return 0; 00154 } 00155 00156 return (BaseStmtRanges::structures_OK() 00157 && _ranges.structures_OK() 00158 && _range_set_ref->structures_OK()); 00159 } 00160 00161 |
||
|