00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef __PEEKABOT_SCOPED_MAP_HH
00019 #define __PEEKABOT_SCOPED_MAP_HH
00020
00021 #include <stdexcept>
00022 #include <map>
00023 #include <stack>
00024 #include <boost/any.hpp>
00025
00026 namespace peekabot
00027 {
00042 class ScopedMap
00043 {
00044 public:
00055 template<class T> T & get_variable(const std::string & variable_name)
00056 throw(boost::bad_any_cast, std::runtime_error)
00057 {
00058
00059 if(m_any_map.find(variable_name) == m_any_map.end())
00060 {
00061 std::string error = "ScopedMap: variable \"";
00062 error += variable_name + "\" not found!";
00063 throw(std::runtime_error(error));
00064 }
00065
00066
00067 boost::any & any_stack = m_any_map[variable_name];
00068
00069 std::stack<T> & value_stack = boost::any_cast<std::stack<T>&>(any_stack);
00070
00071 return value_stack.top();
00072 }
00073
00082 template<class T> void push_variable(const std::string & variable_name,
00083 const T& value)
00084 throw(boost::bad_any_cast)
00085 {
00086
00087 if(m_any_map.find(variable_name) != m_any_map.end())
00088 {
00089 boost::any & any_stack = m_any_map[variable_name];
00090 std::stack<T> & scope_stack = boost::any_cast<std::stack<T>&>(any_stack);
00091
00092 scope_stack.push(value);
00093 }
00094 else
00095 {
00096 std::stack<T> s;
00097 s.push(value);
00098 m_any_map[variable_name] = s;
00099
00100 }
00101
00102 }
00103
00114 template<class T> void pop_variable(const std::string & variable_name)
00115 throw(boost::bad_any_cast, std::runtime_error)
00116 {
00117
00118 if(m_any_map.find(variable_name) == m_any_map.end())
00119 {
00120 std::string error = "ScopedMap: variable \"";
00121 error += variable_name + "\" not found!";
00122 throw(std::runtime_error(error));
00123 }
00124
00125
00126 boost::any & any_stack = m_any_map[variable_name];
00127
00128 std::stack<T> & value_stack = boost::any_cast<std::stack<T>&>(any_stack);
00129
00130 value_stack.pop();
00131 }
00132
00133
00137 template<class T> bool exists(const std::string & variable_name)
00138 {
00139
00140 if(m_any_map.find(variable_name) == m_any_map.end())
00141 return false;
00142
00143
00144 try
00145 {
00146
00147 boost::any & any_stack = m_any_map[variable_name];
00148
00149 std::stack<T> & value_stack = boost::any_cast<std::stack<T>&>(any_stack);
00150
00151
00152
00153 if(value_stack.empty())
00154 return false;
00155 else
00156 return true;
00157 }
00158 catch(boost::bad_any_cast & error)
00159 {
00160
00161
00162 return false;
00163 }
00164 }
00165
00166
00167 private:
00168 std::map<std::string, boost::any> m_any_map;
00169 };
00170
00171 }
00172
00173 #endif //__PEEKABOT_SCOPED_MAP_HH