Polaris: StmtRefRanges.cc Source File

StmtRefRanges.cc

Go 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 
 © 1995-2005 University of Illinois, Urbana-Champaign. All rights reserved.  Fri Mar 25 23:06:13 2005