Faster movie loading and saving
[lsnes.git] / settings.cpp
blob520b4fc36822093984675aab84d6f958d0be09a1
1 #include "settings.hpp"
2 #include "misc.hpp"
3 #include <map>
4 #include <sstream>
5 #include "misc.hpp"
6 #include <iostream>
8 namespace
10 std::map<std::string, setting*>* settings;
13 setting::setting(const std::string& name) throw(std::bad_alloc)
15 if(!settings)
16 settings = new std::map<std::string, setting*>();
17 (*settings)[settingname = name] = this;
20 setting::~setting() throw()
22 if(!settings)
23 return;
24 settings->erase(settingname);
27 void setting_set(const std::string& _setting, const std::string& value) throw(std::bad_alloc, std::runtime_error)
29 if(!settings || !settings->count(_setting))
30 throw std::runtime_error("No such setting '" + _setting + "'");
31 try {
32 (*settings)[_setting]->set(value);
33 } catch(std::bad_alloc& e) {
34 throw;
35 } catch(std::exception& e) {
36 throw std::runtime_error("Can't set setting '" + _setting + "': " + e.what());
40 void setting_blank(const std::string& _setting) throw(std::bad_alloc, std::runtime_error)
42 if(!settings || !settings->count(_setting))
43 throw std::runtime_error("No such setting '" + _setting + "'");
44 try {
45 (*settings)[_setting]->blank();
46 } catch(std::bad_alloc& e) {
47 throw;
48 } catch(std::exception& e) {
49 throw std::runtime_error("Can't blank setting '" + _setting + "': " + e.what());
53 std::string setting_get(const std::string& _setting) throw(std::bad_alloc, std::runtime_error)
55 if(!settings || !settings->count(_setting))
56 throw std::runtime_error("No such setting '" + _setting + "'");
57 return (*settings)[_setting]->get();
60 bool setting_isblank(const std::string& _setting) throw(std::bad_alloc, std::runtime_error)
62 if(!settings || !settings->count(_setting))
63 throw std::runtime_error("No such setting '" + _setting + "'");
64 return !((*settings)[_setting]->is_set());
67 void setting_print_all(window* win) throw(std::bad_alloc)
69 if(!settings)
70 return;
71 for(auto i = settings->begin(); i != settings->end(); i++) {
72 if(!i->second->is_set())
73 out(win) << i->first << ": (unset)" << std::endl;
74 else
75 out(win) << i->first << ": " << i->second->get() << std::endl;
79 numeric_setting::numeric_setting(const std::string& sname, int32_t minv, int32_t maxv, int32_t dflt)
80 throw(std::bad_alloc)
81 : setting(sname)
83 minimum = minv;
84 maximum = maxv;
85 value = dflt;
88 void numeric_setting::blank() throw(std::bad_alloc, std::runtime_error)
90 throw std::runtime_error("This setting can't be blanked");
93 bool numeric_setting::is_set() throw()
95 return true;
98 void numeric_setting::set(const std::string& _value) throw(std::bad_alloc, std::runtime_error)
100 int32_t v = parse_value<int32_t>(_value);
101 if(v < minimum || v > maximum) {
102 std::ostringstream x;
103 x << "Value out of range (" << minimum << " - " << maximum << ")";
104 throw std::runtime_error(x.str());
106 value = v;
109 std::string numeric_setting::get() throw(std::bad_alloc)
111 std::ostringstream x;
112 x << value;
113 return x.str();
116 numeric_setting::operator int32_t() throw()
118 return value;