summaryrefslogtreecommitdiff
path: root/project2/json
diff options
context:
space:
mode:
Diffstat (limited to 'project2/json')
-rw-r--r--project2/json/presenter.cpp31
1 files changed, 23 insertions, 8 deletions
diff --git a/project2/json/presenter.cpp b/project2/json/presenter.cpp
index f50c322..00ed334 100644
--- a/project2/json/presenter.cpp
+++ b/project2/json/presenter.cpp
@@ -13,36 +13,51 @@ class JsonPresenter : public MultiRowSetPresenter, public ContentPresenter, publ
SourceOf<json::Object>(s),
SourceOf<WritableContent>(s) {
curRowSet.push(&object);
+ vaStack.push(&JsonPresenter::addValueToObject);
}
+ typedef void (JsonPresenter::*ValueAdder)(const Glib::ustring &, const VariableType &) const;
+ typedef std::stack<ValueAdder> ValueAdderStack;
+ mutable ValueAdderStack vaStack;
void addNamedValue(const Glib::ustring & name, const VariableType & value) const {
+ (this->*vaStack.top())(name, value);
+ }
+ void addValueToObject(const Glib::ustring & name, const VariableType & value) const {
(*curRowSet.top())[name] = json::ValuePtr(new json::Value(boost::apply_visitor(Project2ToJson(), value)));
}
- void addNewRow(const Glib::ustring & name) const {
- if (!curRowArray.top()) {
- json::Value * v = new json::Value(json::Array());
- curRowArray.top() = boost::get<json::Array>(v);
- (*curRowSet.top())[name] = json::ValuePtr(v);
- }
+ void addValueToArray(const Glib::ustring &, const VariableType & value) const {
+ curRowArray.top()->push_back(json::ValuePtr(new json::Value(boost::apply_visitor(Project2ToJson(), value))));
+ }
+ void addNewRow(const Glib::ustring &) const {
json::Value * v = new json::Value(json::Object());
curRowSet.push(boost::get<json::Object>(v));
curRowArray.top()->push_back(json::ValuePtr(v));
+ vaStack.push(&JsonPresenter::addValueToObject);
}
void finishRow() const {
+ vaStack.pop();
curRowSet.pop();
}
void addNewRowSet(const Glib::ustring & name) const {
json::Value * v = new json::Value(json::Object());
(*curRowSet.top())[name] = json::ValuePtr(v);
curRowSet.push(boost::get<json::Object>(v));
- curRowArray.push(NULL);
}
void addNewRowSet(const Glib::ustring & name, const Glib::ustring & ns) const {
addNewRowSet(ns + ":" + name);
}
void finishRowSet() const {
- curRowArray.pop();
curRowSet.pop();
}
+ void addNewArray(const Glib::ustring & name, bool) const {
+ json::Value * v = new json::Value(json::Array());
+ curRowArray.push(boost::get<json::Array>(v));
+ (*curRowSet.top())[name] = json::ValuePtr(v);
+ vaStack.push(&JsonPresenter::addValueToArray);
+ }
+ void finishArray(bool) const {
+ vaStack.pop();
+ curRowArray.pop();
+ }
operator const json::Object *() const {
return &object;
}