Storage类用于存储一些变量与常量的值:
Storage与SymbolTable是依赖关系 只是用到了它
Storage类实现:
storage.h:
#ifndef _STORAGE_H_
#define _STORAGE_H_
#include <vector>
class SymbolTable;
class Storage
{
public:
Storage(SymbolTable& tbl);
void Clear();
bool IsInit(unsigned int id) const;
void AddConstants(SymbolTable& tbl);
double GetValue(unsigned int id) const;
void SetValue(unsigned int id, double val);
void AddValue(unsigned int id, double val);
private:
std::vector<double> cells_;
std::vector<bool> inits_;
};
#endif // _STORAGE_H_
storage.cpp:
#include "Storage.h"
#include "SymbolTable.h"
#include <cmath>
#include <cassert>
Storage::Storage(SymbolTable& tbl)
{
AddConstants(tbl);
}
void Storage::Clear()
{
cells_.clear();
inits_.clear();
}
bool Storage::IsInit(unsigned int id) const
{
return id < cells_.size() && inits_[id];
}
void Storage::AddConstants(SymbolTable& tbl)
{
unsigned int id = tbl.Add("e");
AddValue(id, exp(1.0));
id = tbl.Add("pi");
AddValue(id, 2.0*acos(0.0)); //反余弦 pi = 2*acos(0)
}
double Storage::GetValue(unsigned int id) const
{
assert (id < cells_.size());
return cells_[id];
}
void Storage::SetValue(unsigned int id, double val)
{
assert(id <= cells_.size());
if (id < cells_.size())
{
cells_[id] = val;
inits_[id] = true;
}
else if (id == cells_.size())
{
AddValue(id, val);
}
}
void Storage::AddValue(unsigned int id, double val)
{
cells_.resize(id+1);
inits_.resize(id+1);
cells_[id] = val;
inits_[id] = true;
}