summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--project2/Jamfile.jam2
-rw-r--r--project2/iterate.cpp1
-rw-r--r--project2/rowSet.cpp21
-rw-r--r--project2/rowSet.h5
-rw-r--r--project2/rowUser.cpp10
-rw-r--r--project2/rowUser.h13
-rw-r--r--project2/rowView.cpp1
-rw-r--r--project2/variables-modconfig.cpp8
-rw-r--r--project2/variables-modlookup.cpp5
-rw-r--r--project2/variables-modparam.cpp20
-rw-r--r--project2/variables-modsession.cpp7
-rw-r--r--project2/variables-moduri.cpp20
-rw-r--r--project2/variables.cpp105
-rw-r--r--project2/variables.h13
-rw-r--r--project2/xslRows.cpp5
15 files changed, 65 insertions, 171 deletions
diff --git a/project2/Jamfile.jam b/project2/Jamfile.jam
index 035609b..5eb1c27 100644
--- a/project2/Jamfile.jam
+++ b/project2/Jamfile.jam
@@ -58,7 +58,7 @@ lib p2common :
iterate.cpp paramChecker.cpp presenter.cpp rawView.cpp logger.cpp if.cpp xmlScriptParser.cpp viewHost.cpp
sourceObject.cpp task.cpp variables.cpp variableConvert.cpp view.cpp xmlObjectLoader.cpp exceptions.cpp
sessionClearTask.cpp session.cpp sessionSetTask.cpp commonObjects.cpp xmlPresenter.cpp taskHost.cpp checkHost.cpp
- rowView.cpp rowSet.cpp rowUser.cpp rowProcessor.cpp config.cpp fileStrmVarWriter.cpp noOutputExecute.cpp
+ rowView.cpp rowSet.cpp rowProcessor.cpp config.cpp fileStrmVarWriter.cpp noOutputExecute.cpp
transform.cpp transformHtml.cpp transformText.cpp definedColumns.cpp structExceptHandling.cpp validDateCheck.cpp
variables-modconfig.cpp
variables-modlookup.cpp
diff --git a/project2/iterate.cpp b/project2/iterate.cpp
index 1f2b12f..795b356 100644
--- a/project2/iterate.cpp
+++ b/project2/iterate.cpp
@@ -29,7 +29,6 @@ void
Iterate::rowReady() const
{
executeChildren();
- source->rowChanged();
}
void
diff --git a/project2/rowSet.cpp b/project2/rowSet.cpp
index 1be3547..cfbb9cf 100644
--- a/project2/rowSet.cpp
+++ b/project2/rowSet.cpp
@@ -1,5 +1,4 @@
#include "rowSet.h"
-#include "rowUser.h"
#include "commonObjects.h"
#include "logger.h"
#include "variables.h"
@@ -19,18 +18,6 @@ RowSet::~RowSet()
}
void
-RowSet::use(const RowUser * r) const
-{
- rowUsers.insert(r);
-}
-
-void
-RowSet::finish(const RowUser * r) const
-{
- rowUsers.erase(r);
-}
-
-void
RowSet::beginRow(const RowSet * r)
{
stack.push_back(r);
@@ -46,14 +33,6 @@ RowSet::endRow(const RowSet * r)
stack.pop_back();
}
-void
-RowSet::rowChanged() const
-{
- BOOST_FOREACH(const RowUser * ru, rowUsers) {
- ru->rowChanged();
- }
-}
-
VariableType
RowSet::getRowNum() const
{
diff --git a/project2/rowSet.h b/project2/rowSet.h
index 52edd76..a907cd2 100644
--- a/project2/rowSet.h
+++ b/project2/rowSet.h
@@ -9,7 +9,6 @@
class RowProcessor;
class RowSet;
-class RowUser;
class VariableType;
typedef boost::intrusive_ptr<RowSet> RowSetPtr;
typedef boost::intrusive_ptr<const RowSet> ConstRowSetPtr;
@@ -35,21 +34,17 @@ class RowSet : public SourceObject {
virtual bool isNull(const Glib::ustring & id) const = 0;
VariableType getRowNum() const;
virtual void execute(const RowProcessor *) const = 0;
- void use(const RowUser * r) const;
- void finish(const RowUser * r) const;
virtual RowAttribute resolveAttr(const Glib::ustring & attrName) const;
static const RowValuesStack & Stack() { return stack; }
static void beginRow(const RowSet * r);
static void endRow(const RowSet * r);
- void rowChanged() const;
protected:
mutable unsigned long int rowNum;
private:
static RowValuesStack stack;
- mutable std::set<const RowUser *> rowUsers;
};
#endif
diff --git a/project2/rowUser.cpp b/project2/rowUser.cpp
deleted file mode 100644
index 2557af1..0000000
--- a/project2/rowUser.cpp
+++ /dev/null
@@ -1,10 +0,0 @@
-#include "rowUser.h"
-
-RowUser::RowUser()
-{
-}
-
-RowUser::~RowUser()
-{
-}
-
diff --git a/project2/rowUser.h b/project2/rowUser.h
deleted file mode 100644
index 9597807..0000000
--- a/project2/rowUser.h
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef ROWUSER_H
-#define ROWUSER_H
-
-class RowUser {
- public:
- RowUser();
- virtual ~RowUser() = 0;
-
- virtual void rowChanged() const = 0;
-};
-
-#endif
-
diff --git a/project2/rowView.cpp b/project2/rowView.cpp
index cdbe071..8e22c4b 100644
--- a/project2/rowView.cpp
+++ b/project2/rowView.cpp
@@ -51,7 +51,6 @@ RowView::rowReady() const
}
}
executeChildren();
- source->rowChanged();
presenter->popSub();
}
diff --git a/project2/variables-modconfig.cpp b/project2/variables-modconfig.cpp
index 935e2d6..88fddd4 100644
--- a/project2/variables-modconfig.cpp
+++ b/project2/variables-modconfig.cpp
@@ -11,13 +11,9 @@ class VariableConfig : public VariableImplDyn {
name(e->get_attribute_value("name"))
{
}
- const VariableType & value() const
+ VariableType value() const
{
- if (!cacheValid) {
- cache = ApplicationEngine::getCurrent()->getCurrentConfig()->getValue(name);
- cacheValid = true;
- }
- return cache;
+ return ApplicationEngine::getCurrent()->getCurrentConfig()->getValue(name);
}
private:
const Glib::ustring name;
diff --git a/project2/variables-modlookup.cpp b/project2/variables-modlookup.cpp
index e020d9a..24c4167 100644
--- a/project2/variables-modlookup.cpp
+++ b/project2/variables-modlookup.cpp
@@ -64,7 +64,7 @@ class VariableLookup : public VariableImplDyn, public RowProcessor {
loader.supportedStorers.insert(Storer::into(&rowSets));
loader.collectAll(e, false);
}
- const VariableType & value() const
+ VariableType value() const
{
if (map.empty()) {
fillCache();
@@ -76,8 +76,7 @@ class VariableLookup : public VariableImplDyn, public RowProcessor {
}
Map::const_iterator i = map.find(k);
if (i != map.end()) {
- cache = i->second;
- return cache;
+ return i->second;
}
throw NotFound();
}
diff --git a/project2/variables-modparam.cpp b/project2/variables-modparam.cpp
index a932412..0b205db 100644
--- a/project2/variables-modparam.cpp
+++ b/project2/variables-modparam.cpp
@@ -11,21 +11,17 @@ class VariableParam : public VariableImplDyn {
name(e->get_attribute_value("name"))
{
}
- const VariableType & value() const
+ VariableType value() const
{
- if (!cacheValid) {
- try {
- cache = ApplicationEngine::getCurrent()->env()->getParamQuery(name);
- }
- catch (ParamNotFound) {
- if (!defaultValue) {
- throw;
- }
- cache = (*defaultValue)();
+ try {
+ return ApplicationEngine::getCurrent()->env()->getParamQuery(name);
+ }
+ catch (ParamNotFound) {
+ if (!defaultValue) {
+ throw;
}
- cacheValid = true;
+ return (*defaultValue)();
}
- return cache;
}
private:
const Glib::ustring name;
diff --git a/project2/variables-modsession.cpp b/project2/variables-modsession.cpp
index 0d39695..963a105 100644
--- a/project2/variables-modsession.cpp
+++ b/project2/variables-modsession.cpp
@@ -11,18 +11,17 @@ class VariableSession : public VariableImplDyn {
name(e->get_attribute_value("name"))
{
}
- const VariableType & value() const
+ VariableType value() const
{
try {
- cache = ApplicationEngine::getCurrent()->session()->GetValue(name);
+ return ApplicationEngine::getCurrent()->session()->GetValue(name);
}
catch (Session::VariableNotFound) {
if (!defaultValue) {
throw;
}
- cache = (*defaultValue)();
+ return (*defaultValue)();
}
- return cache;
}
private:
const Glib::ustring name;
diff --git a/project2/variables-moduri.cpp b/project2/variables-moduri.cpp
index f6793e1..00fb7bf 100644
--- a/project2/variables-moduri.cpp
+++ b/project2/variables-moduri.cpp
@@ -11,21 +11,17 @@ class VariableUri : public VariableImplDyn {
index(atoi(e->get_attribute_value("index").c_str()))
{
}
- const VariableType & value() const
+ VariableType value() const
{
- if (!cacheValid) {
- try {
- cache = ApplicationEngine::getCurrent()->env()->getParamUri(index);
- }
- catch (UriElementOutOfRange) {
- if (!defaultValue) {
- throw;
- }
- cache = (*defaultValue)();
+ try {
+ return ApplicationEngine::getCurrent()->env()->getParamUri(index);
+ }
+ catch (UriElementOutOfRange) {
+ if (!defaultValue) {
+ throw;
}
- cacheValid = true;
+ return (*defaultValue)();
}
- return cache;
}
private:
unsigned int index;
diff --git a/project2/variables.cpp b/project2/variables.cpp
index 4e18fc0..516e187 100644
--- a/project2/variables.cpp
+++ b/project2/variables.cpp
@@ -4,7 +4,6 @@
#include "exceptions.h"
#include "appEngine.h"
#include "session.h"
-#include "rowUser.h"
#include "rowSet.h"
#include <libxml++/nodes/textnode.h>
#include <stdexcept>
@@ -132,117 +131,79 @@ class VariableLiteral : public VariableImpl {
}
}
- virtual const VariableType & value() const { return val; }
+ virtual VariableType value() const { return val; }
private:
VariableType val;
};
DECLARE_COMPONENT_LOADER("literal", VariableLiteral, VariableLoader);
DECLARE_CUSTOM_COMPONENT_LOADER("", VariableLiteralDef, VariableLoaderImpl<VariableLiteral>, VariableLoader);
-VariableImplDyn::VariableImplDyn(const xmlpp::Element * e) :
- cacheValid(false)
+VariableImplDyn::VariableImplDyn(const xmlpp::Element * e)
{
- try {
- if (e) {
- defaultValue = Variable(e, "default");
- }
- }
- catch (NoVariableDefinition) {
- // That's cool... no default
+ if (e) {
+ defaultValue = Variable(e, "default", false);
}
}
-static void assignHelper(VariableType & dest, const VariableType & src) {
- dest = src;
-}
-
/// Variable implementation to access fields in row sets
-class VariableParent : public VariableImplDyn, public RowUser {
+class VariableParent : public VariableImplDyn {
public:
- VariableParent(const xmlpp::Element * e, const RowUser * d = NULL) :
+ VariableParent(const xmlpp::Element * e) :
VariableImplDyn(e),
- row(NULL),
depth(atoi(e->get_attribute_value("depth").c_str())),
attr(e->get_attribute("attribute")),
- name(attr ? e->get_attribute_value("attribute") : e->get_attribute_value("name")),
- dep(d)
+ name(attr ? e->get_attribute_value("attribute") : e->get_attribute_value("name"))
{
}
VariableParent(const Glib::ustring & n, bool a, unsigned int d) :
VariableImplDyn(NULL),
- row(NULL),
depth(d),
attr(a),
- name(n),
- dep(NULL)
+ name(n)
{
}
- ~VariableParent()
- {
- if (row) {
- row->finish(this);
- if (dep) {
- row->finish(dep);
- }
- }
- }
- const VariableType & value() const
+ VariableType value() const
{
- if (!cacheValid) {
- try {
- if (!row) {
- RowSet::RowValuesStack::const_reverse_iterator r = RowSet::Stack().rbegin();
- for (size_t p = depth; p--; r++) ;
- if (r == RowSet::Stack().rend()) {
- throw RowSet::ParentOutOfRange(depth);
- }
- row = *r;
- row->use(this);
- if (dep) {
- row->use(dep);
- }
- bind();
+ try {
+ if (!getValue) {
+ RowSet::RowValuesStack::const_reverse_iterator r = RowSet::Stack().rbegin();
+ for (size_t p = depth; p--; r++) ;
+ if (r == RowSet::Stack().rend()) {
+ throw RowSet::ParentOutOfRange(depth);
}
- getValue(cache, row);
+ ;
+ bind(*r);
}
- catch (RowSet::ParentOutOfRange) {
- if (!defaultValue) {
- throw;
- }
- cache = (*defaultValue)();
+ return getValue();
+ }
+ catch (RowSet::ParentOutOfRange) {
+ if (!defaultValue) {
+ throw;
}
- catch (RowSet::FieldDoesNotExist) {
- if (!defaultValue) {
- throw;
- }
- cache = (*defaultValue)();
+ return (*defaultValue)();
+ }
+ catch (RowSet::FieldDoesNotExist) {
+ if (!defaultValue) {
+ throw;
}
- cacheValid = true;
+ return (*defaultValue)();
}
- return cache;
- }
- void rowChanged() const
- {
- cacheValid = false;
}
protected:
- void bind() const
+ void bind(ConstRowSetPtr row) const
{
if (attr) {
- getValue = boost::bind(&assignHelper, _1, boost::bind(row->resolveAttr(name)));
+ getValue = boost::bind(row->resolveAttr(name));
}
else {
typedef VariableType (RowSet::*gCV)(const Glib::ustring &) const;
- getValue = boost::bind(&assignHelper, _1,
- boost::bind((gCV)&RowSet::getCurrentValue, _2, name));
+ getValue = boost::bind((gCV)&RowSet::getCurrentValue, row, name);
}
}
- mutable ConstRowSetPtr row;
const size_t depth;
const bool attr;
const Glib::ustring name;
- const RowUser * dep;
- mutable boost::function2<void, VariableType &, ConstRowSetPtr> getValue;
+ mutable boost::function0<VariableType> getValue;
};
DECLARE_COMPONENT_LOADER("parent", VariableParent, VariableLoader);
@@ -253,7 +214,7 @@ class VariableFixed : public VariableImpl {
var(v)
{
}
- const VariableType & value() const
+ VariableType value() const
{
return var;
}
diff --git a/project2/variables.h b/project2/variables.h
index 92aac4b..a22ebf4 100644
--- a/project2/variables.h
+++ b/project2/variables.h
@@ -13,7 +13,6 @@
#include <boost/variant.hpp>
#include <boost/shared_ptr.hpp>
-class RowUser;
class Null { };
typedef boost::variant<
Null,
@@ -63,7 +62,7 @@ class VariableType : public _VT {
/// Base class for Project2 variable accessors
class VariableImpl : public IntrusivePtrBase {
public:
- virtual const VariableType & value() const = 0;
+ virtual VariableType value() const = 0;
protected:
virtual ~VariableImpl() = 0;
@@ -79,13 +78,13 @@ class Variable {
static Variable makeFromCode(const Glib::ustring & s);
static Variable makeParent(const Glib::ustring & name, bool attr, unsigned int depth);
- operator const VariableType & () const { return var->value(); }
- const VariableType & operator()() const { return var->value(); }
+ operator VariableType () const { return var->value(); }
+ VariableType operator()() const { return var->value(); }
private:
Variable(VariableImpl *);
friend class VariableParse;
- static VariableImplPtr create(const Glib::ustring & s, RowUser * dep = NULL);
+ static VariableImplPtr create(const Glib::ustring & s);
VariableImplPtr var;
};
@@ -93,11 +92,9 @@ class Variable {
class VariableImplDyn : public VariableImpl {
public:
VariableImplDyn(const xmlpp::Element * e);
- virtual const VariableType & value() const = 0;
+ virtual VariableType value() const = 0;
protected:
- mutable VariableType cache;
- mutable bool cacheValid;
boost::optional<Variable> defaultValue;
};
diff --git a/project2/xslRows.cpp b/project2/xslRows.cpp
index 9c4ce98..999f196 100644
--- a/project2/xslRows.cpp
+++ b/project2/xslRows.cpp
@@ -98,11 +98,12 @@ XslRows::execute(const RowProcessor * rp) const
xpathCtx->node = rowRoot;
values.clear();
BOOST_FOREACH(const FilterView::XPaths::value_type & xp, fv->xpaths) {
- if (boost::get<Null>(&xp.second())) {
+ VariableType path(xp.second());
+ if (boost::get<Null>(&path)) {
values[xp.first] = Null();
continue;
}
- xmlXPathObjectSPtr xpathObjI = xmlXPathObjectSPtr(xmlXPathEvalExpression(xp.second(), xpathCtx.get()), xmlXPathFreeObject);
+ xmlXPathObjectSPtr xpathObjI = xmlXPathObjectSPtr(xmlXPathEvalExpression(path, xpathCtx.get()), xmlXPathFreeObject);
if (!xpathObjI) {
throw XpathEvalError(xmlGetLastError()->message);
}