git-svn-id: svn://anubis/fart/branches/scene-file-scripting@329 7f9b0f55-74a9-4bce-be96-3c2cd072584d
74 lines
1.8 KiB
C++
74 lines
1.8 KiB
C++
|
|
#ifndef SCOPE_H
|
|
#define SCOPE_H
|
|
|
|
#include <list>
|
|
#include <map>
|
|
#include <string>
|
|
|
|
class Scope
|
|
{
|
|
public:
|
|
Scope() { push(); }
|
|
bool contains(const std::string & key)
|
|
{
|
|
for (m_list_type::const_reverse_iterator it = m_list.rbegin();
|
|
it != m_list.rend();
|
|
it++)
|
|
{
|
|
if (it->find(key) != it->end())
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
double get(const std::string & key)
|
|
{
|
|
for (m_list_type::reverse_iterator it = m_list.rbegin();
|
|
it != m_list.rend();
|
|
it++)
|
|
{
|
|
if (it->find(key) != it->end())
|
|
{
|
|
return (*it)[key];
|
|
}
|
|
}
|
|
return 0.0;
|
|
}
|
|
void putLocal(const std::string & key, double val)
|
|
{
|
|
(*m_list.rbegin())[key] = val;
|
|
}
|
|
void putGlobal(const std::string & key, double val)
|
|
{
|
|
for (m_list_type::reverse_iterator it = m_list.rbegin();
|
|
it != m_list.rend();
|
|
it++)
|
|
{
|
|
if (it->find(key) != it->end())
|
|
{
|
|
(*it)[key] = val;
|
|
return;
|
|
}
|
|
}
|
|
putLocal(key, val);
|
|
}
|
|
void push()
|
|
{
|
|
m_list.push_back(std::map< std::string, double >());
|
|
}
|
|
void pop()
|
|
{
|
|
if (m_list.size() > 1)
|
|
{
|
|
m_list.pop_back();
|
|
}
|
|
}
|
|
protected:
|
|
typedef std::list< std::map< std::string, double > > m_list_type;
|
|
m_list_type m_list;
|
|
};
|
|
|
|
#endif
|